《GitLab CI/CD从入门到实战》

本文最后更新于:1 分钟前

《GitLab CI/CD从入门到实战》

勘误:https://www.epubit.com/bookDetails?id=UBd184c0c65d05

实践:https://weichao.io/6b7041ccc86d/

第1章:认识Gitlab CI/CD

  • CI:Continuous Integration,持续集成。
    • 集成:比如,将自己分支的代码合并到测试分支。自动构建应用并运行不同级别的自动化测试。
  • CD:
    • Continuous Delivery,持续交付。完成CI后,自动将已验证的代码发布到存储库,可随时手动部署到生产环境。
    • Continuous Deployment,持续部署。自动部署到开发环境、测试环境甚至生产环境。

GitLab CI/CD的组成:

  • 运行流水线的环境:由GitLab Runner提供。
    • 流水线pipeline:一系列的自动化作业,触发流水线的时机可以是代码推送、创建tagtag流水线​​、合并请求合并请求流水线​​、定时触发定时流水线​​等。还有跨项目流水线、父子流水线等。
    • stages:给作业分组,规定每个阶段stage的运行顺序。
    • 作业job:最基础的执行单元。
  • .gitlab-ci.yml文件:定义流水线内容。

几点说明:

  • stages可能有多个stage,stage可能有多个job。
  • job的执行顺序由stage定义。
  • 同一个stage内的job是并行运行的。
  • 如果job的名称以.​开头,说明该job是一个隐藏作业,任何时候都不会执行,可以作为注释或配置模板供别的job继承。

GitLab Runner安装好之后,并不能被GitLab直接调用,还需要注册一个runner负责执行流水线的内容,并与GitLab通信、上传执行结果与日志,在runner中指定的执行器才是流水线真正的运行环境​,最后编写.gitlab-ci.yml文件。

第2章:CI/CD环境Gitlab Runner

使用Docker安装Gitlab Runner

1
2
3
4
sudo docker run -d --name gitlab-runner --restart always \
-v gitlab-runner:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:v16.8.0

宿主用的参数:

  • –name gitlab-runner:设置Docker名字。
  • –restart always:在宿主重启后,Docker容器也会重启。
  • -v gitlab-runner:/etc/gitlab-runner:挂载目录。冒号前面的地址指向宿主地址,冒号后面的地址是Docker地址。
  • gitlab/gitlab-runner:v16.8.0:Docker镜像和版本,运行时先在本地搜索,如果没有,再从Docker Hub下载。

注册runner

【已过时】方法1:使用registration token

1
2
3
4
5
6
7
8
9
10
11
docker run --rm -v gitlab-runner:/etc/gitlab-runner gitlab/gitlab-runner:v16.8.0 register \
--non-interactive \
--executor "docker" \
--docker-image mobiledevops/android-sdk-image:34.0.0-jdk17 \
--url "http://192.168.50.124:20080/" \
--registration-token "GR1348941e2aaEee8stBszk5iuLri" \
--description "docker-runner" \
--run-untagged="true" \
--tag-list "shared" \
--locked="false" \
--access-level="not_protected"

宿主用的参数:

  • -v gitlab-runner:/etc/gitlab-runner:挂载目录。冒号前面的地址指向宿主地址,冒号后面的地址是Docker地址。
  • gitlab/gitlab-runner:v16.8.0:Docker镜像和版本,运行时先在本地搜索,如果没有,再从Docker Hub下载。

Docker用的参数:

  • –non-interactive:表示与其他runner不会相互影响。
  • –executor “docker”:指定执行器。
  • –docker-image mobiledevops/android-sdk-image:34.0.0-jdk17:如果指定执行器为Docker,就需要指定一个基础镜像。
  • –url “http://192.168.50.124:20080/”:指定GitLab的域名,将runner与GitLab关联。
  • –registration-token “GR1348941e2aaEee8stBszk5iuLri”:指定Token,在GitLab页面上获取。
  • –tag-list “shared”:指定runner的标签。

方法2:使用token

注册 runner(通过 GitLab 生成 token)

各种执行器特点的对比

https://docs.gitlab.com/runner/executors/#selecting-the-executor

各种执行器在执行流水线时的差异

https://docs.gitlab.com/runner/executors/#compatibility-chart

配置runner

gitlab-runner/_data/config.toml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
concurrent = 1
check_interval = 0
shutdown_timeout = 0

[session_server]
session_timeout = 1800

[[runners]]
name = "docker-runner"
url = "http://192.168.50.124:20080/"
id = 5
token = "glrt-dNcto3isyApqxZqWxzUC"
token_obtained_at = 2024-01-23T08:24:29Z
token_expires_at = 0001-01-01T00:00:00Z
executor = "docker"
[runners.cache]
MaxUploadedArchiveSize = 0
[runners.docker]
tls_verify = false
image = "mobiledevops/android-sdk-image:34.0.0-jdk17"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
network_mtu = 0
  • concurrent:限制runner能够同时执行多少个作业
  • check_interval:检查新任务的间隔,以秒为单位。
  • volumes:挂载主机哪些目录到容器中。

