我正试图根据分支的名称在gitlab-ci.yaml中创建一个变量。
假设我正在推送一个名为3.2.7
的分支
情况如下:
include:
- template: "Workflows/Branch-Pipelines.gitlab-ci.yml"
variables:
PRODUCTION_BRANCH: "master"
STAGING_BRANCH: (d).(d).(d)
.deploy_rules:
rules:
- if: '$CI_COMMIT_BRANCH =~ /$STAGING_BRANCH/'
variables:
SERVER_PORT: 3007 # TODO: should be 300d ; d is the second digit
我想使用正则表达式匹配生成3002
内联。
我该怎么做?
我已经做了一些研究,似乎我必须使用sed
,但我不确定这是否是最好的方法以及如何做到
简化问题
include:
- template: "Workflows/Branch-Pipelines.gitlab-ci.yml"
variables:
TEST_VAR: sed -E 's/(d).(d).(d)/3002/gm;t;d' <<< $CI_COMMIT_BRANCH
stages:
- temp
temp:
stage: temp
script:
- echo $TEST_VAR
应回显3002
,但它正在回显sed -E 's/(d).(d).(d)/3002/gm;t;d' <<< 3.2.7
您不能在正则表达式模式中使用变量。您只需要逐字逐句地编写regex,它不能直接参数化。您也不能在variables:
或yaml的其他部分中使用sed
或其他Linux实用程序。您必须遵守YAML规范和GitLab提供的功能的限制。
但是,有一个选项可供您选择,它将适合您所陈述的用例。
动态变量
TEST_VAR:sed-E的/(\d(。(\d(。(\d(/300\2/gm;t;d'<lt<CI_COMMIT_BRANCH
虽然不能在variables:
声明中直接使用sed
或其他实用程序,但可以通过artifacts:reports:dotenv
使用dotenv工件来动态设置变量。
例如,作业可以使用sed
或您喜欢的任何其他实用程序来创建将由管道的其余部分使用的变量。
stages:
- temp
create_variables:
stage: .pre
script:
- TEST_VAR="$(sed -E 's/(d).(d).(d)/3002/gm;t;d' <<< ${CI_COMMIT_BRANCH})"
- echo "TEST_VAR=${TEST_VAR}" >> dotenv.txt
artifacts:
reports:
dotenv: dotenv.txt
temp:
stage: temp
script:
- echo $TEST_VAR
这里,使用.pre
阶段,这是一个特殊阶段,总是在每隔一个阶段之前排序。create_variables
作业中的dotenv工件将为接收工件的后续阶段中的作业动态创建变量。