国产成人精品999视频&日本一区二区亚洲人妻精品&久久久精品国产99久久精&99热这里只有成人精品国产&精品国产剧情av一区二区&成人亚洲精品久久久久app&国产精品美女高潮抽搐A片

GitLab CI/CD 備忘清單

本備忘單總結(jié)了 GitLab CI/CD 常用的配置說明,以供快速參考

入門

介紹

創(chuàng)建并運(yùn)行您的第一個(gè) GitLab CI/CD 管道,在開始之前,請(qǐng)確保您擁有:

  • GitLab 中您想要使用 CI/CD 的項(xiàng)目
  • 項(xiàng)目的維護(hù)者或所有者角色

如果您沒有項(xiàng)目,可以在 https://gitlab.com 上免費(fèi)創(chuàng)建一個(gè)公共項(xiàng)目

  • 在存儲(chǔ)庫的根目錄下創(chuàng)建一個(gè) .gitlab-ci.yml 文件。該文件是您定義 CI/CD 作業(yè)的地方
  • 轉(zhuǎn)到Settings > CI/CD 并展開運(yùn)行程序,只要您至少有一個(gè)運(yùn)行器處于活動(dòng)狀態(tài),旁邊有一個(gè)綠色圓圈,您就有一個(gè)運(yùn)行器可以處理您的工作

示例

default:
  image: node:16

windows_job:
  only:
    - master
  tags:
    - windows
  script:
    - echo Hello, %USERNAME%!

linux_job: tags:
    - linux script:
    - echo "Hello, $USER!"

tags 用于在不同的平臺(tái)上運(yùn)行作業(yè),only 控制 master 分支提交觸發(fā)

關(guān)鍵字

關(guān)鍵字

關(guān)鍵字描述
default工作關(guān)鍵字的自定義默認(rèn)值 #
include從其他 YAML 文件導(dǎo)入配置 #
stages管道階段的名稱和順序 #
variables為管道中的所有作業(yè)定義 CI/CD 變量 #
workflow控制運(yùn)行什么類型的管道 #

關(guān)鍵字

關(guān)鍵字描述
after_script覆蓋一組在作業(yè)之后執(zhí)行的命令 #
allow_failure允許作業(yè)失敗。失敗的作業(yè)不會(huì)導(dǎo)致管道失敗 #
artifacts成功時(shí)附加到作業(yè)的文件和目錄列表 #
before_script覆蓋在作業(yè)之前執(zhí)行的一組命令 #
cache應(yīng)在后續(xù)運(yùn)行之間緩存的文件列表 #
coverage給定作業(yè)的代碼覆蓋率設(shè)置 #
dast_configuration在作業(yè)級(jí)別使用 DAST 配置文件中的配置 #
dependencies通過提供要從中獲取工件的作業(yè)列表來限制將哪些工件傳遞給特定作業(yè) #
environment作業(yè)部署到的環(huán)境的名稱 #
except控制何時(shí)不創(chuàng)建作業(yè) #
extends此作業(yè)繼承自的配置條目 #
image使用 Docker 鏡像 #
inherit選擇所有作業(yè)繼承的全局默認(rèn)值 #
interruptible定義作業(yè)是否可以在被較新的運(yùn)行冗余時(shí)取消 #
needs在階段排序之前執(zhí)行作業(yè) #
only控制何時(shí)創(chuàng)建作業(yè) #
pages上傳作業(yè)的結(jié)果以與 GitLab Pages 一起使用 #
parallel應(yīng)并行運(yùn)行多少個(gè)作業(yè)實(shí)例 #
release指示運(yùn)行器生成釋放對(duì)象 #
resource_group限制作業(yè)并發(fā) #
retry發(fā)生故障時(shí)可以自動(dòng)重試作業(yè)的時(shí)間和次數(shù) #
rules用于評(píng)估和確定作業(yè)的選定屬性以及是否創(chuàng)建的條件列表 #
script由運(yùn)行器執(zhí)行的 Shell 腳本 #
secretsCI/CD 保密工作需要 #
services使用 Docker 服務(wù)映像 #
stage定義作業(yè)階段 #
tags用于選擇跑步者的標(biāo)簽列表 #
timeout定義優(yōu)先于項(xiàng)目范圍設(shè)置的自定義作業(yè)級(jí)超時(shí) #
trigger定義下游管道觸發(fā)器 #
variables在作業(yè)級(jí)別定義作業(yè)變量 #
when何時(shí)運(yùn)行作業(yè) #

