GitLab实战七——Gitlab CI使用

1. Gitlab-CI介绍


1.1 持续集成简单

Gitlab-ci全称是gitlab continuous integration的意思,也就是持续集成。就是将代码的构建、测试、发布、运维整个流程形成一个闭环,推动开发、测试QA、运维等部门相互促力,快速迭代,减少人工出错,提高生产效率。

GitLab实战七——Gitlab CI使用

◎持续集成、交付、部署学习

1.2 Gitlab CI流程

当每次开发push代码到gitlab的时候,都会触发一次脚本构建执行,脚本的内容由.gitlab-ci.yml定义,包括编译,测试,部署等一系列自定义的内容,主要流程如下。

安装注册Gitlab Runners --> GitLab配置Gitlab Runners --> 编辑.gitlab-ci.yml文件指定CI/CD动作 --> push代码触发CI --> Gitlab CI调度任务 --> Gitlab Runners执行工作

GitLab实战七——Gitlab CI使用

名词概念:

GitLab-CI:GitLab 提供的持续集成系统,管理项目的构建状态,通过 GitLab Runner 来执行构建任务。
GitLab-Runner:用于执行构建任务,.gitlab-ci.yml 的 script 部分的运行就是由 GitLab-Runner 来完成。
.gitlab-ci.yml:放在git项目的根目录下的一个文件,记录了一系列的阶段和执行规则。GitLab-CI 在 git push 后会解析它,根据里面的内容调用 GitLab-Runner 来执行。
Pipeline:一次 Pipeline 相当于一次构建任务,里面可以包含多个流程,比如安装依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。
Stages:构建阶段,在一次 Pipeline 中可以定义多个 Stages,所有 Stages 会按照顺序运行,如果任何一个 Stage 失败,那么后面的 Stages 不会执行。
Jobs:构建任务,每个 Stage 里面执行的任务。一个 Stage 可以有多个 Job ,全部 Job 会并行执行。

.gitlab-ci.yml内容示例,Java环境:

# 本项目使用的镜像,这里的设置会覆盖在注册Runner的时候填写的镜像
# 如果不写的话就会使用在注册Runner的时候填写的镜像
image: regitry.chegva.com/online/ci:maven-jdk-8-onbuild

# 缓存设置
# .m2/的缓存设置可以避免每次编译的时候都去maven上拉包
# /builds/$CI_PROJECT_PATH/target的缓存设置可以在job中共享该项目的打包编译结果
cache:
 paths:
   - .m2/
   - /builds/$CI_PROJECT_PATH/target
variables:
 MAVEN_OPTS: "-Dmaven.repo.local=.m2"

# CI步骤设置
stages:
 - build
 - unit-test
 - inte-test
 - deploy
 - e2e-test

