JenkinsでジョブA → ジョブBの実行でジョブBの実行を遅延させたかったのでいろいろ試してみた。
方法0:[番外]ジョブ中でsleepする
ジョブ中でシェルの実行などで本処理前にsleepして待つ。
シンプルだが以下のデメリットがあるためしない方が良さそう。
- ジョブが実行状態になり続けて実行枠を占有する。
- 待機中か処理実行中か判断し辛くキャンセルしにくい。
- ジョブの「ソースコード管理」機能を利用したscmの取得などは遅延できない。
これよりあとの方法だとビルドキューにつまれてビルドを待つため状態がわかりやすい。
方法1:ジョブに設定する
以下のように設定する。
- 「プロジェクトの高度なオプション」の「高度な設定」で待機時間(秒)を設定する
ジョブの実行方法によって効く場合と効かない場合があるらしい。
ジョブをブラウザ上から直接実行する時と定期実行はその指定した瞬間に実行させたいだろうということで効かせてないのかな?
実行方法 | 待機する/しない |
---|---|
他のプロジェクト(上流)からのジョブの実行 | する |
ジョブをブラウザ上から直接実行 | しない |
定期実行で実行 | しない |
リモートでジョブ実行 | する |
SCMのポーリング実行 | する |
遅延時間が一定で良い場合はこの方法でいけそう。
方法2:ブラウザからのジョブ実行時に指定する
パラメータ指定ありでの実行だと、パラメータ指定時にURLのdelayの値を変えてリロードして実行すればOK
パラメータ指定なしでの実行だと、ビルドのURLをコピってdelayの値を変えてブラウザに指定する。
手動実行の場合はこの方法でコントロールできそう。
方法3:リモートでのジョブ実行時に指定する
以下のような感じで実行する。
# パラメータ無し、認証なし
$ curl '[Jenkins URL]/job/[jobname]/build?delay=60sec'
# パラメータ無し、認証あり(トークン)
$ curl '[Jenkins URL]/job/[jobname]/build?token=[token]&delay=60sec'
# パラメータ有り、認証なし
$ curl '[Jenkins URL]/job/[jobname]/buildWithParameters?delay=60sec&[parameters]'
# パラメータ有り、認証あり(トークン)
$ curl '[Jenkins URL]/job/[jobname]/buildWithParameters?token=[token]&delay=60sec&[parameters]'
方法4がダメなので遅延時間を可変にしてジョブを手動以外で実行したい場合はこの方法しかなさそう。
ジョブを指定した時間に実行させることにも使えるのかな。
はまった
URLを''で囲っていなくて意図したパラメータが反映されていなかった。
シェル上で&が特別な意味を持ってしまうので後ろのパラメータが無視されていたのが原因。
方法4:[失敗]Parameterized Trigger Pluginで指定する
Parameterized Trigger Pluginでパラメータにdelayを指定してやろうとしたが出来なかった。
Predefined Parametersでdelay=60secなどと指定したが効かなかった。
うまく指定できないのだろうか。