模板库-GitLab-CI/CD语法详解

工作准则

1、将代码托管在git
2、在项目根目录创建ci文件.gitlan-ci.yml 在文件中指定构建,测试和部署脚本
3、gitlab将检测到他并使用名为git Runner的工具运行脚本
4、脚本被分组为作业,他们共同组成了一个管道

gitlab-ci的脚本执行需要定制,根据对应的gitlab-runner执行。 代码puhs后,webhook检测到代码变化,会触发gitlan-cl,分配给每个Runner运行对应的script脚本

gitlab 跑步者

类型

​ share共享类型,运行整个平台项目(gitlab)的job

​ group 项目组类型,运行特定组(group)下所有项目的作业

​ sprcific项目类型,运行指定的项目作业(project)

状态

​ 锁定 锁定状态,无法运行项目作业

​ Paused 暂停状态,暂时不接受新的作业

管道语法

工作(工作)

在每个项目中,Gitlab CL/CD 管道都使用名为 .gitlab-ci.yml 的 YML 文件进行配置,其中可以定义一个或多个作业(jobs)。 每个作业必须有唯一的名称(不能使用关键字),每个作业独立运行,作业在约束下定义相关操作,每个作业必须包含至少一个脚本。

例子:

job1:
  script: "execute-script-for-job1"
job2:
  script: "execute-script-for-job2"

这里定义了两个作业,每个作业运行不同的命令,命令可以是shell也可以是脚本

脚本

(运行 shell 或脚本)

例子:

job1:
  script:
	- uname -a
	- bundle exec rspec

注意:有时脚本命令需要用单引号或双引号括起来,例如,包含冒号 (:) 的命令需要用引号引起来,以便包装的 YAML 解析器知道将整个内容解释为字符串,而不是“”键: value "" 是的,使用特殊字符是消息::,{,},[,],,,&,*,#,?,|,-,,=,!,%,%,@,`` `

before_script

用于定义在每个作业之前运行的命令。 必须是一个数组。已知的 scripy 与脚本中任何已知的脚本连接起来并在单个 shell 中一起执行

before_script的失败会导致整个作业失败,其他作业将不再执行。 作业失败不影响 after_script

after_script

用于定义每个作业(包括失败的作业)之后运行的命令

这必须是一个数组

指定的脚本在新的 shell 中执行,与任何 before_script 或 script 脚本分开

before_script或script执行失败不影响after_script执行

stages

用于定义作业可以使用的阶段,是全局定义

同一阶段的作业并行运行,不同阶段的作业顺序执行

stages:
	- build
	- test
	- codescan
	- deploy

.pre&.post

.pre 始终是整个管道的第一个运行阶段,.post 始终是整个管道的最后一个运行阶段。 用户定义的阶段都在两者之间运行。 .pre 和 .post 的顺序不能更改。如果管道仅包含 .pre 或 .post 阶段的作业,则不会创建管道

codescan:
  stage: .pre
  tags:
  	- build
  only:
  	- master
  script:
  	- echo "codescan"

阶段

每个作业定义并依赖于全局定义的阶段。它允许作业分为不同的阶段,统一的阶段作业可以并行执行

瓦瓦莱斯

定义变量、管道变量、作业变量。 job变量具有最高优先级

标签

指定跑步者

用于从允许该项目的所有 Runner 列表中选择指定的 Runner。 注册Runner时,可以指定Runner的标签

windows job:
  stage:
  	- build
  tags:
  	- windows
  script:
  	- echo Hello,%$USERNAME%:
  	
 osx job:
  stage:
  	- build
  tags:
  	- osx
  script:
  	- echo "Hello, $USER:"

allow_failure(允许失败)

allpw_failure 允许作业失败,默认值为 false,如果启用后作业失败,该作业将在用户界面中显示橙色警告,但是管道的逻辑流程将任务该作业成功/通过,并且不会被阻止。 假设所有其他作业均成功,则更改后的作业的阶段及其管道将显示相同的橙色警告。 但是,托管提交将被标记为“通过”而不发出警告。

windows job:
  stage:
  	- build
  tags:
  	- windows
  script:
  	- echo Hello,%$USERNAME%:
  allow_failure: true

当(允许控制作业)

on_success	前面阶段中的所有作业都成功时才执行作业,默认值
on_failure	当前面阶段出现失败时执行
always	总是执行作业
manual	手动执行作业
delayed	延迟执行作业

重试(重试)

配置失败时重试作业的次数

如果也失败并且配置了重试,则作业将再次处理,直到达到retry关键字指定的次数

如果当retry设置为2时,但允许作业第二次(第一次重试)成功,则不再重试,重试值必须为正整数,等于或大于0、小于或等于 2(最多允许重试两次,总共允许重试三次)

重试 - 重试 - 精确匹配错误

默认情况下,作业在失败时重试,amx:最大重试次数,当:失败时重试的错误类型

