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

If statement 如何在gitlabci上使用if-else条件,if-statement,gitlab-ci,If Statement,Gitlab Ci,如何在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" == "tr

如何在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中是否有关于条件(如果有,则为循环)的文档?

我认为您只需要添加一个分号,并在末尾结束“fi”。 我找不到指向文档的链接

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

下面是该类语句的三种语法选项。来自gitlab ci:

使用shell变量 将shell变量与yaml多行块一起使用 使用gitlab规则 使用gitlab模板和变量
<>你可以考虑检查< /P> 它允许按顺序计算单个规则对象的列表,直到其中一个对象匹配并动态地向作业提供属性为止

可用的规则条款包括:

  • 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

此外,对于多行块,如果希望或需要保留换行符,可以使用管道字符:

script: |
    if [ "$flag" == "true" ]; then
      kubectl apply -f demo1 --record=true
    else
      kubectl apply -f demo2 --record=true
    fi
要深入了解,请访问

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

CI/CD规则:如果支持带括号的逻辑表达式 If
rules
关键字与
If
子句一起使用,它现在功能更加强大,支持由管道处理器计算的括号表达式

您可以使用更复杂、更高效的and(
&;
)/或(
|
)表达式,使管道规则更具逻辑性、功能更强大、更易于管理

见和


以及(2021年1月)

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

见和


(2021年5月):

CI/CD管道“工作流:规则”中的支持变量 以前,
规则
关键字的范围是有限的,仅确定作业是否应包括在管道中或从管道中排除,我们添加了使用
变量
关键字和
规则
来设置作业中的变量值的功能,该变量值基于匹配的规则

在此版本中,我们将此功能扩展到了
工作流:规则
,因此,如果某些条件匹配,您可以为整个管道设置变量值。
这有助于使管道更加灵活

见和


为什么要在
if
行周围加括号?在上一个示例中,如何检查$flag的值?@RogerCollAumatell:即,仅使用
变量:[$flag==“true”]
@XavierD:我无法浏览最后一个示例。似乎正在为模块设置一个变量,该模块在基于$flag的.deploy dev中使用,但到底是什么导致.deploy dev运行?(我认为“.”前缀意味着该节被跳过(隐藏)?谢谢@Cogniticlaeves。实际上,作业定义中缺少了
扩展
关键字。你是对的,带“.”前缀的作业没有被执行,在这里充当模板或抽象作业。我已经修复了我的示例。希望现在更清楚。还有
-|
->
类似,只是它会保留内容多行,而不是使用=~模式匹配将其连接成一行,中间穿插着
。如果您决定在变量中使用该模式,请注意此正则表达式模式匹配的限制:
workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
      when: never
    - if: '$CI_PIPELINE_SOURCE == "push"'
      when: never
    - when: always
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
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