Jenkinsでジョブを遅れて実行させる - Qiita
の応用でジョブを予約実行できそうだったのでやってみたら出来る感じだったのでメモしておく。
実行手順
以下のようなスクリプトで実行する(ビルドパラメータありの場合の例)。
Rubyを使っているが実行させたい時刻と現在時刻の差分(秒数)が計算できてJenkinsのジョブをリモート実行できれば何でも良い。
- Gemfile
# A sample Gemfile
source "https://rubygems.org"
gem 'rest-client'
gem 'http_proxy_from_env' # http proxy環境下でないなら不要
- スクリプト本体
require 'http_proxy_from_env' # http proxy環境下でないなら不要
require 'rest-client'
require 'time'
target = Time.parse("2014/11/16 12:00") # 実行させたい時刻
# to_iしてるので小数点以下切り捨てで最大1秒ほど誤差が出ると思われる。
sec = (target - Time.now).to_i # 実行させたい時刻と現在時刻の差分計算(秒数)
# JenkinsのリモートAPIでジョブ実行
RestClinet.get("[Jenkins URL]/job/[Job Name]/buildWithParameters?delay=#{sec}sec&[Parameters]")
ジョブのビルドパラメータありなしの挙動の違い
実際に確認した範囲なので間違ってる可能性あり。
とにかくジョブを予約実行するときは不要でもビルドパラメータ付けた方が良さそう。
ちなみに設定の「ビルドを並行実行」は挙動に影響しないようである。
ジョブのビルドパラメータあり
- ジョブにビルドパラメータが設定できるようになっていくと実行した結果はどんどんキューにためられていく。
- ただし、同じ実行予定時刻で同じパラメータの場合はキューは追加されない。
- キューがたまっている状態でブラウザから直接ジョブを実行してもキューは残る。
ジョブのビルドパラメータなし
- ジョブにビルドパラメータがない場合はいくらリクエストしても1つのキューしかたまらない。
- キューがある状態でさらに後のジョブを予約するとキューが後の時刻で実行するように更新される。
- ブラウザから直接ビルドするとたまっていたキューは無くなる。
精度
確認した範囲だと予約したジョブの実行は数秒早かったり遅かったりすることがある(確認した中では3秒遅い場合があった)。
実行回数が少ないので実際にどの程度ズレるのか正確なところはわからないが、指定したちょうどその時に実行されることは期待しない方が良さそう。