runner的工作流程

【已过时】https://docs.gitlab.com/runner/#runner-execution-flow

第3章:流水线内容.gitlab-ci.yml

存放位置

流水线的结构

YAML文件的基本语法特点:

  • 大小写敏感。
  • 使用缩进表示层级关系。
    • 缩进不支持使用TAB键,只支持空格键。
    • 缩进的空格数不重要,只要相同层级的元素左对齐即可。
  • 用#表示注释。
1
2
3
4
5
6
7
8
9
10
image: mobiledevops/android-sdk-image:34.0.0-jdk17
stages:
- build

release_build:
stage: build
tags:
- shared
script:
- ./gradlew clean assembleRelease

第4章:初阶关键词

全局关键词关键词默认值说明
stagesstages:
- .pre
- build
- test
- deploy
- .post
.pre
build
test
deploy
.post
当前流水线包含哪些阶段stage。
可以自定义stage。
作业stagestage: testtest当前作业的阶段。
取值是stages中的某个元素。
作业
script
script: npm install当前作业要执行的脚本。
在项目的根目录下执行。

例:script: npm install
如果GitLab Runner是直接在宿主机上安装的,而不是使用Docker,那么在执行之前需要在宿主机上安装Node.js。
如果执行器是Docker,就需要在这个作业上指定node镜像。
script:
- npm install
- npm build
default全局配置,对整个流水线设置。
default定义的属性只有在作业没有定义时才会生效。
作业/defaultcache可以将不同作业中共用的文件或者文件夹缓存起来每个作业都是独立运行的,如果没有缓存,运行上一个作业时安装的项目依赖包,在运行下一个作业时还需要安装一次​,要缓存的文件路径必须是当前工作目录的相对路径。

如果执行器是Shell,缓存文件存放在/home/gitlab-runner/cache////cache.zip。
如果执行器是Shell,缓存文件存放在/var/lib/docker/volumes//_data////cache.zip。

