docker gitlab版本管理和CI/CD 自动部署go
一、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.sock
与Docker
守护进程通信,管理其他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就完成了