gitlab-runner+docker实现自动化部署流水线
为什么使用gitlab-runner?
1、我们所有工程代码都托管于gitlab私服
2、在基于gitab下就算选择Jenkins也是需要配置runner作为触发入口
基于前面两点。我们选择直接使用gitlab-runner进行cicd。
目的:
1、较为简单化的配置
2、所有构建操作容器化,构建完成即销毁,避免危险命令
GitLab-Runner
1、实现原理
部署细节
1、 环境准备
序号 | 系统 | ip | 服务 |
1 | Centos7 | 192.168.31.11 | gitlab-14.8.2 |
2 | Centos7 | 192.168.31.140 | gitlab-runner-9.5.1、docker-19.03.11 |
3 | Centos7 | 192.168.31.141 | docker-19.03.11 |
2、安装服务
2.1、安装gitlab
2.2、安装docker
2.3、安装runner
runner我们选择装直接装在宿主机上,不推荐装在docker里
添加源
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
安装runner
yum install gitlab-ci-multi-runner
注册runner
sudo gitlab-runner register -n --url http://192.168.31.11/ --registration-token GR1348941MTY5GcLRdXbiRRcKBE7b --executor docker --description "My Docker Runner" --docker-image "docker:19.03.12" --docker-privileged --docker-volumes "/certs/client"
向GitLab-CI注册一个Runner需要两样东西:GitLab-CI的url和注册token。其中,token是为了确定你这个Runner是所有工程都能够使用的Shared Runner还是具体某一个工程才能使用的Specific Runner。
注册时除却token和url外还需要输入一些参数
register gitlab地址
registration-token 密钥
executor 执行器(可以选择docker、Linux等)
description runner描述
docker-image docker镜像
。。。。
可查看runner配置详解
执行器种类 :
执行完成注册命令后会在/etc/gitlab-runner/下生成config.toml文件,更多自定义配置可自行在文件里添加。
注册完成后可在项目的cicd runner界面看到注册好的runner
点击runner的修改按钮,根据自身需要选择是否勾线受保护的分支
3、编写ci文件
在项目根目录下添加gitlat-ci.yml文件。ci文件参考(maven工程):
#添加docker服务并指定私服地址
services:
- name: docker:19.03.12-dind
command: ["--insecure-registry=192.168.31.10:8083"]
#docker服务启动参数
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
#流水线阶段
stages:
- maven-build
- docker-build
- deploy
#maven 打包
maven-build:
stage: maven-build
image: maven:3.5.0-jdk-8
script:
- mvn package -B -Dmaven.test.skip=true
artifacts:
paths:
- target/$jar_name
#打包成docker镜像并上传
job_build:
stage: docker-build
before_script:
#设置登录认证
- mkdir -p $HOME/.docker
- echo $DOCKER_AUTH_CONFIG > $HOME/.docker/config.json
script:
# 通过Dockerfile生成镜像1
- docker build -t cicdtest .
# 以流水线id给镜像打tag
- docker tag cicdtest $NEXUS_IP/cicdtest:$CI_PIPELINE_ID
#上传镜像
#- docker login -u $NEXUS_USER -p $NEXUS_PWD $NEXUS_IP
- docker push $NEXUS_IP/cicdtest:$CI_PIPELINE_ID
#通过脚本拉取镜像并容器化启动镜像
job_deploy:
stage: deploy
script:
#执行脚本
- sh /home/script/job_deploy.sh $APPLICATION_IP $NEXUS_USER $NEXUS_PWD $NEXUS_IP $APP_NAME $CI_PIPELINE_ID 8080
only:
- main
文件中定义了一些公共参数,通过gitlab管理员账号在设置→CICD→变量中添加
当然runner也有一些内置参数比如CI_PIPELINE_ID(流水线编号),更多参数请参考: runner参数的使用。
至此就可以使用runner进行cicd测试啦。
部署历程
1、准备部署环境 gitlab服务器、runner服务器、应用服务器
2、安装并注册runner
3、编写项目ci文件
部署中遇到的问题及解决方案
1、ci文件传参问题
需要传参的脚本中不能以单引号包裹,否则会视为字符串
services:command不能使用变量,(目前还没找到解决方案)
2、docker in docker 问题
因为需要做到构建隔离及构建中使用docker命令,所以采用docker in docker模式
实现docker in docker 一般为两种方式:
1、通过在runner配置文件config.toml中的runners.docker下配置volumes参数将宿主机 docker.sock 文件挂载到容器,实现容器内 docker 操作宿主机 docker 的目的。
2、使用docker-dind镜像
这里我们使用第二种方式 ,因为第一种方式违背了我构建操作完全隔离的诉求。
注:docker-dind需要与配置中使用的docker进行版本一致
3、私服镜像及maven私包拉取问题
发现使用的公共docker镜像拉不到私服上的镜像及私包,所以我做了一下的尝试,手动启动一个docker-dind镜像,进入容器进行私服配置,之后再把该容器打成私有镜像,随后在runner的services里面进行指定。发现这样根本不行QAQ!
正确的方法应该是:
docker私服指定通过services:command指定私服地址。
maven和npm直接把配置文件挂载进容器进行指定。
参考文档
更多推荐
所有评论(0)