ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

docker gitlab版本管理和CI/CD 自动部署go

2022-05-05 13:00:48  阅读:206  来源: 互联网

标签:CI runner gitlab CD -- job build docker


一、docker中安装gitlab

#先拉取镜像
docker pull gitlab/gitlab-ce:latest

#运行镜像
docker run -d -p 443:443 -p 80-100:80-100 -p 22:22  --name gitlab  --restart always   --v D:/docker/gitlab/config:/etc/gitlab  -v D:/docker/gitlab/logs:/var/log/gitlab   --v D:/docker/gitlab/data:/var/opt/gitlab  gitlab/gitlab-ce:latest

# 22端口对应的是 ssh  80-100表示80-100之间的所有端口
# -d:后台运行
# -p:将容器内部端口向外映射
# --name:命名容器名称
# -restart always 表示一直开机启动,docker启动就会启动
# -v:将容器内目录挂载到宿主机指定目录

  安装成功后,打开浏览器输入本地IP即可打开页面

    管理员默认是root,第一次登陆的时候需要设置密码

  进入容器内部

 docker exec -it gitlab /bin/bash

  然后输入命令

gitlab-rails console

  

  弹出 Loading production environment 后,在下面逐步输入:

1、【user=User.where(id:1).first】 查出指定修改的用户,1 为root

2、【user.password='abc123456'】 需要设置的密码

3、【user.password_confirmation='abc123456'】  确认上面输入的密码

4、【user.save!】 保存

  

  有了账号登陆进去后,可以在右上角设置里面设置成中文界面。别的用户想要登录,直接页面注册,然后后台审核用户就行。

   新建一个群组,把用户添加进组里面,新建一个git项目指定给某个群组

  额外配置

  gitlab创建项目的时候,默认的git地址是容器本机的IP地址,可以改成一个虚拟主机,修改配置文件 D:\docker\gitlab\config\gitlab.rb 里面的 external_url

external_url 'http://git.xxx.com'

  重启gitlab

#在gitlab内部重启加载配置
gitlab-ctl reconfigure
gitlab-ctl  restart

  

二、安装gitlab-runner CI/CD自动部署

持续集成 CI(Continuous Integration):在源代码变更后,触发自动检测、构建和测试的过程。在代码提交后,会自动进行构建和测试,并反馈结果。当结果符合预期时,再将代码集成到主干。持续集成的目标是快速确保当前变更是可用的。

持续交付 CD(Continuous Delivery):是基于持续集成基础上,将集成后的代码自动化部署到各个环境测试,确定可以发布生产版本。

持续部署 CD(Continuous Deployment):是基于持续交付的基础上,将在各个环境经过测试的应用自动化部署到生产环境。其实各个环境的发布过程都是一样的。应用发布到生产环境后,我们需要对应用进行健康检查、添加应用的监控项、 应用日志管理。

 

1. 安装并运行gitlab-runner

GiTLab Runner是一个脚本运行器,类似于Jenkins,可以为我们执行一些CI持续集成、构建的脚本任务(即.gitlab-ci.yml),运行器具有执行脚本、调度、协调的工作能力。

#拉去镜像
gitlab/gitlab-runner:latest

#运行容器
docker run -d --name gitlab-runner --restart always  -v D:/docker/gitlab/gitlab-runner/config:/etc/gitlab-runner  -v /var/run/docker.sock:/var/run/docker.sock  gitlab/gitlab-runner:latest  

映射/var/run/docker.sock这个文件是为了让容器可以通过/var/run/docker.sockDocker守护进程通信,管理其他Docker容器,因为docker daemon进程默认监听的是/var/run/docker.sock这个文件,所以docker客户端只要把请求命令发往这里,daemon就能收到并且做出响应。这个命令将外部docker客户端的/var/run/docker.sock映射给了内部docker客户端,使内部docker客户端也可以访问外部的docker daemon服务。否则后面注册如果选择了docker作为执行器时,因为是docker-in-docker模式,内部的docker将无法启动。

  -v D:/docker/gitlab/gitlab-runner/config:/etc/gitlab-runner 是将runner的配置文件映射到宿主机/home/gitlab-runner/config方便调整和查看配置

安装完成我们需要去注册Gitlab-Runner。

2. 将gitlab项目或组注册到gitlab-runner

打开gitlab后台某个项目里面的设置,打开runner,获取配置信息

  开始注册runner
#首先进入runner容器
docker exec -it gitlab-runner bash

#开始注册
gitlab-runner register -n  --url https://gitlab.com/  --registration-token REGISTRATION_TOKEN  --executor docker   --description "My Docker Runner"  --docker-image "docker:19.03.12"  --docker-privileged   --docker-volumes "/certs/client"

