GitLab CI/CD 开发速查表

本备忘单总结了 GitLab CI/CD 常用的配置说明,以供快速参考

入门

介绍

关键字

关键字

关键字描述
default工作关键字的自定义默认值 #
include从其他 YAML 文件导入配置 #
stages管道阶段的名称和顺序 #
variables为管道中的所有作业定义 CI/CD 变量 #
workflow控制运行什么类型的管道 #

关键字

关键字描述
after_script覆盖一组在作业之后执行的命令 #
allow_failure允许作业失败。失败的作业不会导致管道失败 #
artifacts成功时附加到作业的文件和目录列表 #
before_script覆盖在作业之前执行的一组命令 #
cache应在后续运行之间缓存的文件列表 #
coverage给定作业的代码覆盖率设置 #
dast_configuration在作业级别使用 DAST 配置文件中的配置 #
dependencies通过提供要从中获取工件的作业列表来限制将哪些工件传递给特定作业 #
environment作业部署到的环境的名称 #
except控制何时不创建作业 #
extends此作业继承自的配置条目 #
image使用 Docker 镜像 #
inherit选择所有作业继承的全局默认值 #
interruptible定义作业是否可以在被较新的运行冗余时取消 #
needs在阶段排序之前执行作业 #
only控制何时创建作业 #
pages上传作业的结果以与 GitLab Pages 一起使用 #
parallel应并行运行多少个作业实例 #
release指示运行器生成释放对象 #
resource_group限制作业并发 #
retry发生故障时可以自动重试作业的时间和次数 #
rules用于评估和确定作业的选定属性以及是否创建的条件列表 #
script由运行器执行的 Shell 脚本 #
secretsCI/CD 保密工作需要 #
services使用 Docker 服务映像 #
stage定义作业阶段 #
tags用于选择跑步者的标签列表 #
timeout定义优先于项目范围设置的自定义作业级超时 #
trigger定义下游管道触发器 #
variables在作业级别定义作业变量 #
when何时运行作业 #

全局关键词

default

示例

default:
  image: ruby:3.0

rspec:
  script: bundle exec rspec

rspec 2.7:
  image: ruby:2.7
  script: bundle exec rspec

在此示例中,ruby:3.0 是管道中所有作业的默认图像值。rspec 2.7 作业不使用默认值,因为它使用特定于作业的图像部分覆盖了默认值

include

11.4 中移至 GitLab 免费版,使用 include 将外部 YAML 文件包含在您的 CI/CD 配置中

include:
  - local: '/temp/.gitlab-ci-template.yml'

include:local

使用 include:local 包含与 .gitlab-ci.yml 文件位于同一存储库中的文件

include:
  - local: '/temp/.gitlab-ci-template.yml'

include:project

要在同一个 GitLab 实例上包含来自另一个私有项目的文件,请使用 include:projectinclude:file

include:
  - project: 'group/my-project'
    file: '/temp/.gitlab-ci-template.yml'
  - project: 'group/subgroup/my-project-2'
    file:
      - '/temp/.builds.yml'
      - '/temp/.tests.yml'

您还可以指定一个 ref

include:
  - project: 'group/my-project'
    ref: main    # Git branch
    file: '/templates/.gitlab-ci.yml'
  - project: 'group/my-project'
    ref: v1.0.0   # Git Tag
    file: '/templates/.gitlab-ci.yml'
  - project: 'group/my-project'
    ref: 787123b  # Git SHA
    file: '/templates/.gitlab-ci.yml'

include:remote

使用带有完整 URLinclude:remote 来包含来自不同位置的文件

include:
  - remote: 'https://gitlab.com/example-project/-/raw/main/.gitlab-ci.yml'

include:template

使用 include:template 来包含 .gitlab-ci.yml 模板

# 文件来自 GitLab 模板集合
include:
  - template: Auto-DevOps.gitlab-ci.yml

多个 include:template 文件:

include:
  - template: Android-Fastlane.gitlab-ci.yml
  - template: Auto-DevOps.gitlab-ci.yml

stages

使用阶段来定义包含作业组的阶段。如果 .gitlab-ci.yml 文件中未定义阶段,则默认管道阶段为:


stages:
  - build
  - test
  - deploy

workflow

workflow:name

您可以在 workflow: 中使用 name 来定义管道的名称

workflow:
  name: '分支管道:$CI_COMMIT_BRANCH'

根据管道条件具有不同管道名称的配置:

variables:
  PIPELINE_NAME: '默认管道名称'

workflow:
  name: '$PIPELINE_NAME'
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      variables:
        PIPELINE_NAME: 'MR pipeline: $CI_COMMIT_BRANCH'
    - if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-in-ruby3/'
      variables:
        PIPELINE_NAME: 'Ruby 3 pipeline'

workflow:rules:variables

您可以在 workflow:rules 中使用变量来定义特定管道条件的变量

variables:
  DEPLOY_VARIABLE: "default-deploy"

workflow:
  rules:
    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
      variables:
        DEPLOY_VARIABLE: "deploy-production"  # 覆盖全局定义的 DEPLOY_VARIABLE
    - if: $CI_COMMIT_REF_NAME =~ /feature/
      variables:
        IS_A_FEATURE: "true"                  # 定义一个新变量
    - when: always                            # 在其他情况下运行管道