全局關(guān)鍵詞

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 是管道中所有作業(yè)的默認(rèn)圖像值。rspec 2.7 作業(yè)不使用默認(rèn)值,因?yàn)樗褂锰囟ㄓ谧鳂I(yè)的圖像部分覆蓋了默認(rèn)值

include

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

11.4 中移至 GitLab 免費(fèi)版,使用 include 將外部 YAML 文件包含在您的 CI/CD 配置中

include:local

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

使用 include:local 包含與 .gitlab-ci.yml 文件位于同一存儲(chǔ)庫中的文件

include:project

要在同一個(gè) GitLab 實(shí)例上包含來自另一個(gè)私有項(xiàng)目的文件,請(qǐng)使用 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'

您還可以指定一個(gè) 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

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

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

include:template

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

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

多個(gè) include:template 文件:

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

stages

使用階段來定義包含作業(yè)組的階段。如果 .gitlab-ci.yml 文件中未定義階段,則默認(rèn)管道階段為:


stages:
  - build
  - test
  - deploy

workflow

workflow:name

您可以在 workflow: 中使用 name 來定義管道的名稱

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

根據(jù)管道條件具有不同管道名稱的配置:

variables:
  PIPELINE_NAME: '默認(rèn)管道名稱'

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"                  # 定義一個(gè)新變量
    - when: always                            # 在其他情況下運(yùn)行管道

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                             # 在其他情況下運(yùn)行作業(yè)
  script:
    - echo "以 $DEPLOY_VARIABLE 作為參數(shù)運(yùn)行腳本"
    - echo "如果 $IS_A_FEATURE 存在則運(yùn)行另一個(gè)腳本"

job2:
  script:
    - echo "以 $DEPLOY_VARIABLE 作為參數(shù)運(yùn)行腳本"
    - echo "如果 $IS_A_FEATURE 存在則運(yùn)行另一個(gè)腳本"

workflow:rules

工作流(workflow)中的 rules 關(guān)鍵字類似于作業(yè)中定義的 rules,但控制是否創(chuàng)建整個(gè)管道

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

Job 關(guān)鍵詞

after_script

在每個(gè)作業(yè)(包括失敗的作業(yè))之后運(yùn)行的命令數(shù)組

job:
  script:
    - echo "示例腳本部分"
  after_script:
    - echo "在“script”部分完成后執(zhí)行此命令"

allow_failure

確定管道是否應(yīng)在作業(yè)失敗時(shí)繼續(xù)運(yùn)行

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

控制何時(shí)允許作業(yè)失敗。對(duì)于任何列出的退出代碼,作業(yè)是 allow_failure: true,對(duì)于任何其他退出代碼,allow_failure false

test_job_1:
  script:
    - echo "退出代碼 1 的腳本。此作業(yè)失敗"
    - exit 1
  allow_failure:
    exit_codes: 137

test_job_2:
  script:
    - echo "退出代碼 137 的腳本允許此作業(yè)失敗"
    - exit 137
  allow_failure:
    exit_codes:
      - 137
      - 255

dast_configuration

stages:
  - build
  - dast

include:
  - template: DAST.gitlab-ci.yml

dast:
  dast_configuration:
    site_profile: "Example Co"
    scanner_profile: "Quick Passive Test"

指定要在 CI/CD 配置中使用的站點(diǎn)配置文件和掃描儀配置文件。 兩個(gè)配置文件必須首先在項(xiàng)目中創(chuàng)建。 作業(yè)的階段必須快

before_script

在每個(gè)作業(yè)的 script 命令之前運(yùn)行,但在工件恢復(fù)之后運(yùn)行

job:
  before_script:
    - echo "在任何“script:”命令之前執(zhí)行此命令"
  script:
    - echo "“before_script”命令之后執(zhí)行"

coverage

job1:
  script: rspec
  coverage: '/Code coverage: \d+\.\d+/'

使用自定義正則表達(dá)式的覆蓋率來配置如何從作業(yè)輸出中提取代碼覆蓋率

extends

.tests:
  script: rake test
  stage: test
  only:
    refs:
      - branches

rspec:
  extends: .tests
  script: rake rspec
  only:
    variables:
      - $RSPEC

使用 extends 重用配置部分。 它是 YAML 錨點(diǎn)的替代品,并且更加靈活和可讀