# 第一步:编译
build:
 stage: build
 script:
   - mvn -U clean package

 artifacts:
   #发布时,会以target的下级目录为根目录发布,如下:只发布*.war文件
   paths:
    - target/*.war
   untracked: false


# 第二步:获取单元测试结果,并显示覆盖率
test:
 stage: unit-test
 script:
   - mvn package jacoco:report -Pjacoco
   - cat target/site/jacoco/index.html

# 第三步:集成测试
integration test:
 stage: inte-test
 script:
   - mvn package
   - do "一般情况下需要启动你的服务并做接口测试"

# 第四步:自动部署
# 在java8-maven的镜像中封装了对部署系统的调用
# 使用/home/work/bin/deploy-sdk/deploy.php脚本就可以自动完成部署
# 其中的only段的意思是自动部署只对staging这个分支生效
auto-deploy:
 stage: deploy
 script:
   - php /home/work/bin/deploy-sdk/deploy.php $CI_COMMIT_REF_NAME $CI_COMMIT_SHA $STAGING_DEPLOY_JOB
   environment:
   name: staging
   url: http://chegva.com/deploy
   only:
     - staging

# 第四步:端到端测试
e2e:
 stage: e2e-test
 script:
   - do "调用测试组的端到端测试"
   only:
     - staging

# 添加.gitlab-ci.yml,提交仓库
$ git add .gitlab-ci.yml
$ git commit -m "Add .gitlab-ci.yml"
$ git push origin master

测试可以集成codereview、sonar等工具,或者自己开发;部署更好的方式可以使用触发hooks的方式由部署平台托管

1.3 Gitlab CI使用

具体使用比较简单,看完下边文档就会了:


2. Gitlab Runners配置


以使用docker构建为例,打包的动作会在docker ci容器里进行,使用步骤:

  1. 搞几台物理机,安装注册Gitlab Runner,安装配置好docker环境

  2. 提前打好CI镜像,包括Go、JAVA、PHP、Python等,也可以自行创建,推到私有仓库中,registry或harbor都可以

  3. 在开机启动文件加入docker login做仓库认证,编辑runner配置文件/etc/gitlab-runner/config.toml,可以配置多个runner

  4. 构建CI任务,验证runners是否正常运行,对于通用的CI任务,注册Shared Runner,对于特殊,或个人测试的任务,注册Specific Runner

2.1 Gitlab Runner注册

注册 Runner 就是把 Runner 绑定到一个 GitLab 实例的过程。Runner分为两种:shared runner specific runner

shared runner:可以为多个项目运行job,只需要在Gitlab上配置即可为所有项目使用,只有管理员能创建。

specific runner: 为某些特殊需求的项目运行CI任务。也可以用group的方式应用在多个项目上,需要在每个项目中配置才能使用,只有指定了的仓库才能使用。

注册runner需要根据是shared runner还是specfic runner来获取相应的token。

执行:gitlab-runner register

Please enter the gitlab-ci coordinator URL:
# gitlab-ci 的 URL 地址,这里配置为 GitLab 地址的/ci路径
> https://gitlab.chegva.com/ci
Please enter the gitlab-ci token for this runner: [admin area] -> [settings] -> [CI/CD]
> xxxxxx
Please enter the gitlab-ci description for this runner:
> gitlab-ci
Please enter the gitlab-ci tags for this runner (comma separated):
# 给runner标记tag,用于分组调用,tag名字可以随便取,符合规范就行
> docker
Whether to run untagged builds [true/false]:
# 选择 Runner 是否接收未指定 tags 的任务(默认值:false),选true
> true
Please enter the executor: docker, parallels, shell, kubernetes, docker-ssh, ssh, virtualbox, docker+machine, docker-ssh+machine:
# 以何种方式执行CI任务,这里选docker
> docker
Please enter the default Docker image (e.g. ruby:2.1):
# 设置默认的docker镜像,保底的镜像,非必需
> registry.chegva.com/online/ci:golang-1.9.2-onbuild

2.2 Gitlab Runner配置文件

# 20个并发
concurrent = 20
check_interval = 0

[[runners]]
 name = "gitlab-ci"
 url = "https://gitlab.chegva.com/ci"
# runner注册后gitlab自动分配
 token = "xxx"
 executor = "docker"
 [runners.docker]
   tls_verify = false
   image = "docker:dind"
   privileged = false
   disable_cache = false
   # docker in docker,挂载缓存目录
   volumes = ["/var/run/docker.sock:/var/run/docker.sock","/home/work/cache:/cache"]

# 可以加多个runner
[[runners]]
...

2.3 Gitlab Runner常用命令

# 查看runner状态
gitlab-runner status

# 查看注册runner
gitlab-runner list

# 重启runner
gitlab-runner restart

# 查看runner日志
# systemctl status -l gitlab-runner
# journalctl -u gitlab-runner

# 查看帮助
gitlab-runner -h

2.4 Gitlab Runner启动文件

# gitlab-runner.service
[Unit]
Description=GitLab Runner
After=syslog.target network.target
ConditionFileIsExecutable=/usr/lib/gitlab-runner/gitlab-runner

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/lib/gitlab-runner/gitlab-runner "run" "--working-directory" "/home/gitlab-runner" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--syslog" "--user" "gitlab-runner"

Restart=always
RestartSec=120

[Install]
WantedBy=multi-user.target

2.5 Gitlab Runner升级

1. 先备份 /etc/gitlab-runner/config.toml 文件
2. 升级gitlab-runner
# gitlab-runner stop
# curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
# yum install -y gitlab-runner
# gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
3. 将备份的配置文件覆盖新生成的/etc/gitlab-runner/config.toml
4. 重启runner:gitlab-runner start && gitlab-runner list

runner指定dns

# 启动dnsmasq容器
docker run -d -p 53:53/udp -p 53:53/tcp --cap-add=NET_ADMIN --name dns-server andyshinn/dnsmasq

# runner容器指定dns,一般用于测试
vim /etc/gitlab-runner/config.toml 添加如下配置
dns = ["172.17.0.10"]

# 或者在宿主机/etc/hosts里绑定域名,再挂载
volumes = ["/etc/hosts:/etc/hosts"]


3. Gitlab Runner使用遇到的问题


1. 注册gitlab-runner时,提示报错:
GitLab Runner >= 9.0 can be used ONLY with GitLab CE/EE >= 9.0
这个因为默认gitlab runner安装时最新版的,与我们正在使用的gitlab版本不匹配,那么我们找到匹配的gitlab-runner版本安装即可

2. 有时runner会连接不上,或者在项目仓库->设置->runner里呈灰色,这有可能是runner机器上没有启动gitlab-runner引起的,可以执行ps -ef | grep gitlab看看是否存在gitlab-runner的进程,如果没有则执行gitlab-runner start 命令启动runner服务

3. 已经配置好了gitlab-runner,执行push,pipeline状态一直是pending,并且提示:
This build is stuck, because the project doesn't have any runners online assigned to it. Go to Runners page
这个是因为未找到对应的runner导致的,有以下几种情况:
1) gitlab-runner注册失败
2) gitlab-ci.yml配置文件里面配置了tags但是没有匹配到已注册可用的runner
3)runner被disable了
4)runner出问题了,hang死,重启一下即可,然后看看日志,查找原因

4. Gitlab和Gitlab Runner要分开部署,Runner最好有多个,修改配置完成后,记得要重启gitlab-runner生效

5. Gitlab迁移或者重新部署后,Runner最好重新注册一次,配置文件可以用老的覆盖。

6. 为了加快CI,建议使用缓存,引用的镜像事先全部放到私有仓库里,内网调用。

7. CI的容器建议尽量精简化,最小化原则。

8. .gitlab.yml里要引用token或密码的话,一定要定义CI私有变量在文件里引用,建议每组设置一个,组内通用。

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/3521.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注