Gitlab CI/CD可以按照规定的步骤实现从代码编译、代码测试、构建镜像、代码发布等整个过程,这一系列步骤通过在 “.gitlab-ci.yml” 文件中编写设计,通过Gitlab Runner来执行。

这里以构建Beego项目镜像为例实现Go项目构建镜像推送到内部Harbor

1、 项目目录下(main.go文件同级目录)创建.gitlab-ci.yml和Dockerfile文件;

Docker打包前端工程 docker打包go项目_Docker打包前端工程


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的过程

Docker打包前端工程 docker打包go项目_CI_02


可以通过添加设置来控制作业任务的执行条件,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 容器;