always :在发生任何故障时重试(默认).
unknown_failure :当失败原因未知时。
script_failure :脚本失败时重试。
api_failure :API失败重试。
stuck_or_timeout_failure :作业卡住或超时时。
runner_system_failure :运行系统发生故障。
missing_dependency_failure: 如果依赖丢失。
runner_unsupported :Runner不受支持。
stale_schedule :无法执行延迟的作业。
job_execution_timeout :脚本超出了为作业设置的最大执行时间。
archived_failure :作业已存档且无法运行。
unmet_prerequisites :作业未能完成先决条件任务。
scheduler_failure :调度程序未能将作业分配给运行scheduler_failure。
data_integrity_failure :检测到结构完整性问题。

例子:

unittest:
  stage: test
  tags:
    - build
  only:
    - master
  script:
    - ech "run test"
  retry:
    max: 2
    when:
      - script_failure

超时——超时

作业级别超时可以超过项目级别超时,但不能超过特定于运行程序的超时

build:
  script: build.sh
  timeout: 3hours 30minutes
test:
  script: rspec
  timeout: 3h 30m

超时-超时-跑步者超时

如果小于项目定义的超时将优先,该功能可用于通过设置较大的超时(例如一周)来防止 Shared Runner 被项目占用。在未配置时,Runner 不会覆盖项目超时

示例1:运行程序超时大于项目超时

运行程序超时设置为 24 小时,项目的 CI/CD 超时设置为 2 小时。

作业将在 2 小时后超时

示例 2:未配置运行程序超时

运行器没有设置超时时间,项目的CI/CD超时设置为2小时

作业将在 2 小时后超时

示例 3:运行程序超时小于项目超时

运行器超时设置为30个分支,项目的CI/CD超时设置为2小时

作业 30 分钟后超时

并行 - 并行作业

配置并行运行的作业实例数量,该值必须大于等于2且小于等于50

这将创建并行运行的同一作业的 n 个实例,按顺序命名,从 job_name 1/n 到 job_name n/n

仅&例外限制分支标签

仅且例外地使用分支策略来限制岗位建设

​ 只有定义这些分支和标签的git项目才会被作业执行

​ ecxept定义了git项目的那些分支和标签不会被作业执行

job:
  #use regexp
  only:
    - /^issue-.*$/
  #use specli keyword
  ecxept:
  	- branches

规则——构建规则

规则允许单个规则的顺序小程序直到匹配为止,并为作业动态提供属性

规则不能与 only/ except 组合

可用规则

if	(如果条件匹配)
changes	(指定文件发生变化)
exists	(指定文件存在)

列:规则-如果-条件-匹配

如果DOMAIN的值匹配,则需要手动运行

与 on_success 不匹配

从上到下判断条件,匹配就会停止

多条件匹配可以使用&&||

variables:
  DOMAIN: example.com
  
codescan:
  stage: codescan
  tags:
    - build
  script:
    - echo "codescan"
    - sellp 5;
    #parallel:5
    rules:
      - if:'$DOMAIN == "example.com"'
        when: manual
      when: on_success

规则更改 - 文件更改

接受文件路径数组

true 如果提交 jenkinsfile 发送的更改

codescan:
  stage: codescan
  tags:
    - build
  script:
    - echo "codescan"
    - sleep 5;
    #parallel:5
    rules:
      - changes:
        - jenkinsfile
        when: manual
      - if:'$DOMAIN == "example.com"'
        when: on_success
      - when: on_success

规则-allow_failure - 允许失败

使用规则-allow_failure: true

规则:允许作业失败或手动作业等待操作而不停止管道本身

job:
  script "echo Hello,Rules"
  rules:
    - if:'$CI_meRGE_REQUEST_TARGET_BRABCH_NAME == "master"'
      when: manual
      allow_failure

工作流程规则 - 管道创建

定价工作流关键字适用于整个管道,并将决定是否创建管道

when:三个字可以是always或never,如果不提供则默认值always

variables:
  DOMAIN: example.com
  
workflow:
  rules:
    - if: '$DOMAIN == "example.com"'
    - when: always

缓存 - 缓存

存储编译项目所需的运行时依赖,并指定项目工作区中作业之间需要缓存的文件目录

全局缓存是在作业外部定义的,对所有作业生效。 作业时钟缓存优先于全局

缓存:路径

在作业构建中定义缓存,目标目录中的所有jar文件都会被缓存

缓存是全局定义的:路径会被作业覆盖,以下示例将缓存目标