dependencies

build osx:
  stage: build
  script: make build:osx
  artifacts:
    paths:
      - binaries/

build linux:
  stage: build
  script: make build:linux
  artifacts:
    paths:
      - binaries/

test osx:
  stage: test
  script: make test:osx
  dependencies:
    - build osx

test linux:
  stage: test
  script: make test:linux
  dependencies:
    - build linux

deploy:
  stage: deploy
  script: make deploy
  environment: production

定義要從中獲取工件的作業(yè)列表。您還可以將作業(yè)設(shè)置為根本不下載任何工件

inherit

使用 inherit 控制默認(rèn)關(guān)鍵字和變量的繼承

inherit:default

使用 inherit:default 控制 default 關(guān)鍵字的繼承

default:
  retry: 2
  image: ruby:3.0
  interruptible: true

job1:
  script: echo "此作業(yè)不繼承任何默認(rèn)關(guān)鍵字"
  inherit:
    default: false

job2:
  script: echo "此作業(yè)僅繼承列出的兩個(gè)默認(rèn)關(guān)鍵字。它不繼承“可中斷”"
  inherit:
    default:
      - retry
      - image

inherit:variables

使用 inherit:variables 控制全局變量關(guān)鍵字的繼承

variables:
  VARIABLE1: "這是變量 1"
  VARIABLE2: "這是變量 2"
  VARIABLE3: "這是變量 3"

job1:
  script: echo "該作業(yè)不繼承任何全局變量"
  inherit:
    variables: false

job2:
  script: echo "此作業(yè)僅繼承列出的兩個(gè)全局變量。它不繼承“VARIABLE3”"
  inherit:
    variables:
      - VARIABLE1
      - VARIABLE2

interruptible

stages:
  - stage1
  - stage2
  - stage3

step-1:
  stage: stage1
  script:
    - echo "可以取消"
  interruptible: true

step-2:
  stage: stage2
  script:
    - echo "不能取消"

step-3:
  stage: stage3
  script:
    - echo "因?yàn)榈?2 步無法取消,所以此步驟永遠(yuǎn)無法取消,即使它被設(shè)置為可中斷"
  interruptible: true

如果在作業(yè)完成之前啟動(dòng)較新的管道時(shí)應(yīng)取消作業(yè),則使用可中斷的

pages

pages:
  stage: deploy
  script:
    - mkdir .public
    - cp -r * .public
    - mv .public public
  artifacts:
    paths:
      - public
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
  environment: production

使用頁面定義將靜態(tài)內(nèi)容上傳到 GitLabGitLab Pages 作業(yè)。然后將內(nèi)容發(fā)布為網(wǎng)站

parallel

test:
  script: rspec
  parallel: 5

使用 parallel 在單個(gè)管道中并行多次運(yùn)行作業(yè)

parallel:matrix

deploystacks:
  stage: deploy
  script:
    - bin/deploy
  parallel:
    matrix:
      - PROVIDER: aws
        STACK:
          - monitoring
          - app1
          - app2
      - PROVIDER: ovh
        STACK: [monitoring, backup, app]
      - PROVIDER: [gcp, vultr]
        STACK: [data, processing]
  environment: $PROVIDER/$STACK

使用 parallel:matrix 在單個(gè)管道中并行多次運(yùn)行作業(yè),但每個(gè)作業(yè)實(shí)例具有不同的變量值

resource_group

deploy-to-production:
  script: deploy
  resource_group: production

創(chuàng)建一個(gè)資源組,以確保作業(yè)在同一項(xiàng)目的不同管道之間互斥

tags

job:
  tags:
    - ruby
    - postgres

使用標(biāo)簽從項(xiàng)目可用的所有運(yùn)行器列表中選擇特定運(yùn)行器

retry

test:
  script: rspec
  retry: 2

使用 retry 配置作業(yè)失敗時(shí)重試的次數(shù)。如果未定義,則默認(rèn)為 0,并且作業(yè)不會(huì)重試

retry:when

test:
  script: rspec
  retry:
    max: 2
    when: runner_system_failure

使用 retry:whenretry:max 來重試特定失敗案例的作業(yè)。 retry:max 是最大重試次數(shù),和retry一樣,可以是0、1、2

script

job1:
  script: "bundle exec rspec"

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

使用腳本指定運(yùn)行器執(zhí)行的命令

secrets

此關(guān)鍵字必須與 secrets:vault 一起使用