如果一个项目中的两条流水线命中了同一个key的缓存,那么不管这个缓存是不是在当前流水线中创建的,都可以被使用。
作业/defaultcache/keycache:
key: “$KEY”
default通过key确定文件。
一个作业中最多可以定义4个key。
作业/defaultcache/key/filescache:
key:
files:
- yarn.lock
将key指向一个文件列表,只要文件内容没有变动,key就不会变。
作业/defaultcache/pathscache:
paths:
- node_modules
- binaries/*.apk
- .config
要缓存的文件路径。
作业/defaultimageimage: node:12.21.0指定一个Docker镜像作为基础镜像来执行当前的作业。
如果执行器不是Docker,该设置无效。

如果作业需要多个镜像处理,要么拆分作业,要么重新制作一个合并的镜像。
作业/defaulttagstags:
- docker-runner
指定执行当前作业的runner。
作业
variables
variables:
USER_NAME: ‘fizz’
定义一些变量,默认是环境变量。
variables:
- USER_NAME: “fizz”
variables

全局变量。

对于隐私的变量,在GitLab页面上设置,手动执行流水线时也可以定义变量。

有一些预设变量。
作业whenwhen: manualon_success如果作业失败或成功,可以执行一些额外的逻辑。
如果值为never,表示不执行。
作业/defaultartifacts将构建出的文件保存起来,可以在下一个阶段的作业中被自动恢复到工作目录。
作业/defaultartifacts/excludeartifacts:
paths:
- /dist
- *.jar
exclude:
- *.o
expire_in: 1 week
name: “$NAME”
排除文件或文件夹。
作业/defaultartifacts/expire_in有效期。
作业/defaultartifacts/name名称。
作业/defaultartifacts/paths要存储的文件或文件夹。
作业/defaultartifacts/expose_as在GitLab页面上显示的名称。
作业/defaultartifacts/public是否公开。
作业/defaultbefore_script
定义作业需要执行的脚本、命令行。
执行时机是在script之前、在artifacts之后。
作业/defaultafter_script
定义一组在作业执行结束后执行的脚本。
是在单独的Shell环境中执行的。
作业onlyonly:
- test
设置当前作业的执行时机。
当条件满足时执行作业。
作业except
设置当前作业的执行时机。
当条件满足时不执行作业。
作业only/refsonly:
refs:
- test
只有在某个分支或某个流水线类型下才会执行作业。
作业except/refs
只有在某个分支或某个流水线类型下才会不执行作业。
作业only/variablesonly:
variables:
- $USER_NAME === “fizz”
根据变量的值动态地决定是否执行作业。
作业except/variables

根据变量的值动态地决定是否不执行作业。
作业only/changesonly:
changes:
- Dockerfile
当指定的文件改变时执行作业。
作业except/changes
当指定的文件改变时不执行作业。
作业only/kubernetesonly:
kubernetes: active
如果接入了kubernetes就执行作业。
作业except/kubernetes
如果接入了kubernetes就不执行作业。

第5章:中阶关键词

全局关键词关键词默认值说明
作业coveragecoverage: '/Code coverage: \d+\.\d+/'配置一个正则表达式,可以提取出作业日志中输出的代码覆盖率。
作业dependenciesdependencies:
- build_mac
默认所有artifacts在下一阶段都会被下载。定义当前作业下载哪些前置作业的artifacts,也可以不下载。
作业allow_failureallow_failure: truefalse,手动触发作业时是true。设置当前作业失败时流水线是否继续运行。
作业extendsextends: .test继承配置模板。
作业/defaulttimeouttimeout: 1h设置一个作业的超时时间。
作业inherit限制作业是否使用default或variables定义的配置。
作业
inherit/default
inherit:
default: false
false表示不使用default中的全部值,数组表示使用的default中的值。
inherit:
default:
- retry
- image
作业
inherit/variables
inherit:
variables: false
false表示不使用variables中的全部值,数组表示使用的variables中的值。
inherit:
variables:
- NAME
- AGE
作业/defaultinterruptibleinterruptible: truefalse设置旧的流水线能否被新的流水线取消。
如果旧的流水线已经运行到了build_job,就不会被取消了。
作业
needs
needs: [“install_java”]设置只要当前作业所依赖的作业已完成,就会执行当前作业。
可以跨流水线。
needs:
- pipeline: $PARENT_PIPELINE_ID
- job: create-artifact
pages将作业artifacts发布到GitLab Pages。
作业parallelparallel: 5
设置一个作业同时运行多少次,取值范围是2~50。
作业parallel/matrixparallel:
matrix:
- PROVIDER: aws
STACK:
- monitoring
- app1
- app2
为同时运行的作业注入不同的变量值。
作业/defaultretryretry: 20设置作业在运行失败时的重试次数,取值范围是0、1、2。
作业/defaultretry/whenretry:
max: 2
when: runner_system_failure
当特定错误出现时进行重试。
作业releaserelease:
name: ‘Release $TAG’
description: ‘Release created using the release-cli’
创建发布。

第6章:高阶关键词

全局关键词关键词值的类型默认值说明
作业rulesonly/except的加强版,推荐使用rules。
作业rules/ifrules:
- if: ‘$NAME =~ /^feature/’
条件判断,当结果为true时执行作业。
作业rules/changesrules:
- changes:
- Dockerfile
当指定的文件改变时执行作业。
作业rules/existsrules:
- exists:
- Dockerfile
当指定的文件存在时执行作业。
作业rules/allow_falurerules:
- if: ‘$NAME =~ /^feature/’
allow_falure: true
false设置当前作业失败时流水线是否继续运行。
作业rules/variablesrules:
- if: ‘$NAME =~ /^feature/’
variables:
DEPLOY_VARIABLE: “deploy-production”
根据变量的值动态地决定是否执行作业。
workflow配置多个规则来限定流水线是否运行。
workflow/rules这里定义的rules是直接作用于流水线的。
triggertrigger:
project: my/deployment
branch: stable-2022
在流水线中再触发新的流水线。
trigger/strategytrigger:
include: a.yml
strategy: depend
当值为depend表示等下游流水线完成后,再继续运行当前流水线。
include
引入模板。
include/local
include:
- local: ‘a.yml’
引入本地文件。
include/fileinclude:
- project: 'my/deployment'
ref: main
file: 'a.yml'
引入其他项目的文件。
include/remoteinclude:
- remote: ‘a.yml’
引入公网文件。
include/templateinclude:
- template: Android-Fastlane.gitlab-ci.yml
引入官方模板文件。
resource_groupresource_group: prod在同一时间只会有一个作业运行。
environmentenvironment: test部署作业的环境名称。
environment/nameenvironment:
name: test
部署环境的名称。
environment/urlenvironment:
url:
部署环境的访问地址。
environment/on_stopenvironment:
on_stop: clean_test_env
在移除环境时触发一个清空部署环境的作业。
environment/actionenvironment:
action: stop
startstop表示该作业可以配置到environment/on_stop上。
environment/auto_stop_inenvironment:
auto_stop_in: 1 day
部署环境存留的时间。
作业/defaultservicesservices:
- mysql
- postgres: 11.7
在作业上添加除image之外的Docker镜像,这些镜像可以与image通信。
secrets
密钥。
dast_configuration
扫描部署后的网站,检查错误配置和安全隐患。

第7章:GitLab CI/CD部署前端项目

第8章:Java复杂微服务应用的CI/CD方案

第9章:部署Python应用到Kubernetes中


《GitLab CI/CD从入门到实战》
https://weichao.io/404278720fdb/
作者
魏超
发布于
2024年1月28日
更新于
2024年1月28日
许可协议