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

Vik*_*ore 12 if-statement gitlab-ci

如何在gitlab-CI内部使用else条件。

我有以下代码:

deploy-dev:
  image: testimage
  environment: dev
  tags:
    - kubectl
  script:
   - kubectl apply -f demo1 --record=true
   - kubectl apply -f demo2 --record=true
Run Code Online (Sandbox Code Playgroud)

现在我想添加一个类似这样的条件

script:
    - (if [ "$flag" == "true" ]; then kubectl apply -f demo1 --record=true; else kubectl apply -f demo2 --record=true);
Run Code Online (Sandbox Code Playgroud)

有人可以提供相同的正确语法吗?gitlabci中是否有关于条件(if-else,for循环)的文档?

Xav*_*r D 29

在下文中,针对该语句的三个语法选项。

使用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
Run Code Online (Sandbox Code Playgroud)

使用Yaml多行块

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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

  • 还有“- |”,它与“->”类似,只是它会将内容保留为多行,而不是将其连接成单行,并散布“;” (5认同)

小智 11

此外,在多行块的情况下,如果您想要或需要保留换行符,您可以使用管道字符:

script: |
    if [ "$flag" == "true" ]; then
      kubectl apply -f demo1 --record=true
    else
      kubectl apply -f demo2 --record=true
    fi
Run Code Online (Sandbox Code Playgroud)

要深入了解,请访问https://yaml-multiline.info/


Von*_*onC 9

请注意,在GitLab 13.3(2020 年 8 月)中,对 if-else 规则语法进行了改进:

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

如果您使用rules关键字 withif子句,它现在更加强大,支持由管道处理器评估的括号表达式。

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

请参阅文档问题


并且,使用GitLab 13.8(2021 年 1 月)

管道规则的支持变量

以前,该rules关键字的范围有限,只能确定是否应从管道中包含或排除作业。在此版本中,您现在可以决定是否满足某些条件并随后覆盖作业中的变量,从而在配置管道时为您提供更大的灵活性。

https://about.gitlab.com/images/13_8/var.png -- 支持管道规则的变量

请参阅文档问题


使用GitLab 13.12(2021 年 5 月):

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

以前,该rules关键字的范围有限,只能确定是否应从管道中包含或排除作业。在 13.8 中,我们添加了使用variables关键字 withrules根据匹配的规则在作业中设置变量值的功能。

在此版本中,我们已将此功能扩展到workflow: rules,因此您可以在某些条件匹配时为整个管道设置变量值。
这有助于您使管道更加灵活。

https://about.gitlab.com/images/13_12/variable.png -- 支持 CI/CD 管道“workflow:rules”中的变量

请参阅文档问题


Ami*_*our 5

我认为你需要在末尾添加一个分号并关闭“fi”。我找不到文档的链接。

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