Gitlab CI/CD可以按照规定的步骤实现从代码编译、代码测试、构建镜像、代码发布等整个过程,这一系列步骤通过在 “.gitlab-ci.yml” 文件中编写设计,通过Gitlab Runner来执行。
这里以构建Beego项目镜像为例实现Go项目构建镜像推送到内部Harbor
1、 项目目录下(main.go文件同级目录)创建.gitlab-ci.yml和Dockerfile文件;
2、按照个人设计思路编辑上述创建的文件
Dokerfile示例:
FROM “仓库地址”/base/centos:7.9 #这里使用了自己构建的centos基础镜像
ENV LANG en_US.utf8
#拷贝Beego可执行文件
COPY ["go_pro", "/opt/go_pro"]
#拷贝Beego项目依赖文件,这里需要注意:拷贝目录时,不包含目录本身
COPY ["conf/app.conf", "/opt/conf/"]
COPY ["file", "/opt/file/"]
COPY ["key", "/opt/key/"]
COPY ["shell", "/opt/shell/"]
COPY ["static", "/opt/static/"]
COPY ["swagger", "/opt/swagger/"]
COPY ["views", "/opt/views/"]
EXPOSE 8080 #暴露项目服务端口
CMD cd /opt/ && ./go_pro #启动容器时执行的命令
.gitlab-ci.yml示例:
# Go project
stages:
- build
# - deploy
# 构建任务计划运行之前执行的shell命令
before_script:
- export GOPATH="/project"
- export TAG=`date +%s` #设置镜像tag号
- mkdir -p /project/src/
- cp -r $CI_PROJECT_DIR /project/src/ #拷贝Gitlab上的项目文件到执行目录
- cd /project/src/go_pro
go:build:
stage: build
tags:
- gitlab-runner #执行任务的Gitlab Runner的标签
image: harbor/base/go_docker:1.15.6 #依赖自定义Docker镜像来执行构建任务
only: #打tag推送代码或者web页面手动触发开始业务作业
- tags
- web
script:
- /go/bin/go build #编译生成Go项目可执行文件
- docker build --tag harbor/go/go_pro:$TAG . #打包镜像
- docker push harbor/go/go_pro:$TAG #推送镜像到镜像仓库
完成编写后,Push代码到Gitlab将自动生成作业任务完成打包编译镜像及推送镜像到harbor的过程
可以通过添加设置来控制作业任务的执行条件,Gitlab CI/CD配置官网参考地址:
https://docs.gitlab.com/ce/ci/yaml/README.html
3、 注意事项
3.1 .gitlab-ci.yml文件中引用的Runner tags 必须和注册Runner时填写的Tags保持一致,否则Gitlab CI的计划任务会一致处于阻塞状态;
3.2 注册Runner选用Docker类型的executor时,修改配置文件,将volumes = ["/cache"]修改为volumes = ["/cache", “/var/run/docker.sock:/var/run/docker.sock”] 实现引用Runner容器宿主机本地的Docker环境;
3.3 Go 项目依赖第三方包 有些通过go get命令无法下载,需要单独拷贝到容器中,这里通过打包基础镜像go_docker 包含构建过程所需的Go 环境及依赖的第三方包来解决;
4、 问题记录
4.1 ERROR: Failed to remove network for build
原因:启动runner时未将本地docker.sock文件挂载到容器,容器中无法调用宿主机docker环境;
解决:修改启动命令,例如:
docker run -d --name fitlab-runner --restart always
-v /opt/gitlab_runner/config:/etc/gitlab-runner
-v /var/run/docker.sock:/var/run/docker.sock gitlab-runner:13.6.1
参考地址:https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/
4.2 Cannot connect to the Docker daemon at unix:/var/run/docker.sock.
原因:Gitlab Runner任务作业中调用的镜像无Docker环境,也无法调用宿主机的Docker;
解决:参照3.2步骤修改Runner配置, 重启Runner 容器;