本備忘單總結(jié)了 GitLab CI/CD 常用的配置說明,以供快速參考
創(chuàng)建并運(yùn)行您的第一個(gè) GitLab CI/CD 管道,在開始之前,請(qǐng)確保您擁有:
如果您沒有項(xiàng)目,可以在 https://gitlab.com 上免費(fèi)創(chuàng)建一個(gè)公共項(xiàng)目
.gitlab-ci.yml 文件。該文件是您定義 CI/CD 作業(yè)的地方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)鍵字 | 描述 |
|---|---|
| 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 腳本 # |
| secrets | CI/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è) # |
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:
- local: '/temp/.gitlab-ci-template.yml'
在 11.4 中移至 GitLab 免費(fèi)版,使用 include 將外部 YAML 文件包含在您的 CI/CD 配置中
include:
- local: '/temp/.gitlab-ci-template.yml'
使用 include:local 包含與 .gitlab-ci.yml 文件位于同一存儲(chǔ)庫中的文件
要在同一個(gè) GitLab 實(shí)例上包含來自另一個(gè)私有項(xiàng)目的文件,請(qǐng)使用 include:project 和 include: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: 'https://gitlab.com/example-project/-/raw/main/.gitlab-ci.yml'
使用帶有完整 URL 的 include:remote 來包含來自不同位置的文件
使用 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
您可以在 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:
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 關(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
在每個(gè)作業(yè)(包括失敗的作業(yè))之后運(yùn)行的命令數(shù)組
job:
script:
- echo "示例腳本部分"
after_script:
- echo "在“script”部分完成后執(zhí)行此命令"
確定管道是否應(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
控制何時(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
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è)的階段必須快
在每個(gè)作業(yè)的 script 命令之前運(yùn)行,但在工件恢復(fù)之后運(yùn)行
job:
before_script:
- echo "在任何“script:”命令之前執(zhí)行此命令"
script:
- echo "“before_script”命令之后執(zhí)行"
job1:
script: rspec
coverage: '/Code coverage: \d+\.\d+/'
使用自定義正則表達(dá)式的覆蓋率來配置如何從作業(yè)輸出中提取代碼覆蓋率
.tests:
script: rake test
stage: test
only:
refs:
- branches
rspec:
extends: .tests
script: rake rspec
only:
variables:
- $RSPEC
使用 extends 重用配置部分。 它是 YAML 錨點(diǎn)的替代品,并且更加靈活和可讀
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 控制默認(rèn)關(guān)鍵字和變量的繼承
使用 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 控制全局變量關(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
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:
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)容上傳到 GitLab 的 GitLab Pages 作業(yè)。然后將內(nèi)容發(fā)布為網(wǎng)站
test:
script: rspec
parallel: 5
使用 parallel 在單個(gè)管道中并行多次運(yùn)行作業(yè)
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í)例具有不同的變量值
deploy-to-production:
script: deploy
resource_group: production
創(chuàng)建一個(gè)資源組,以確保作業(yè)在同一項(xiàng)目的不同管道之間互斥
job:
tags:
- ruby
- postgres
使用標(biāo)簽從項(xiàng)目可用的所有運(yùn)行器列表中選擇特定運(yùn)行器
test:
script: rspec
retry: 2
使用 retry 配置作業(yè)失敗時(shí)重試的次數(shù)。如果未定義,則默認(rèn)為 0,并且作業(yè)不會(huì)重試
test:
script: rspec
retry:
max: 2
when: runner_system_failure
使用 retry:when 和 retry:max 來重試特定失敗案例的作業(yè)。 retry:max 是最大重試次數(shù),和retry一樣,可以是0、1、2
job1:
script: "bundle exec rspec"
job2:
script:
- uname -a
- bundle exec rspec
使用腳本指定運(yùn)行器執(zhí)行的命令
此關(guān)鍵字必須與 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 將秘密配置為存儲(chǔ)為文件或變量類型的 CI/CD 變量
job:
secrets:
DATABASE_PASSWORD:
vault: production/db/password@ops
file: false
build:
script: build.sh
timeout: 3 hours 30 minutes
test:
script: rspec
timeout: 3h 30m
為特定作業(yè)配置超時(shí)。 如果作業(yè)運(yùn)行時(shí)間超過超時(shí)時(shí)間,則作業(yè)失敗
使用服務(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
運(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]
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
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)行"
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)行"
聲明一個(gè)作業(yè)是一個(gè)“觸發(fā)作業(yè)”
trigger-multi-project-pipeline:
trigger: my-group/my-project
trigger-child-pipeline:
trigger:
include: path/to/child-pipeline.gitlab-ci.yml
聲明作業(yè)是啟動(dòng)子管道的“觸發(fā)器作業(yè)”
trigger-multi-project-pipeline:
trigger:
project: my-group/my-project
聲明作業(yè)是啟動(dòng)多項(xiàng)目管道的“觸發(fā)器作業(yè)”
trigger-multi-project-pipeline:
trigger:
project: my-group/my-project
branch: development
強(qiáng)制觸發(fā)作業(yè)等待下游管道完成后再標(biāo)記為成功
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
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:
DEPLOY_ENVIRONMENT:
description: "部署目標(biāo)。 如果需要,將此變量更改為“canary”或“production”"
value: "staging"
variables:
VAR1: value1
VAR2: value2 $VAR1
VAR3:
value: value3 $VAR1
expand: false
使用 expand 關(guān)鍵字將變量配置為可擴(kuò)展或不可擴(kuò)展
使用 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 |
使用工件指定要將哪些文件另存為作業(yè) artifacts。作業(yè) artifacts 是作業(yè)成功、失敗或始終附加到作業(yè)的文件和目錄的列表
路徑是相對(duì)于項(xiàng)目目錄($CI_PROJECT_DIR)的,不能直接鏈接到項(xiàng)目目錄之外
job:
artifacts:
paths:
- binaries/
- .config
防止將文件添加到 artifacts 存檔中
artifacts:
paths:
- binaries/
exclude:
- binaries/**/*.o
指定作業(yè) artifacts 在它們過期和被刪除之前存儲(chǔ)多長時(shí)間
job:
artifacts:
expire_in: 1 week
使用 artifacts:expose_as 關(guān)鍵字在合并請(qǐng)求 UI 中公開作業(yè) artifacts
test:
script: ["echo 'test' > file.txt"]
artifacts:
expose_as: 'artifact 1'
paths: ['file.txt']
定義創(chuàng)建的 artifacts 存檔的名稱。您可以為每個(gè)存檔指定一個(gè)唯一的名稱
job:
artifacts:
name: "job1-artifacts-file"
paths:
- binaries/
確定作業(yè)工件是否應(yīng)該公開可用
job:
artifacts:
public: false
收集作業(yè)中包含的模板生成的 artifacts
rspec:
stage: test
script:
- bundle install
- rspec --format RspecJunitFormatter --out rspec.xml
artifacts:
reports:
junit: rspec.xml
將所有 Git 未跟蹤文件添加為 artifacts(連同在 artifacts:paths 中定義的路徑)
job:
artifacts:
untracked: true
作業(yè)失敗或盡管失敗時(shí)上傳 artifacts
job:
artifacts:
when: on_failure
rspec:
script:
- echo "此作業(yè)使用緩存"
cache:
key: binaries-cache
paths:
- binaries/*.apk
- .config
關(guān)鍵字來選擇要緩存的文件或目錄
為每個(gè)緩存提供唯一的標(biāo)識(shí)鍵。 使用相同緩存鍵的所有作業(yè)都使用相同的緩存,包括在不同的管道中
cache-job:
script:
- echo "此作業(yè)使用緩存"
cache:
key: binaries-cache-$CI_COMMIT_REF_SLUG
paths:
- binaries/
cache:key:filescache-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:prefixrspec:
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é)合起來
rspec:
script: test
cache:
untracked: true
paths:
- binaries/
使用 untracked: true 緩存 Git 存儲(chǔ)庫中所有未跟蹤的文件
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 | 始終保存緩存 |
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)鍵字
deploy to production:
stage: deploy
script: git push production HEAD:main
environment:
name: production
為環(huán)境設(shè)置名稱
deploy to production:
stage: deploy
script: git push production HEAD:main
environment:
name: production
url: https://prod.example.com
為環(huán)境設(shè)置 URL
關(guān)閉(停止)環(huán)境可以通過在環(huán)境下定義的 on_stop 關(guān)鍵字來實(shí)現(xiàn)。 它聲明運(yùn)行以關(guān)閉環(huán)境的不同作業(yè)
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ā)部署 |
review_app:
script: deploy-review-app
environment:
name: review/$CI_COMMIT_REF_SLUG
auto_stop_in: 1 day
168 hours7 daysone weekneverauto_stop_in 關(guān)鍵字指定環(huán)境的生命周期。 當(dāng)環(huán)境到期時(shí),GitLab 會(huì)自動(dòng)停止它
deploy:
stage: deploy
script: make deploy-app
environment:
name: production
kubernetes:
namespace: production
使用 kubernetes 關(guān)鍵字將部署配置到與您的項(xiàng)目關(guān)聯(lián)的 Kubernetes 集群
deploy:
script: echo
environment:
name: customer-portal
deployment_tier: production
productionstagingtestingdevelopmentotherdeploy as review app:
stage: deploy
script: make deploy
environment:
name: review/$CI_COMMIT_REF_SLUG
url: https://$CI_ENVIRONMENT_SLUG.example.com/
image:
name: "registry.example.com/my/image:latest"
作業(yè)運(yùn)行所在的 Docker 鏡像的名稱。類似于它自己使用的鏡像
image:
name: super/sql:experimental
entrypoint: [""]
作為容器入口點(diǎn)執(zhí)行的命令或腳本
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 映像的拉取策略
當(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 從其他管道中的最多五個(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
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è)子管道下載工件
要需要管道中有時(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 關(guān)鍵字將管道狀態(tài)從上游管道鏡像到橋接作業(yè)
upstream_bridge:
stage: test
needs:
pipeline: other/project
job1:
script: echo
only:
- main
- /^issue-.*$/
- merge_requests
job2:
script: echo
except:
- main
- /^stable-branch.*$/
- schedules
使用 only:refs 和 except:refs 關(guān)鍵字來控制何時(shí)根據(jù)分支名稱或管道類型將作業(yè)添加到管道
deploy:
script: cap staging deploy
only:
variables:
- $RELEASE == "staging"
- $STAGING
根據(jù) CI/CD 變量的狀態(tài),使用 only:variables 或 except:variables 關(guān)鍵字來控制何時(shí)將作業(yè)添加到管道
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è)
deploy:
only:
kubernetes: active
使用 only:kubernetes 或 except:kubernetes 來控制當(dāng) Kubernetes 服務(wù)在項(xiàng)目中處于活動(dòng)狀態(tài)時(shí)是否將作業(yè)添加到管道中
| :- | -- |
|---|---|
| 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í)間 |
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_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_job:
stage: release
release:
name: 'Release $CI_COMMIT_TAG'
發(fā)布名稱。如果省略,它會(huì)填充 release:tag_name 的值
job:
release:
tag_name: ${MAJOR}_${MINOR}_${REVISION}
description: './path/to/CHANGELOG.md'
版本的詳細(xì)描述
發(fā)布的 ref,如果發(fā)布:tag_name 尚不存在
與版本關(guān)聯(lián)的每個(gè)里程碑的標(biāo)題
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)鏈接
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è)添加到管道
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è)添加到管道
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 指定文件
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 下列出的文件的更改
job:
script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
rules:
- exists:
- Dockerfile
當(dāng)存儲(chǔ)庫中存在某些文件時(shí),使用 exists 運(yùn)行作業(yè)
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è)失敗而不停止管道
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ī)則中使用變量來為特定條件定義變量
感谢您访问我们的网站,您可能还对以下资源感兴趣:
国产成人精品999视频&日本一区二区亚洲人妻精品&久久久精品国产99久久精&99热这里只有成人精品国产&精品国产剧情av一区二区&成人亚洲精品久久久久app&国产精品美女高潮抽搐A片