2020年3月12日木曜日

Jenkins のパラメータ付きビルドを Ruby の net/http を使ってコールしてみた

概要

過去 にライブラリを使って Jenkins のジョブを操作しました
今回は net/http だけを使ってジョブを操作してみました

環境

  • Ruby 2.5.5p157

テキストのパラメータを付与してビルドする

Jenkins のジョブは p1 というテキストのパラメータを受け取る想定です
post_form を使うと簡単です

require 'net/http'
require 'uri'
require 'json'

data_p1 = 0...1
data_p1.each { |d|
  build_parameter = {
    "parameter" => [
      {
        "name" => "p1",
        "value" => d
      }
    ]
  }
  query = {
      "json" => build_parameter.to_json
  }
  # ret = Net::HTTP.post_form(URI.parse('http://test:test@localhost:8080/job/test/build'), query)
  ret = Net::HTTP.post_form(URI.parse('http://test:test@localhost:8080/job/test/buildWithParameters'), query)
  puts ret.to_hash
}

/build/buildWithParameters がありますが実行したビルド番号がほしい場合は buildWithParameters を使います (参考)

ファイル付きのパラメータを付与してビルドする

Jenkins のジョブは f1 というファイルと p1 というテキストのパラメータを受け取る想定です

post_form ではファイルを送れないようなので set_form + multipart/form-data を使います
クエリの作り方もハッシュではなく 2 次元配列になるようです (もしかするとハッシュでもいけるかも)

require 'net/http'
require 'uri'
require 'json'

filename = 'test.txt'
f = open("./#{filename}")
data_p1 = 0...1
data_p1.each { |d|
  build_parameter = {
    "parameter" => [
      {
        "name" => "p1",
        "value" => d
      },
      {
        "name" => "f1",
        "file" => filename
      }
    ]
  }
  query = [
    [ "json", build_parameter.to_json ],
    [ filename, f, { filename: filename } ]
  ]
  # url = URI.parse('http://localhost:8080/job/test/build')
  url = URI.parse('http://localhost:8080/job/test/buildWithParameters')
  http = Net::HTTP.new(url.host, url.port)
  req = Net::HTTP::Post.new(url.path)
  req.set_form(query, "multipart/form-data")
  req.basic_auth('test', 'test')
  ret = http.request(req)
  puts ret.to_hash
}

リクエスト情報はあとから作成するため認証情報もあとから basic_auth で設定しています

最後に

net/http だけを使って Jenkins のパラメータ付きビルドをコールしてみました
ビルドの結果なども使う想定であれば素直に jenkins_api_client を使うのが良いと思います
Jenkins の Remote API の仕組みや挙動を直接確認したい場合には良い方法かなと思います

0 件のコメント:

コメントを投稿