build:
  script: test
  cache:
    paths:
      - target/*.jar

cache:
  paths:
    - my/files
    
build:
  script: echo "Hello"
  cache:
    key: build
    paths:
      - target/

由于缓存是在作业之间共享的,如果不同的作业使用不同的路径,就会出现缓存覆盖的问题

如何让不同的作业缓存不同的缓存?

设置不同的cache:key

缓存:key - 缓存标签

为缓存做一个标记,可以配置job和branch为关键,实现branch和job特定的缓存

当为不同的作业定义不同的cache:key时,每个作业都会分配一个独立的缓存

cache:关键变量可以使用任何预定义的变量模板库,默认为default

从 gitlab9.0 开始,默认情况下一切都在管道和作业之间共享

按分支设置缓存

cache:
  key: ${CI_COMMIT_REF_SLUG}

cache:key:files-文件变化自动创建缓存

files:文件发送和更改时自动重新生成缓存(files指定最多两个文件),提交时检查指定文件

生成一个key根据指定文件计算sha校验和,如果文件没有改变则该值为默认值

cache:
  key:
    files:
      - Gemfile.lock
      - package.json
    paths:
      - endor/ruby
      - node_modules

cache:key:prefix- 组合生成 sha 校验和

prefix:允许给定前缀的值与指定文件生成的密钥组合

全局缓存在这里定义。 如果文件传输发生变化,则该值为repec-xxx11122211。 如果没有改变的话就是rspec-default

cache:
  key:
    files:
      - Gemfile.lock
    prefix: $(CI_JOB_NAME)
  path:
    - vendor/ruby
    
rspec:
  script:
    - bundle exec rspec

缓存:策略 - 缓存策略

默认情况下,文件在执行开始时下载,结束时重新上传

策略:pull 跳过下载步骤,策略:push 跳过上传步骤

文物 - 文物

用于指定作业成功或失败时应附加到作业的文件或目录列表。 作业完成后,工件将发送到gitlab,并可以在gitlab ui中下载

artifacts:
  paths:
    - target/

例子:

default-job:
  script:
    - mvn test -U
  except:
    - tags
    
release-job:
  script:
    - mvn package -U
  artifacts:
    path:
      - target/*.war
    oniy:
      - tags

工件:expose_as-MR 显示工件

关键字 hide_as 可用于在合并请求 UI 中公开作业工件

每个合并请求最多可以公开 10 个作业工件

列表:

test:
  script:
    - echo 1
  aritifacts:
    expose_as:'artifact 1'
    patchs:
      - path/to/file.txt

工件:名称 - 工件名称

通过name命令定义创建的射箭存档的名称,可以为每个存档使用唯一的名称

artifacts:name 默认名称为artifacts模板库,下载artifacts后改为artifacts.zip

列表:

job:
  artifacts:
    name: "$CI_JOB_NAME"
    patchs:
      - binaries/

job:
  artifacts:
    name: "$CI_COMMIT_REF_NAME"
    paths:
      - binaries/

artifacts:when - 工件创建条件

用于上传作业失败或成功时的工件

​ on_success 如果作业成功则仅上传工件 默认

​ on_failure 仅在作业失败时上传工件

​ 无论工作状态如何,始终上传工件

例子:

job1:
  artifacts:
    when: on_failure
    
job2:
  artifacts:
    when: on_success
    
job3:
  artifacts:
    when: always

工件:expire_in - 工件保留时间

产品的有效期从上传并存储到gitlab时开始计算。 如果没有定义过期时间,则默认为30天

expire_in 的值是以秒为单位的警告时间,除非提供单位

例子:

job:
  artifacts:
    expire_in: 1 week

工件:报告:junit - 单元测试报告

收集junit单元测试报告,最喜欢的JUnit报告将作为工作上传到gitlab并自动显示在合并请求中

列表:

build:
  stage: build
  tags:
    - build
  only:
    - master
  script:
    - mvn test
    - mvn cobertura:cobertura
    - ls target
  artifacts:
    name: "$CI_JOB_NAME-$CI_COMMIT"_REF_NAME"
    when: on_success
    expose_api: 'artifact 1'
    paths:
      - target/*,jar
    reports
      junit: target/surefire-reports/TEST-*.xml

依赖项获取工件

定义从中获取工件的作业列表。 只能从当前阶段之前执行的阶段定义作业。 定义空数组将跳过下载此作业的任何工件。 不会考虑之前作业的状态,因此如果失败或未运行手动作业,则不会发生错误。 如果未设置依赖关系的工作工件已过期或被删除,则依赖作业将失败。

列表:

unittest:
  dependencies:
    - build

需求阶段并行性

作业可以无序执行,而不是按阶段顺序运行某些作业,而是可以同时运行多个阶段。

如果将needs:设置为指向因only/ except规则而未实例化的作业,或者不存在,则创建管道时会出现YML错误

列表:

module-a-test:
  stage: test
  script:
    - echo "Hello"
    - sleep 10
  needs:
    - job: "module-a-build"

需求-产品下载

使用需求时,可以使用artifacts: true或者artifacts: false来控制artifacts的下载,默认为true

列表:

module-a-test:
  stage: test
  script:
    - echo "Hello"
    - sleep 10
  needs:
    - job: "module-a-build"
      artifacts: true

include:local - 引入本地配置

可以允许导入外部 YAML 文件,文件扩展名为 .yml 或 yaml

可以使用合并功能自定义和覆盖包含本地定义的 CI/CD 配置

从同一存储库导入文件,使用相对于根目录的完整路径引用,与配置文件位于同一分支上

列表:

ci/localci.yml
stages:
  - deploy
  
deployjob:
  stage: deploy
  script:
    - echo 'deploy'

include:
  local: 'ci/localci.yml'

include:file - 导入其他项目配置

引入另一个项目的master分支的.gitlab-ci.yml配置

include:
  - project: 
    ref: master
    file: '.gitlab-ci.yml'

include-template-引入官方配置

include:
  - template: AUTO-DevOps.gitlab-ci.yml

include:remote - 引入远程配置