如何在 gitlab-CI 中使用 if else 条件。
我有以下代码:
deploy-dev:
image: testimage
environment: dev
tags:
- kubectl
script:
- kubectl apply -f demo1 --record=true
- kubectl apply -f demo2 --record=true
现在我想添加一个类似这样的条件
script:
- (if [ "$flag" == "true" ]; then kubectl apply -f demo1 --record=true; else kubectl apply -f demo2 --record=true);
有人可以提供正确的语法吗? gitlabci 中的条件(if-else、for 循环)是否有任何文档?
if
行周围加上括号?
下面是这种语句的三个语法选项。从 gitlab-ci documentation :
使用 shell 变量
deploy-dev:
image: testimage
environment: dev
tags:
- kubectl
script:
- if [ "$flag" == "true" ]; then MODULE="demo1"; else MODULE="demo2"; fi
- kubectl apply -f ${MODULE} --record=true
使用带有 yaml 多行块的 shell 变量
deploy-dev:
image: testimage
environment: dev
tags:
- kubectl
script:
- >
if [ "$flag" == "true" ]; then
kubectl apply -f demo1 --record=true
else
kubectl apply -f demo2 --record=true
fi
使用 gitlab 规则
workflow:
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
when: never
- if: '$CI_PIPELINE_SOURCE == "push"'
when: never
- when: always
使用 gitlab 模板和变量
demo1-deploy-dev:
extends: .deploy-dev
only:
variables: [ $flag == "true" ]
variables:
MODULE: demo1
demo2-deploy-dev:
extends: .deploy-dev
only:
variables: [ $flag == "false" ]
variables:
MODULE: demo2
.deploy-dev:
image: testimage
environment: dev
tags:
- kubectl
script:
- kubectl apply -f ${MODULE} --record=true
请注意,使用 GitLab 13.3(2020 年 8 月)对 if-else 规则语法进行了改进:
CI/CD 规则:if 支持带括号的逻辑表达式 如果您将 rules 关键字与 if 子句一起使用,它现在更加强大,支持由管道处理器评估的括号表达式。您可以使用更复杂、更高效的 AND (&&) / OR (||) 表达式,使您的管道规则更符合逻辑、更强大且更易于管理。请参阅文档和问题。
并且,使用 GitLab 13.8(2021 年 1 月)
管道规则的支持变量 以前,rules 关键字的范围有限,仅确定作业是否应包含在管道中或从管道中排除。在此版本中,您现在可以决定是否满足某些条件并随后覆盖作业中的变量,从而在配置管道时为您提供更大的灵活性。请参阅文档和问题。
使用 GitLab 13.12(2021 年 5 月):
CI/CD 管道'workflow:rules' 中的支持变量 以前,rules 关键字的范围有限,仅确定是否应从管道中包含或排除作业。在 13.8 中,我们添加了将 variables 关键字与规则一起使用的功能,以根据匹配的规则在作业中设置变量值。在此版本中,我们将此功能扩展到工作流:规则,因此如果某些条件匹配,您可以为整个管道设置变量值。这可以帮助您使您的管道更加灵活。请参阅文档和问题。
我认为您只需要添加一个分号并在最后关闭“fi”即可。我找不到文档链接。
script:
- (if [ "$flag" == "true" ]; then kubectl apply -f demo1 --record=true; else kubectl apply -f demo2 --record=true; fi);
您可以考虑检查 rules
它允许按顺序评估单个规则对象的列表,直到一个匹配并动态地为作业提供属性。
可用的规则条款包括:
if (类似于 only:variables)
更改(仅与:更改相同)
存在
例子:
job:
script: "echo Hello, Rules!"
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
when: always
- if: '$VAR =~ /pattern/'
when: manual
- when: on_success
此外,在多行块的情况下,如果您想要或需要保留换行符,您可以使用管道字符:
script: |
if [ "$flag" == "true" ]; then
kubectl apply -f demo1 --record=true
else
kubectl apply -f demo2 --record=true
fi
要深入了解,请访问 https://yaml-multiline.info/
在使用基于 powershell
的 gitlab 脚本时,这对我有用:
script:
- 'if ($flag -eq "true") { kubectl apply -f demo1 --record=true; } else { kubectl apply -f demo2 --record=true; }'
不定期副业成功案例分享
only: variables: [ $flag == "true" ]
extends
关键字。你是对的,'。前缀作业不被执行并充当模板,或者在这里说一个抽象作业。我已经修复了我的示例。希望现在更清楚了。- |
与- >
相似,只是它将保持内容多行而不是将其连接成单行并穿插有;