notebook

都内でWEB系エンジニアやってます。

GitLab-CIで複数のJobを異なるスケジュールで実行したい

GitLab-CIで複数のJobをスケジューリングして実行したい場合のメモ

単純にスケジュールで実行させるには次のような設定になる

  • .gitlab-ci.yml
job1:
  stage: test
  script: echo 'hello! job1'
  only:
    - schedules
job2:
  stage: test
  script: echo 'hello! job2'
  only:
    - schedules

Web UIからスケジュールを登録するとそのスケジュールに対してjob1,job2が実行される

job1は毎日実行でjob2は週ごと実行したい場合、CI/CD -> Schedule からスケジュールを2つ作成する必要があるが上記設定だと日ごとと週ごとと両方job1,job2が実行されてしまう

公式のドキュメントを読んでもonly.schedulesを指定するとしか載っていなかったのでもう少し調べてみた

stackoverflowでは次のスレッドを発見した

post - How to trigger a specific job in gitlab - Stack Overflow

stackoverflow.com

triggersでAPI経由での実行時に実行対象Jobをコントロールしたいという内容だった

  • curlのパラメータ

--form "variables[TRIGERRED_JOB]=job1"

  • formの内容の参照

$variables[TRIGERRED_JOB]

それをonly.variablesで条件指定してあげれば良さそう

抜粋して記述すると次のようになる

job1:
  only:
    variables:
      - $variables[TRIGERRED_JOB] == "job1"

環境変数の内容をチェックして条件に合致するパターンのみjobを発行できるよう

もう少し調べると次のissueで解決策が提示されていた

Choose jobs in scheduled pipelines (#42313) · Issues · GitLab.org / GitLab FOSS · GitLab

gitlab.com

環境変数の値をonlyの条件に含めてスケジュールごとに実行するJobを制御することで異なるスケジュールごとにJobを実行することが可能になる

スケジュール追加画面のVariables項目で環境変数を設定できるので設定をする

f:id:swfz:20200109053548p:plain

  • daily

f:id:swfz:20200109053553p:plain

  • weekly

f:id:swfz:20200109053557p:plain

最終的には次のような設定になった

  • .gitlab-ci.yml
stages:
  - test
daily_job:
  stage: test
  script: echo 'hello! daily job'
  only:
    variables:
      - $JOB_TYPE == "daily"
weekly_job:
  stage: test
  script: echo 'hello! weekly job'
  only:
    variables:
      - $JOB_TYPE == "weekly"
  • 毎日daily_jobが実行される
  • 毎週weekly_jobが実行される

これでJobごとにスケジュールをコントロールできるようになった