GitLabCI-CD示例
还有一种自动化是使用[[../自动化/JenkinsHudson使用Maven构建war包]]
[[GitLab介绍]] CI/CD [[GitLab介绍#CI CD]] 类似Jenkins,可以用于自动构建、发布项目 流程:
1、安装GitLab、GitLab Runner [[GitLab介绍#GitLab Runner]]
2、将runner注册到GitLab上
3、在项目中添加.gitlab-ci.yml文件,指定构建工作的具体事务
需要的套件:GitLab、GitLab Runner
环境安装:
GitLab的安装参考上一篇文档[[GitLab安装记录]]
GitLab Runner安装
rpm安装:
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
yum install -y gitlab-runnergitlab-runner配置文件
vi /etc/gitlab-runner/config.toml配置文件内容内容描述
concurrent = 10 # 同时进行作业的数量,默认为1
check_interval = 1 # 检查是否有新作业的间隔时间(秒)
[session_server]
session_timeout = 1800
[[runners]] # 添加runner后会自动生成的内容
name = "git server runner" # 本runner的描述
url = "http://git2.jiaparts.com/" # gitlab服务器地址
token = "一串长度为20的字符串" # 在gitlab上生成的api访问token,代替gitlab用户的密码
executor = "ssh" # 连接到runner机器的方式
builds_dir = "/jpdata/backup/gitlabrunner/" # runner作业的临时目录,默认在用户目录下
[runners.custom_build_dir]
[runners.ssh] # 对应上面executor的配置
user = "root" # 到runner机器的用户
host = "1.1.1.1" # runner的IP
port = "22" # runner SSH 端口
identity_file = "/home/gitlab-runner/.ssh/id_rsa" # 通过私钥登录到runner服务器,以免输入密码
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]docker安装:
docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latestGitLab Runner注册
GitLab Runner类型分以下几种
实例 Runner:全局范围,适用于所有项目和群组。
群组 Runner:群组范围,适用于特定群组下的所有项目。
项目 Runner:项目范围,适用于特定项目。
如果不需要做细分,推荐用以实例类型注册Runner,就是在GitLab的管理中心注册,可以全局共用。 如果是群组内使用,例如PHP JAVA项目需要不同的环境,可以在对应的群组管理界面注册群组Runner。 单独为项目注册Runner,我的理解是用在特殊的环境要求下才会考虑,例如项目的编译系统要求比较特殊,可以考虑注册一个单独的Runner
注册时需要gitlab提供两个信息,一个是URL,一个是TOKEN,在gitlab上的如下位置可以找到 
gitlab-runner 注册
rum安装注册,直接运行如下命令,然后按提示输入相关信息
gitlab-runner registerdocker安装的runner则需要通过如下命令,启动一个容器来进行注册,其它操作相同
docker run --rm -t -i -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register注册完成之后就能在刚才查看runner信息的地方看到已经连接成功的runner
.GitLab-ci.yml示例
在项目的根目录下添加.gitlab-ci.yml文件,内容大致如下 ^340752
# 配置变量
variables:
project_name: "project_name"
image_name: "image_name"
docker_build: "images.domain.com/path"
docker_name: "container_name"
docker_env: "namespaces_name"
docker_deploy: "k8s_deployment_file.yaml"
# 定义一个锚,方便后面重复调用下面命令
.job_template: &job_definition
# 在作业前执行的命令
before_script:
- pwd && ls -al # 查看当前工作目录
- rsync -av config/$project_name/* $project_name # 将项目的配置文件单独列了出来,不同环境使用不同内容的配置文件,这里同步相应环境的配置文件到项目中
- echo `/bin/date +%Y%m%d%H%M` >> $project_name/ver.txt # 将当前系统时间写入项目下的ver.txt文件
- docker build -f docker/Dockerfile -t $docker_build/$image_name:`sed -n '1p' ${project_name}/ver.txt`-`sed -n '2p' ${project_name}/ver.txt` . # 通过在docker目录下的Dockerfile来构建新镜像,并指定新镜像的名称和标签信息
- docker push $docker_build/$image_name:`sed -n '1p' ${project_name}/ver.txt`-`sed -n '2p' ${project_name}/ver.txt` # 将构建好的新镜像推送到镜像仓库
- docker rmi -f $docker_build/$image_name:`sed -n '1p' ${project_name}/ver.txt`-`sed -n '2p' ${project_name}/ver.txt` # 删除runner上构建的镜像,减少空间占用
- docker images # 查看runner上镜像列表
# 定义脚本步骤
stages:
- build
- deploy
- cleanup
# 定义build步骤内容
build:
stage: build
# 引用之前定义的锚
<<: *job_definition
# 定义build中其它要执行的命令
script:
- pwd && ls -al
# 定义何时开始job。可以是on_success(仅成功),on_failure(仅失败),always(总是)或者manual(手动)
when: manual
deploy:
stage: deploy
environment:
name: pro # 环境描述,在运行CI脚本时,会提示部署到什么什么,这里写的是pro,就提示部署到pro。用于做环境识别,影响不大。
<<: *job_definition
script:
- pwd && ls -al
- cat $project_name/ver.txt
- sed -i "s#${docker_build}.*#${docker_build}\/${image_name}:`sed -n '1p' ${project_name}/ver.txt`-`sed -n '2p' ${project_name}/ver.txt`#g" docker/$docker_deploy # 通过sed命令将新构建的镜像名称替换到k8s_deployment.yaml中
- cat docker/$docker_deploy # 查看k8s_deployment.yaml文件内容
# 在作业后执行的命令
after_script:
- kubectl apply -f docker/$docker_deploy --record=true # 通过k8s_deployment.yaml文件来部署,这里用的是apply,也可以create,两者的区别是前者只重新部署yaml文件中有变化的pod、svc、ingress等,没变化的不会重新创建;后者是全新创建所有yaml中的服务,如果有则报已存在的错误无法创建。
- kubectl get pods -n $docker_env -o wide | grep $docker_name # 查看pod重新部署情况
when: manual
delete: # 停止服务时,通过kubectl delete -f yaml_file 文件来删除所有的pod、svc、ingress等。
stage: deploy
environment:
name: pro
script:
- pwd && ls -al docker
- kubectl delete -f docker/$docker_deploy
- kubectl get pods -n $docker_env -o wide | grep $docker_name
only:
- master
when: manual
cleanup_job:
stage: cleanup
script:
- pwd && ls -al
when: always
定义完在项目中启用Auto DevOps,指定要使用的runner即可

流水线计划条件配置入口 
gitlab pages,需要配置runner
pages_external_url "http://dier.xyz/" # 同时配置dier.xyz域名的DNS解析,添加一个*主机的泛解析即可
gitlab_pages['enable'] = trueDocker容器的其他配置,如果以容器运行gitlab。必须修改如下配置,不然会导致访问pages时一直提示502网关错误 GitLab Pages守护程序在Docker容器中运行时无权绑定挂载。要解决此问题,您需要更改chroot行为:
编辑/etc/gitlab/gitlab.rb。 设置inplace_chroot到true为GitLab页数:
gitlab_pages['inplace_chroot'] = truegitlab-runner 报如下错误,是git版本太低导致
Reinitialized existing Git repository in ///.git/ fatal: git fetch-pack: expected shallow list fatal: The remote end hung up unexpectedly
安装2.0以上版本
yum install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm
yum install git -ygitlab 环境变量列表
~~https://docs.gitlab.com/ce/ci/variables/README.html~~ 新的默认环境变量列表
如果在CI/CD脚本中需要配置敏感信息(例如密码、密钥等),可以在单个的项目或者群组或整个项目的 设置--CI/CD--变量 中进行提前定义。这样可以在.gitlab-ci.yaml脚本中可以直接调用对应的变量名来引用敏感信息而不会造成泄露
GitLab CI/CD流水线自定义触发规则
GitLab通过配置.gitlab-ci.yml文件中的when来定义对应流水线的统一触发规则
always 总是自动触发
manual 手动触发
never 从不,手动触发也不会生效
如果有时希望部分操作可以自动触发流水线,就可以用到rules来进行定义
当提交信息中包含'deploy'时,则该流水线会被自动触发,用$CI_COMMIT_MESSAGE变量来判断
stages:
- deploy
deploy:
stage: deploy
script:
- echo "Deploying..."
rules:
- if: '$CI_COMMIT_MESSAGE =~ /deploy/'
当使用push同时提交信息中有关键字‘build'时触发build作业;当提交信息中有关键字'test'时,触发test作业
stages:
- build
- test
build:
stage: build
script:
- echo "Building..."
rules:
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_MESSAGE =~ /build/'
test:
stage: test
script:
- echo "Testing..."
rules:
- if: '$CI_COMMIT_MESSAGE =~ /test/'
根据提交内容选择是否自动执行
根据提交信息的开头是否匹配from git2来判断是否自动执行(when的默认策略是on_success)
job:
rules:
# 如果提交信息的开头不是"from git2",则流水线为手动执行,
# 否则就是自动执行(when的默认策略是on_success)
- if: $CI_COMMIT_MESSAGE != /^from git2/
when: manual定时/计划任务流水线
有时候需要定时运某个作业,可以在项目中配置流水线计划。需要注意的是希望定时运行的作业触发条件不能是手动( when: manual)。推荐使用Only关键字来配置。定义的值为schedules。 定时任务触发:左侧菜单栏的“构建”--“流水线计划”,在该界面添加定时任务计划即可
...
deploy app:
stage: deploy
script:
- pwd && ls -al
- echo "deploy 1"
only:
- schedules
...定时任务触发:左侧菜单栏的“构建”--“流水线计划”,在该界面添加定时任务计划即可
如果同一个作业希望即可以定时任务,也可以手动触发,可以用rules来实现。或者将同一个作业复制成两份,一份配置when: manual。 下面以rules配置方法来示范
...
deploy app:
stage: deploy
script:
- pwd && ls -al
- echo "deploy 1"
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" # 定时计划触发
- if: $CI_PIPELINE_SOURCE == "web" # 手动触发
...手动触发流程:左侧菜单栏的“构建”--“流水线”--右上角“运行流水线”。 定时任务触发:左侧菜单栏的“构建”--“流水线计划”,在该界面添加定时任务计划即可
更新快到期的token
修改~/.git-credentials中对应主机的token
使用token拉代码
# cat .gitconfig
[user]
name = root
email = [email protected]
[credential]
helper = store
# cat .git-credentials
http://root:[email protected]
最后更新于