job1:
  variables:
    DEPLOY_VARIABLE: "job1-default-deploy"
  rules:
    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
      variables:                                   # 覆盖定义的 DEPLOY_VARIABLE
        DEPLOY_VARIABLE: "job1-deploy-production"  # 在工作层面。
    - when: on_success                             # 在其他情况下运行作业
  script:
    - echo "Run script with $DEPLOY_VARIABLE as an argument"
    - echo "Run another script if $IS_A_FEATURE exists"

job2:
  script:
    - echo "Run script with $DEPLOY_VARIABLE as an argument"
    - echo "Run another script if $IS_A_FEATURE exists"

workflow:rules

工作流(workflow)中的 rules 关键字类似于作业中定义的 rules,但控制是否创建整个管道

workflow:
  rules:
    - if: $CI_COMMIT_TITLE =~ /-draft$/
      when: never
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

Job 关键词

after_script

在每个作业(包括失败的作业)之后运行的命令数组

job:
  script:
    - echo "示例脚本部分"
  after_script:
    - echo "在“script”部分完成后执行此命令"

allow_failure

确定管道是否应在作业失败时继续运行

job1:
  stage: test
  script:
    - execute_script_1

job2:
  stage: test
  script:
    - execute_script_2
  allow_failure: true

job3:
  stage: deploy
  script:
    - deploy_to_staging
  environment: staging

allow_failure:exit_codes

控制何时允许作业失败。对于任何列出的退出代码,作业是 allow_failure: true,对于任何其他退出代码,allow_failure false

test_job_1:
  script:
    - echo "运行导致退出代码 1 的脚本。此作业失败"
    - exit 1
  allow_failure:
    exit_codes: 137

test_job_2:
  script:
    - echo "运行导致退出代码 137 的脚本。允许此作业失败"
    - exit 137
  allow_failure:
    exit_codes:
      - 137
      - 255

before_script

在每个作业的 script 命令之前运行,但在工件恢复之后运行

job:
  before_script:
    - echo "在任何“script:”命令之前执行此命令。"
  script:
    - echo "此命令在作业的“before_script”命令之后执行"

coverage

dast_configuration

dependencies

extends

inherit

inherit:default

inherit:variables

interruptible

pages

parallel

parallel:matrix

resource_group

retry

retry:when

script

secrets

secrets:vault

secrets:file

services

service:pull_policy

stage

stage: .pre

stage: .post

tags

timeout

trigger

trigger:include

trigger:project

trigger:strategy

trigger:forward

variables

variables:description

variables:expand

when

artifacts

使用工件指定要将哪些文件另存为作业 artifacts。作业 artifacts 是作业成功、失败或始终附加到作业的文件和目录的列表

artifacts:paths

路径是相对于项目目录($CI_PROJECT_DIR)的,不能直接链接到项目目录之外

job:
  artifacts:
    paths:
      - binaries/
      - .config

artifacts:exclude

防止将文件添加到 artifacts 存档中

artifacts:
  paths:
    - binaries/
  exclude:
    - binaries/**/*.o

artifacts:expire_in

指定作业 artifacts 在它们过期和被删除之前存储多长时间

job:
  artifacts:
    expire_in: 1 week

  • '42'
  • 42 seconds
  • 3 mins 4 sec
  • 2 hrs 20 min
  • 2h20min
  • 6 mos 1 day
  • 47 yrs 6 mos and 4d
  • 3 weeks and 2 days
  • never

artifacts:expose_as

使用 artifacts:expose_as 关键字在合并请求 UI 中公开作业 artifacts

test:
  script: ["echo 'test' > file.txt"]
  artifacts:
    expose_as: 'artifact 1'
    paths: ['file.txt']

artifacts:name

定义创建的 artifacts 存档的名称。您可以为每个存档指定一个唯一的名称

job:
  artifacts:
    name: "job1-artifacts-file"
    paths:
      - binaries/

artifacts:public

确定作业工件是否应该公开可用

job:
  artifacts:
    public: false

artifacts:reports

收集作业中包含的模板生成的 artifacts

rspec:
  stage: test
  script:
    - bundle install
    - rspec --format RspecJunitFormatter --out rspec.xml
  artifacts:
    reports:
      junit: rspec.xml

artifacts:untracked

将所有 Git 未跟踪文件添加为 artifacts(连同在 artifacts:paths 中定义的路径)

job:
  artifacts:
    untracked: true

artifacts:when

作业失败或尽管失败时上传 artifacts

job:
  artifacts:
    when: on_failure

cache

cache:paths

cache:key

cache:key:files

cache:key:prefix

cache:untracked

cache:when

cache:policy

environment

environment:name

environment:url

environment:on_stop

environment:action

environment:auto_stop_in

environment:kubernetes

environment:deployment_tier

Dynamic environments

image

image:name

image:entrypoint

image:pull_policy

needs

needs:artifacts

needs:project

needs:pipeline:job

needs:optional

needs:pipeline

only / except

only:refs / except:refs

only:variables / except:variables

only:changes / except:changes

only:kubernetes / except:kubernetes

release

release:tag_name

release:tag_message

release:name

release:description

release:ref

release:milestones

release:released_at

rules

rules:if

rules:changes

rules:changes:paths

rules:changes:compare_to

rules:exists

rules:allow_failure

rules:variables