#url:后台设置里面的url
#token:后台设置里面的token
#executer:使用docker
#docker-image:docker镜像,一定要使用19.03.12的版本

  执行成功后,查看一下生成出来的配置文件,在目录  D:/docker/gitlab/gitlab-runner/config 下的config.toml

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "d25fbd515fd7"
  url = "http://192.168.1.106/"
  token = "osaKgBGS7yausc5t4KTg"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "docker:19.03.12"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache","/certs/client"]
    shm_size = 0
   pull_policy="if-not-present"  #选择优先使用本地缓存的镜像还是拉取最新的镜像,官方有比较详细的解释。默认为always,在断网或者想要加快ci执行的速度时貌似可以设置if-not-present。

  上面配置完成之后,打开后台设置CI/CD就可以看见一个可用的runner了

 

 三、在项目根目录创建一个runner执行文件

配置好runner后,我们把这个项目使用git拉下来本地,然后在项目根目录创建两个文件,一个是  【.gitlab-ci.yml】,一个是【Dockerfile】

.gitlab-ci.yml

打包运行一个go语言的项目
image: golang:1.18.1

stages: # 分段
  - build
  - deploy

cache: # 缓存
  paths:
    - dist

variables:
  DOCKER_TLS_CERTDIR: "/certs"
  

job_build:
  tags:
    - go
  stage: build
  script:
    - go env -w GOPROXY=https://goproxy.cn,direct
    - go build -o dist/main
    - ls -l
    - pwd

job_deploy:
  tags:
    - go
  image: docker:19.03.12
  only:
    - develop 
  services:
    - docker:19.03.12-dind
  stage: deploy
  script:
    - docker build -t goproject .
    - if [ $(docker ps -aq --filter name=goapp) ]; then docker rm -f goapp;fi   #如果存在运行的容器则删除重建
    - docker run -e TZ="Asia/Shanghai" -d -p 980:80 --name goapp goproject
打包运行一个node项目
image: node:16.14

stages: # 分段
  - install
  - build
  - deploy

cache: # 缓存
  paths:
    - node_modules
    - dist

variables:
  DOCKER_TLS_CERTDIR: "/certs"
  

job_install:
  tags:
    - web
  stage: install
  script:
    - npm install vue --save
    - npm install vue-router
    - npm install

job_build:
  tags:
    - web
  stage: build
  script:
    - npm install vue --save
    - npm install vue-router
    - npm run build

job_deploy:
  tags:
    - web 
  image: docker:19.03.12
  only:
    - develop 
  services:
    - docker:19.03.12-dind
  stage: deploy
  environment:
    name: web_test
    url: http://192.168.1.106:8080/
  script:
    - docker build -t appimages .
    - if [ $(docker ps -aq --filter name=app-container) ]; then docker rm -f app-container;fi
    - docker run -d -p 8880:80 -p 8080:8080 --name app-container appimages
参数说明  
stages
  例子中 stages 值为一个数组(p.s. 用 - 代表数组和 markdown 类似)。包含了三个 job,test, build, deploy分别实现自动测试,打包项目和部署。下方的 stage 必须在全局定义的 stages 内。
variables
  值为键值对象,为了后续的流程,此处定义了开发项目和部署项目的 namespace 和 repo_name。同 shell 类似,后续使用其值需要加上 $ 符号。定义的变量也有对应的作用域,定义在顶层就可以作为全局变量供所有 job 使用,如果是一些 job 特有的变量,就定义在 job 内部。
before_script
  值为数组,每一个元素其实就是一个 linux 命令,写的时候装作自己在写 shell 就好。该部分主要生成了后续构建需要的镜像标签,切换当前目录等。为了 debug 方便,这些变量最好打印。类似的,如果在 job 完成后有一些时候操作,可以定义 after_script。需要注意的是如果定义在顶层,内部的命令会在每个 job 运行之前执行,如果某些 job 需要特别的预操作,可以在 job 内部再配置一个 before_script 对象,它会复写外部的全局预操作。
test_stage
  名为 test 的 job 的具体配置,一般是个复合对象。
cache
  保留上一阶段的文件数据 stage   job 对应的 stage,如果有多个 job 对应同一个 stage,在执行时会并行执行这些 job。 script   这个 job 执行的命令,此处是进入的项目仓库目录,并且执行了一个 shell 脚本,这个脚本定义了执行项目的所有单元测试。一般建议如果要执行的命令过多,就把这些命令写成脚本放在项目内。CICD 流程直接执行这个脚本。 build_stage   该步骤在测试通过的基础上,把项目编译打包,方便后续部署。 tag   用来选择该标签对应的注册runner的实例,可以在gitlab后台设置指定 only   only 指明了 job 的执行场景,可以是分支名,表明只有 master 分支可以执行 build,如果要用排除法反向指定,可以用 except。 

Dockefile文件

FROM golang:1.18.1  #拉取一个镜像
EXPOSE 8080 80  #对外暴露端口
WORKDIR /go/   #定义工作目录,没有则创建
COPY . /go/    #复制文件
COPY dist/main main   
CMD ./main  容器启动后执行命令

  

4、git commit、push 提交代码查看结果

 

打开docker ps查看也会发现有一个容器在运行,后续每次提交都会自动构建发布,一个简单的CI/CD就完成了

标签:CI,runner,gitlab,CD,--,job,build,docker
来源: https://www.cnblogs.com/pangxiaox/p/16224339.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有