secrets:vault

使用 secrets:vault 指定 HashiCorp Vault 提供的秘密

job:
  secrets:
    # 將秘密的路徑存儲(chǔ)在此 CI/CD 變量中
    DATABASE_PASSWORD:
      # 轉(zhuǎn)換為秘密:`ops/data/production/db`
      # 字段:`password`
      vault: 
        engine:
          name: kv-v2
          path: ops
        path: production/db
        field: password

secrets:file

使用 secrets:file 將秘密配置為存儲(chǔ)為文件或變量類型的 CI/CD 變量

job:
  secrets:
    DATABASE_PASSWORD:
      vault: production/db/password@ops
      file: false

timeout

build:
  script: build.sh
  timeout: 3 hours 30 minutes

test:
  script: rspec
  timeout: 3h 30m

為特定作業(yè)配置超時(shí)。 如果作業(yè)運(yùn)行時(shí)間超過超時(shí)時(shí)間,則作業(yè)失敗

services

使用服務(wù)指定額外的 Docker 映像以在其中運(yùn)行腳本

default:
  image:
    name: ruby:2.6
    entrypoint: ["/bin/bash"]

  services:
    - name: my-postgres:11.7
      alias: db-postgres
      entrypoint: ["/usr/local/bin/db-postgres"]
      command: ["start"]

  before_script:
    - bundle install

test:
  script:
    - bundle exec rake spec

service:pull_policy

運(yùn)行器用于獲取 Docker 映像的拉取策略

job1:
  script: echo "A single pull policy."
  services:
    - name: postgres:11.6
      pull_policy: if-not-present

job2:
  script: echo "Multiple pull policies."
  services:
    - name: postgres:11.6
      pull_policy: [always, if-not-present]

stage

stages:
  - build
  - test
  - deploy

job1:
  stage: build
  script:
    - echo "這項(xiàng)工作編譯代碼"

job2:
  stage: test
  script:
    - echo "此作業(yè)測(cè)試編譯后的代碼。它在構(gòu)建階段完成時(shí)運(yùn)行"

job3:
  script:
    - echo "這項(xiàng)工作也在測(cè)試階段運(yùn)行"

job4:
  stage: deploy
  script:
    - echo "此作業(yè)部署代碼。它在測(cè)試階段完成時(shí)運(yùn)行"
  environment: production

stage: .pre

stages:
  - build
  - test

job1:
  stage: build
  script:
    - echo "該作業(yè)在構(gòu)建階段運(yùn)行"

first-job:
  stage: .pre
  script:
    - echo "該作業(yè)在 .pre 階段運(yùn)行,在所有其他階段之前"

job2:
  stage: test
  script:
    - echo "該作業(yè)在測(cè)試階段運(yùn)行"

stage: .post

stages:
  - build
  - test

job1:
  stage: build
  script:
    - echo "該作業(yè)在構(gòu)建階段運(yùn)行"

last-job:
  stage: .post
  script:
    - echo "該作業(yè)在 .post 階段運(yùn)行,在所有其他階段之后"

job2:
  stage: test
  script:
    - echo "該作業(yè)在測(cè)試階段運(yùn)行"

trigger

聲明一個(gè)作業(yè)是一個(gè)“觸發(fā)作業(yè)”

trigger-multi-project-pipeline:
  trigger: my-group/my-project

trigger:include

trigger-child-pipeline:
  trigger:
    include: path/to/child-pipeline.gitlab-ci.yml

聲明作業(yè)是啟動(dòng)子管道的“觸發(fā)器作業(yè)”

trigger:project

trigger-multi-project-pipeline:
  trigger:
    project: my-group/my-project

聲明作業(yè)是啟動(dòng)多項(xiàng)目管道的“觸發(fā)器作業(yè)”

trigger:strategy

trigger-multi-project-pipeline:
  trigger:
    project: my-group/my-project
    branch: development

強(qiáng)制觸發(fā)作業(yè)等待下游管道完成后再標(biāo)記為成功

trigger:forward

variables: # 每個(gè)作業(yè)的默認(rèn)變量
  VAR: value

# 默認(rèn)行為:
# - VAR 傳遞給孩子
# - MYVAR 沒有傳遞給孩子
child1:
  trigger:
    include: .child-pipeline.yml

