首页 > 解决方案 > 仅在 .gitlab-ci.yml 中复杂的析取逻辑

问题描述

我正在尝试为条件设置 Gitlab CI:

第二个条件是由设置变量的 api 调用(触发令牌)创建的管道。

使用 AND 表达式,它看起来像:

  only:
    variables:
      - $PROJECT == 'spark'
    changes:
      - spark/**/*

到目前为止,我最好的尝试是:

deploy-spark: &deploy-spark
  # job definition
  only:
    changes:
      - spark/**/*
  except:
    - triggers

deploy-spark-token:
  <<: *deploy-spark
  only:
    variables:
      - $PROJECT == 'spark'
    refs:
      - triggers
  except:

但它有很多样板

标签: gitlabgitlab-ci

解决方案


我不确定是否有一个优雅的解决方案可以显着减少实现 OR 逻辑的样板。每当我不得不这样做时,我都会尝试将“工作”与 CI 机制分开,以帮助提高可维护性。

将您的作业定义提取到模板中,并将该模板包含到每个部署作业中有助于保持界面清洁。这意味着您有一个明显的地方可以更改运行的代码,以及两个使用该代码的地方。这两个部署作业不相互依赖,对其中一个的任何更改都不会无意中影响另一个。

.job-definition: &job-definition
  script:
    - echo "Some script

deploy-spark
  <<: *job-definition
  only:
    changes:
      - spark/**/*
  except:
    - triggers

deploy-spark-token:
  <<: *job-definition
  only:
    variables:
      - $PROJECT == 'spark'
    refs:
      - triggers

我知道这可能无法回答您的问题,但我希望这会有所帮助。

请注意,.in.job-definition表示作业不运行(我喜欢将其视为 Linux 中的隐藏文件,添加点前缀会将其从 CI 中隐藏)。


推荐阅读