[英]Conditional variables in gitlab-ci.yml
根據構建來自的分支,我需要使用稍微不同的命令行參數。 特別是我想在從分支構建時上傳快照關系工件,並在構建主時釋放工件。
有沒有辦法有條件地改變變量?
我嘗試使用像這樣的 except/only 關鍵字
stages:
- stage
variables:
TYPE: Release
.upload_common:
stage: stage
tags: ["Win"]
script:
- echo Uploading %TYPE%
.upload_snapshot:
variables:
TYPE: "Snapshot"
except:
- master
upload:
extends:
- .upload_common
- .upload_snapshot
不幸的是,它在構建 master 時跳過了整個上傳步驟。
我在這里使用“擴展”模式的原因是我有 win 和 mac 平台,它們使用稍微不同的變量替換語法($ vs %)。 我還有一些不同的構建配置 - 調試/發布,32 位/64 位。
下面的代碼確實有效,但我不得不重復發布和快照的步驟,一次啟用一個。
stages:
- stage
.upload_common:
stage: stage
tags: ["Win"]
script:
- echo Uploading %TYPE%
.upload_snapshot:
variables:
TYPE: "Snapshot"
except:
- master
.upload_release:
variables:
TYPE: "Release"
only:
- master
upload_release:
extends:
- .upload_common
- .upload_release
upload_snapshot:
extends:
- .upload_common
- .upload_snapshot
當快照/發布配置乘以調試/發布、Mac/Win 和 32/64 位時,代碼會變得更大。 我想保持最少的配置數量。
有條件地改變幾個變量的能力將幫助我減少很多代碼。
GitLab 13.7 中的另一個新增功能是rules:variables 。 這允許設置變量的一些邏輯:
job:
variables:
DEPLOY_VARIABLE: "default-deploy"
rules:
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
variables: # Override DEPLOY_VARIABLE defined
DEPLOY_VARIABLE: "deploy-production" # at the job level.
- if: $CI_COMMIT_REF_NAME =~ /feature/
variables:
IS_A_FEATURE: "true" # Define a new variable.
script:
- echo "Run script with $DEPLOY_VARIABLE as an argument"
- echo "Run another script if $IS_A_FEATURE exists"
不幸的是,到目前為止,YAML錨或GitLab-CI的extends
似乎不允許在命令的script
數組中進行組合。
我將內置變量CI_COMMIT_REF_NAME
與全局或僅作業的before_script
結合使用來解決類似的任務,而無需重復自己的工作。
這是我的解決方法示例,該方法解決了如何在交付或部署過程中為PROD和DEV動態地將環境變量設置為不同的值:
.provide ssh private deploy key: &provide_ssh_private_deploy_key
before_script:
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
- |
if [ "$CI_COMMIT_REF_NAME" == "master" ]; then
echo "$SSH_PRIVATE_DEPLOY_KEY_PROD" > ~/.ssh/id_rsa
MY_DYNAMIC_VAR="we are in master (PROD)"
else
echo "$SSH_PRIVATE_DEPLOY_KEY_DEV" > ~/.ssh/id_rsa
MY_DYNAMIC_VAR="we are NOT in master (DEV)"
fi
- chmod 600 ~/.ssh/id_rsa
deliver-via-ssh:
stage: deliver
<<: *provide_ssh_private_deploy_key
script:
- echo Stage is deliver
- echo $MY_DYNAMIC_VAR
- ssh ...
另外,請考慮以下解決方法以串聯“腳本”命令: https : //stackoverflow.com/a/57209078/470108
希望它會有所幫助。
為其他作業准備變量的一個好方法是dotenv report artifact 。 不幸的是,這些變量在很多地方都不能使用,但是如果您只需要從其他作業腳本訪問它們,則是這樣:
# prepare environment variables for other jobs
env:
stage: .pre
script:
# Set application version from GIT tag or fake it
- echo "APPVERSION=${CI_COMMIT_TAG:-0.1-dev-$CI_COMMIT_REF_SLUG}+$CI_COMMIT_SHORT_SHA" | tee -a .env
artifacts:
reports:
dotenv: .env
在此作業的腳本中,您可以有條件地准備環境值並將其寫入文件,然后從中制作 dotenv 工件。 后續 - 或者更好的依賴- 作業將從那里獲取腳本的變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.