# 轉(zhuǎn)發(fā)管道變量:
# - VAR 傳遞給孩子
# - MYVAR 傳遞給孩子
child2:
  trigger:
    include: .child-pipeline.yml
    forward:
      pipeline_variables: true

# 不要轉(zhuǎn)發(fā) YAML 變量:
# - VAR 不會(huì)傳遞給孩子
# - MYVAR 沒有傳遞給孩子
child3:
  trigger:
    include: .child-pipeline.yml
    forward:
      yaml_variables: false

variables

CI/CD 變量是傳遞給作業(yè)的可配置值。使用變量創(chuàng)建自定義變量

variables:
  DEPLOY_SITE: "https://example.com/"

deploy_job:
  stage: deploy
  script:
    - deploy-script --url $DEPLOY_SITE --path "/"
  environment: production

deploy_review_job:
  stage: deploy
  variables:
    REVIEW_PATH: "/review"
  script:
    - deploy-review-script --url $DEPLOY_SITE --path $REVIEW_PATH
  environment: production

variables:description

variables:
  DEPLOY_ENVIRONMENT:
    description: "部署目標(biāo)。 如果需要,將此變量更改為“canary”或“production”"
    value: "staging"

variables:expand

variables:
  VAR1: value1
  VAR2: value2 $VAR1
  VAR3:
    value: value3 $VAR1
    expand: false

使用 expand 關(guān)鍵字將變量配置為可擴(kuò)展或不可擴(kuò)展

when

使用 when 配置作業(yè)運(yùn)行的條件。如果未在作業(yè)中定義,則默認(rèn)值為 when:on_success

stages:
  - build
  - cleanup_build
  - test
  - deploy
  - cleanup

build_job:
  stage: build
  script:
    - make build

cleanup_build_job:
  stage: cleanup_build
  script:
    - cleanup build when failed
  when: on_failure

test_job:
  stage: test
  script:
    - make test

deploy_job:
  stage: deploy
  script:
    - make deploy
  when: manual
  environment: production

cleanup_job:
  stage: cleanup
  script:
    - cleanup after jobs
  when: always

:---
on_success(default)僅當(dāng)早期階段的所有作業(yè)都成功或具有 allow_failure: true 時(shí)才運(yùn)行該作業(yè)
manual僅在手動(dòng)觸發(fā)時(shí)運(yùn)行作業(yè)
always無論早期階段的作業(yè)狀態(tài)如何,都運(yùn)行作業(yè)。也可以用在 workflow:rules
on_failure僅當(dāng)早期階段的至少一項(xiàng)作業(yè)失敗時(shí)才運(yùn)行該作業(yè)
delayed將作業(yè)的執(zhí)行延遲指定的持續(xù)時(shí)間
never不要運(yùn)行作業(yè)。只能在規(guī)則rules部分或工作流中使用:workflow: rules

artifacts

使用工件指定要將哪些文件另存為作業(yè) artifacts。作業(yè) artifacts 是作業(yè)成功、失敗或始終附加到作業(yè)的文件和目錄的列表

artifacts:paths

路徑是相對(duì)于項(xiàng)目目錄($CI_PROJECT_DIR)的,不能直接鏈接到項(xiàng)目目錄之外

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

artifacts:exclude

防止將文件添加到 artifacts 存檔中

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

artifacts:expire_in

指定作業(yè) artifacts 在它們過期和被刪除之前存儲(chǔ)多長時(shí)間

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 關(guān)鍵字在合并請(qǐng)求 UI 中公開作業(yè) artifacts

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

artifacts:name

定義創(chuàng)建的 artifacts 存檔的名稱。您可以為每個(gè)存檔指定一個(gè)唯一的名稱

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

artifacts:public

確定作業(yè)工件是否應(yīng)該公開可用

job:
  artifacts:
    public: false

artifacts:reports

收集作業(yè)中包含的模板生成的 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

作業(yè)失敗或盡管失敗時(shí)上傳 artifacts

job:
  artifacts:
    when: on_failure

cache

cache:paths

