ChatGPT解决这个技术问题 Extra ChatGPT

如何在 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 循环)是否有任何文档?

为什么要在 if 行周围加上括号?

B
Blue

下面是这种语句的三个语法选项。从 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

在最后一个示例中,您如何检查 $flag 的值?
@RogerCollAumatell:即使用 only: variables: [ $flag == "true" ]
@XavierD:我无法理解最后一个例子。看起来正在为 MODULE 设置一个变量,该变量在基于 $flag 的 .deploy-dev 中使用,但究竟是什么原因导致 .deploy-dev 运行? (我认为“。”前缀意味着该部分被跳过(隐藏)?
谢谢@Cognitiaclaeves。职位定义中确实缺少 extends 关键字。你是对的,'。前缀作业不被执行并充当模板,或者在这里说一个抽象作业。我已经修复了我的示例。希望现在更清楚了。
还有 - |- > 相似,只是它将保持内容多行而不是将其连接成单行并穿插有 ;
k
kfrisbie

请注意,使用 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 关键字与规则一起使用的功能,以根据匹配的规则在作业中设置变量值。在此版本中,我们将此功能扩展到工作流:规则,因此如果某些条件匹配,您可以为整个管道设置变量值。这可以帮助您使您的管道更加灵活。请参阅文档和问题。


A
Amina Mansour

我认为您只需要添加一个分号并在最后关闭“fi”即可。我找不到文档链接。

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

A
Arihant Godha

您可以考虑检查 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

使用 =~ 模式匹配非常有用。如果您决定在变量中使用该模式,请注意此正则表达式模式匹配的局限性:gitlab.com/gitlab-org/gitlab/-/issues/35438
A
Alex D

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

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

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


E
Eternal21

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

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