JenkinsをHTTP経由で叩く

まとめ

  • JenkinsはWebベースのUI
    • 操作の敷居が低い
    • 使い込むと使いづらくなる
      • 反応速度
      • 複数のビルド実行
  • Remote access API
    • HTTP経由でJobを実行できる
    • ページ表示を待たなくていいため高速
    • プログラムから実行可能
    • ただし、Jenkinsの仕様上、実行したビルドのビルド番号は解らない

JenkinsのJob実行は大変

JenkinsはWebブラウザを使ってGUIで操作するため、
操作の敷居が低く、簡単に扱えるようになっています。

ですが、ブラウザやJenkins本体の状態によってはとても遅くなってしまい、
ページを切り替えるのに3,4秒待つといった状態まで遅くなると、
ビルドをするのがとても辛くなります。

また、パラメータの組み合わせの分だけビルドしようとすると、
さらに辛くなってしまいます。

このような場合に、Jenkinsに用意されているRemote access APIを使うことで、
Jenkinsをプログラムから制御でき、反応の遅さに悩まされたり、
パラメータの数だけクリックをする必要性から逃れられます。

Remote access API

詳しくはこちら
https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API
https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Build

要するに、パラメータが無い場合は
http://HOST/job/JOB_NAME/build に、ある場合は
http://HOST/job/JOB_NAME/buildWithParameters にPOSTで投げるとビルドできます。

パラメータの投げ方はフォームデータとしてでもいいですし、
http://HOST/job/JOB_NAME/buildWithParameters?PARAMETER=Value のように、URLに直接入れても大丈夫のようです。

サンプルスクリプト

3*3=9種類のビルドを一気に実行するスクリプトです

require 'open-uri'
require 'net/http'

platforms = ["ios",  "android", "windows"]
settings =  ["debug","release", "store"]

platforms.product(settings).each do |platform, setting|
  params = {:PLATFORM => platform, :SETTING => setting}
  p params

  url = URI.parse('http://HOST/job/JOB_NAME/buildWithParameters')
  req = Net::HTTP::Post.new(url.path)
  req.basic_auth 'NAME', 'PASSWORD'
  req.set_form_data(params)
  res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
  case res
  when Net::HTTPSuccess, Net::HTTPRedirection
    p "OK"
  else
    res.value
  end
end

問題点

Jenkinsの仕様上、キューを入れた段階でビルド番号が確定しません。
そのため、実行したビルドが何番のビルドとして登録されたかをレスポンスから知ることは出来ません。ss