rspec:
  script:
    - echo "此作業(yè)使用緩存"
  cache:
    key: binaries-cache
    paths:
      - binaries/*.apk
      - .config

關(guān)鍵字來選擇要緩存的文件或目錄

cache:key

為每個(gè)緩存提供唯一的標(biāo)識(shí)鍵。 使用相同緩存鍵的所有作業(yè)都使用相同的緩存,包括在不同的管道中

cache-job:
  script:
    - echo "此作業(yè)使用緩存"
  cache:
    key: binaries-cache-$CI_COMMIT_REF_SLUG
    paths:
      - binaries/

cache:key:files

cache-job:
  script:
    - echo "此作業(yè)使用緩存"
  cache:
    key:
      files:
        - Gemfile.lock
        - package.json
    paths:
      - vendor/ruby
      - node_modules

當(dāng)一個(gè)或兩個(gè)特定文件更改時(shí),使用 cache:key:files 關(guān)鍵字生成新密鑰

cache:key:prefix

rspec:
  script:
    - echo "此 rspec 作業(yè)使用緩存"
  cache:
    key:
      files:
        - Gemfile.lock
      prefix: $CI_JOB_NAME
    paths:
      - vendor/ruby

使用 cache:key:prefix 將前綴與為 cache:key:files 計(jì)算的 SHA 結(jié)合起來

cache:untracked

rspec:
  script: test
  cache:
    untracked: true
    paths:
      - binaries/

使用 untracked: true 緩存 Git 存儲(chǔ)庫中所有未跟蹤的文件

cache:when

rspec:
  script: rspec
  cache:
    paths:
      - rspec/
    when: 'always'

使用 cache:when 根據(jù)作業(yè)的狀態(tài)定義何時(shí)保存緩存

:---
on_succes(默認(rèn))僅當(dāng)作業(yè)成功時(shí)才保存緩存
on_failure僅在作業(yè)失敗時(shí)才保存緩存
always始終保存緩存

cache:policy

prepare-dependencies-job:
  stage: build
  cache:
    key: gems
    paths:
      - vendor/bundle
    policy: push
  script:
    - echo "此作業(yè)僅下載依賴項(xiàng)并構(gòu)建緩存"
    - echo "正在下載依賴..."

faster-test-job:
  stage: test
  cache:
    key: gems
    paths:
      - vendor/bundle
    policy: pull
  script:
    - echo "此作業(yè)腳本使用緩存,但不更新它"
    - echo "運(yùn)行測(cè)試..."

要更改緩存的上傳和下載行為,請(qǐng)使用 cache:policy 關(guān)鍵字

environment

environment:name

deploy to production:
  stage: deploy
  script: git push production HEAD:main
  environment:
    name: production

為環(huán)境設(shè)置名稱

environment:url

deploy to production:
  stage: deploy
  script: git push production HEAD:main
  environment:
    name: production
    url: https://prod.example.com

為環(huán)境設(shè)置 URL

environment:on_stop

關(guān)閉(停止)環(huán)境可以通過在環(huán)境下定義的 on_stop 關(guān)鍵字來實(shí)現(xiàn)。 它聲明運(yùn)行以關(guān)閉環(huán)境的不同作業(yè)

environment:action

stop_review_app:
  stage: deploy
  variables:
    GIT_STRATEGY: none
  script: make delete-app
  when: manual
  environment:
    name: review/$CI_COMMIT_REF_SLUG
    action: stop
:---
start 默認(rèn)值指示作業(yè)啟動(dòng)環(huán)境。在作業(yè)開始后創(chuàng)建的
prepare表示作業(yè)只是準(zhǔn)備環(huán)境。它不會(huì)觸發(fā)部署
stop指示作業(yè)停止部署
verify指示作業(yè)僅驗(yàn)證環(huán)境。它不會(huì)觸發(fā)部署
access指示作業(yè)僅訪問環(huán)境。它不會(huì)觸發(fā)部署

environment:auto_stop_in

review_app:
  script: deploy-review-app
  environment:
    name: review/$CI_COMMIT_REF_SLUG
    auto_stop_in: 1 day
  • 168 hours
  • 7 days
  • one week
  • never

auto_stop_in 關(guān)鍵字指定環(huán)境的生命周期。 當(dāng)環(huán)境到期時(shí),GitLab 會(huì)自動(dòng)停止它

environment:kubernetes

deploy:
  stage: deploy
  script: make deploy-app
  environment:
    name: production
    kubernetes:
      namespace: production

使用 kubernetes 關(guān)鍵字將部署配置到與您的項(xiàng)目關(guān)聯(lián)的 Kubernetes 集群

environment:deployment_tier

deploy:
  script: echo
  environment:
    name: customer-portal
    deployment_tier: production
  • production
  • staging
  • testing
  • development
  • other

動(dòng)態(tài) environment

deploy as review app:
  stage: deploy
  script: make deploy
  environment:
    name: review/$CI_COMMIT_REF_SLUG
    url: https://$CI_ENVIRONMENT_SLUG.example.com/

image

image:name

image:
  name: "registry.example.com/my/image:latest"

作業(yè)運(yùn)行所在的 Docker 鏡像的名稱。類似于它自己使用的鏡像

image:entrypoint

image:
  name: super/sql:experimental
  entrypoint: [""]

作為容器入口點(diǎn)執(zhí)行的命令或腳本

image:pull_policy

job1:
  script: echo "單一拉動(dòng)政策"
  image:
    name: ruby:3.0
    pull_policy: if-not-present

job2:
  script: echo "多重拉動(dòng)政策"
  image:
    name: ruby:3.0
    pull_policy: [always, if-not-present]

運(yùn)行器用于獲取 Docker 映像的拉取策略

needs

needs:artifacts

當(dāng)作業(yè)使用需求時(shí),它不再默認(rèn)下載先前階段的所有工件,因?yàn)橛行枨蟮淖鳂I(yè)可以在早期階段完成之前開始

test-job1:
  stage: test
  needs:
    - job: build_job1
      artifacts: true

test-job2:
  stage: test
  needs:
    - job: build_job2
      artifacts: false

test-job3:
  needs:
    - job: build_job1
      artifacts: true
    - job: build_job2
    - build_job3

needs:project

使用 needs:project 從其他管道中的最多五個(gè)作業(yè)下載工件。工件是從指定參考的最新成功管道下載的。要指定多個(gè)作業(yè),請(qǐng)將每個(gè)作業(yè)作為單獨(dú)的數(shù)組項(xiàng)添加到 needs 關(guān)鍵字下

build_job:
  stage: build
  script:
    - ls -lhR
  needs:
    - project: namespace/group/project-name
      job: build-1
      ref: main
      artifacts: true
    - project: namespace/group/project-name-2
      job: build-2
      ref: main
      artifacts: true

needs:pipeline:job

create-artifact:
  stage: build
  script: echo "sample artifact" > artifact.txt
  artifacts:
    paths: [artifact.txt]

child-pipeline:
  stage: test
  trigger:
    include: child.yml
    strategy: depend
  variables:
    PARENT_PIPELINE_ID: $CI_PIPELINE_ID

子管道可以從其父管道中的作業(yè)或同一父子管道層次結(jié)構(gòu)中的另一個(gè)子管道下載工件

needs:optional

要需要管道中有時(shí)不存在的作業(yè),請(qǐng)將 optional: true 添加到需求配置中。如果未定義,則可選:默認(rèn)為 false

build-job:
  stage: build

test-job1:
  stage: test

test-job2:
  stage: test
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

deploy-job:
  stage: deploy
  needs:
    - job: test-job2
      optional: true
    - job: test-job1
  environment: production

review-job:
  stage: deploy
  needs:
    - job: test-job2
      optional: true
  environment: review

needs:pipeline

您可以使用 needs:pipeline 關(guān)鍵字將管道狀態(tài)從上游管道鏡像到橋接作業(yè)

upstream_bridge:
  stage: test
  needs:
    pipeline: other/project

only / except

only:refs / except:refs

job1:
  script: echo
  only:
    - main
    - /^issue-.*$/
    - merge_requests

job2:
  script: echo
  except:
    - main
    - /^stable-branch.*$/
    - schedules

使用 only:refsexcept:refs 關(guān)鍵字來控制何時(shí)根據(jù)分支名稱或管道類型將作業(yè)添加到管道

only:variables / except:variables

deploy:
  script: cap staging deploy
  only:
    variables:
      - $RELEASE == "staging"
      - $STAGING

根據(jù) CI/CD 變量的狀態(tài),使用 only:variables 或 except:variables 關(guān)鍵字來控制何時(shí)將作業(yè)添加到管道

only:changes / except:changes

docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  only:
    refs:
      - branches
    changes:
      - Dockerfile
      - docker/scripts/*
      - dockerfiles/**/*
      - more_scripts/*.{rb,py,sh}
      - "**/*.json"

