如何在 gitlabci 上使用 if-else 条件

如何在 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 loop)的文档?

169820 次浏览

我觉得你应该加个分号然后在结尾结束“ fi”。 我找不到文档的链接。

script:
- (if [ "$flag" == "true" ]; then kubectl apply -f demo1 --record=true; else kubectl apply -f demo2 --record=true; fi);

Hereunder three syntax options for that kind of statement. From gitlab-ci 文件 :

使用 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

Using shell variable with yaml multiline block

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

你可以考虑检查 规矩

它允许按顺序计算单个规则对象的列表,直到匹配并动态地为作业提供属性。

现有的规则条款包括:

  • If (类似于只有: 变量)
  • 更改(仅与更改相同)
  • 存在

例如:

job:
script: "echo Hello, Rules!"
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
when: always
- if: '$VAR =~ /pattern/'
when: manual
- when: on_success

In addition, in the case of a multiline block if you want or need to preserve line breaks you can use the pipe character:

script: |
if [ "$flag" == "true" ]; then
kubectl apply -f demo1 --record=true
else
kubectl apply -f demo2 --record=true
fi

更深入的话,请访问 https://yaml-multiline.info/

注意,对于 GitLab 13.3(2020年8月) ,if-else 规则语法有所改进:

CI/CD 规则: 如果支持带括号的逻辑表达式

如果 if子句中使用 rules关键字,那么它现在甚至更强大了,支持由管道处理器计算的括号表达式。

可以使用更复杂、更有效的 AND (&&)/OR (||)表达式,使管道规则更符合逻辑、功能更强大且更易于管理。

参见 文件Issue


以及 GitLab 13.8(2021年1月)

支持管道规则的变量

以前,rules关键字的作用域是有限的,只能确定作业是应该包含在管道中还是应该排除在管道之外。在这个版本中,您现在可以决定是否满足某些条件并随后重写作业中的变量,从而在配置管道时提供更大的灵活性。

https://about.gitlab.com/images/13_8/var.png -- Support variables for pipeline rules

参见 文件Issue


连同 GitLab 13.12(2021年5月) :

支持 CI/CD 管道中的变量‘工作流: 规则’

以前,rules关键字的作用域是有限的,只能确定作业是应该包含在管道中还是应该排除在管道之外。在 13.8秒中,我们添加了使用 variables关键字和 rules来设置作业中基于哪个规则匹配的变量值的能力。

In this release we’ve extended this ability to workflow: rules, so you can set variable values for the whole pipeline if certain conditions match.
这有助于使管道更加灵活。

https://about.gitlab.com/images/13_12/variable.png -- Support variables in CI/CD pipeline 'workflow:rules'

参见 Documentation问题

当我使用基于 powershell的 gitlab 脚本时,这对我很有用:

script:
- 'if ($flag -eq "true") { kubectl apply -f demo1 --record=true; } else { kubectl apply -f demo2 --record=true; }'