仅在.gitlab-ci.yml中用于复杂的析取逻辑

时间:2019-02-26 16:58:23

标签: gitlab gitlab-ci

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

  • 通过git push事件在目录“ spark / ** / *”上修改的文件
  • 有一个变量$ PROJECT =='spark'

第二个条件是通过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:

但是很多样板

1 个答案:

答案 0 :(得分:0)

我不确定对此是否有一个优雅的解决方案,它可以大大减少实现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

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

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