當(dāng) Git 推送事件修改文件時(shí),使用 changes 關(guān)鍵字僅運(yùn)行作業(yè),或使用 except 跳過作業(yè)

only:kubernetes / except:kubernetes

deploy:
  only:
    kubernetes: active

使用 only:kubernetesexcept:kubernetes 來控制當(dāng) Kubernetes 服務(wù)在項(xiàng)目中處于活動(dòng)狀態(tài)時(shí)是否將作業(yè)添加到管道中

release

release 參考

:---
release:tag_name發(fā)布的 Git 標(biāo)簽
release:tag_message指定的消息進(jìn)行注釋
release:name發(fā)布名稱
release:description版本的詳細(xì)描述
release:ref發(fā)布的 ref
release:milestones每個(gè)里程碑的標(biāo)題
release:released_at發(fā)布準(zhǔn)備就緒的日期和時(shí)間

release:tag_name

job:
  script: echo "為新標(biāo)簽運(yùn)行發(fā)布作業(yè)"
  release:
    tag_name: $CI_COMMIT_TAG
    description: 'Release description'
  rules:
    - if: $CI_COMMIT_TAG

必需的。發(fā)布的 Git 標(biāo)簽

release:tag_message

release_job:
  stage: release
  release:
    tag_name: $CI_COMMIT_TAG
    description: 'Release description'
    tag_message: 'Annotated tag message'

