[英]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.