如果標(biāo)簽不存在,則新創(chuàng)建的標(biāo)簽將使用 tag_message 指定的消息進(jìn)行注釋

release:name

release_job:
  stage: release
  release:
    name: 'Release $CI_COMMIT_TAG'

發(fā)布名稱。如果省略,它會(huì)填充 release:tag_name 的值

release:description

job:
  release:
    tag_name: ${MAJOR}_${MINOR}_${REVISION}
    description: './path/to/CHANGELOG.md'

版本的詳細(xì)描述

release:ref

發(fā)布的 ref,如果發(fā)布:tag_name 尚不存在

release:milestones

與版本關(guān)聯(lián)的每個(gè)里程碑的標(biāo)題

release:released_at

released_at: '2021-03-15T08:00:00Z'

發(fā)布準(zhǔn)備就緒的日期和時(shí)間

assets:
  links:
    - name: 'asset1'
      url: 'https://example.com/assets/1'
    - name: 'asset2'
      url: 'https://example.com/assets/2'
      filepath: '/pretty/url/1' # 可選的
      link_type: 'other' # 可選的

使用 release:assets:links 在發(fā)布中包含資產(chǎn)鏈接

rules

rules:if

job:
  script: echo "Hello, Rules!"
  rules:
    - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
      when: never
    - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/
      when: manual
      allow_failure: true
    - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME

使用 rules:if 子句指定何時(shí)將作業(yè)添加到管道

rules:changes

docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      changes:
        - Dockerfile
      when: manual
      allow_failure: true

使用 rules:changes 通過檢查對(duì)特定文件的更改來指定何時(shí)將作業(yè)添加到管道

rules:changes:paths

docker-build-1:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      changes:
        - Dockerfile

docker-build-2:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      changes:
        paths:
          - Dockerfile

使用 rules:changes 指定僅在更改特定文件時(shí)將作業(yè)添加到管道,并使用 rules:changes:paths 指定文件

rules:changes:compare_to

docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      changes:
        paths:
          - Dockerfile
        compare_to: 'refs/heads/branch1'

使用 rules:changes:compare_to 指定要比較哪個(gè) ref 來比較 rules:changes:paths 下列出的文件的更改

rules:exists

job:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - exists:
        - Dockerfile

當(dāng)存儲(chǔ)庫中存在某些文件時(shí),使用 exists 運(yùn)行作業(yè)

rules:allow_failure

job:
  script: echo "Hello, Rules!"
  rules:
    - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
      when: manual
      allow_failure: true

在規(guī)則中使用 allow_failure: true 允許作業(yè)失敗而不停止管道

rules:variables

job:
  variables:
    DEPLOY_VARIABLE: "default-deploy"
  rules:
    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
      variables:                              # 覆蓋定義的 DEPLOY_VARIABLE
        DEPLOY_VARIABLE: "deploy-production"  # 在工作層面
    - if: $CI_COMMIT_REF_NAME =~ /feature/
      variables:
        IS_A_FEATURE: "true"                  # 定義一個(gè)新變量
  script:
    - echo "以 $DEPLOY_VARIABLE 作為參數(shù)運(yùn)行腳本"
    - echo "如果 $IS_A_FEATURE 存在則運(yùn)行另一個(gè)腳本"

在規(guī)則中使用變量來為特定條件定義變量