You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.0 KiB
87 lines
2.0 KiB
#!/usr/bin/env ruby
|
|
|
|
require 'httparty'
|
|
require 'json'
|
|
require 'net/http'
|
|
require 'sinatra'
|
|
|
|
set :port, 8042
|
|
|
|
## config
|
|
CONFIG = YAML.load_file('config.yml')
|
|
TOKEN = CONFIG["token"] || "unconfigured"
|
|
CAUSE = CONFIG["cause"] || "git_commit_triggered"
|
|
SERVER = CONFIG["server"] || "https://jenkins/"
|
|
|
|
|
|
## helper functions
|
|
def trigger_job(job, branch)
|
|
uri = URI("#{SERVER}job/#{job}/buildWithParameters")
|
|
|
|
req = Net::HTTP::Post.new(uri.path)
|
|
req.set_form_data('token' => TOKEN,
|
|
'cause' => CAUSE,
|
|
'branch' => branch)
|
|
|
|
res = Net::HTTP.start(uri.host, uri.port,
|
|
:use_ssl => uri.scheme == 'https',
|
|
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
|
|
http.request(req)
|
|
end
|
|
|
|
case res
|
|
when Net::HTTPSuccess, Net::HTTPRedirection
|
|
p "OK"
|
|
else
|
|
res.value
|
|
end
|
|
end
|
|
|
|
|
|
def job_names
|
|
json = HTTParty.get("#{SERVER}/api/json")
|
|
json["jobs"].map {|job| job["name"]}
|
|
end
|
|
|
|
|
|
def job_details(job_name)
|
|
HTTParty.get("#{SERVER}/job/#{job_name}/api/json")
|
|
end
|
|
|
|
|
|
def build_details(job_name, build_number)
|
|
HTTParty.get("#{SERVER}/job/#{job_name}/#{build_number}/api/json")
|
|
end
|
|
|
|
## main sinatra app
|
|
|
|
# this is where GitHub actually ends up at, configured as
|
|
# WebHook URL at https://github.com/$OWNER/$PROJECT/settings/hooks
|
|
post '/trigger' do
|
|
push = JSON.parse(params[:payload])
|
|
# p "JSON data: #{push.inspect}"
|
|
# p JSON.pretty_generate(push)
|
|
|
|
project = push["repository"]["name"]
|
|
project = project + "-source" # we use $job-source as default entry point
|
|
branch = push["ref"]
|
|
|
|
# make sure we do not trigger a build with a branch that was just deleted
|
|
deleted = push["deleted"]
|
|
|
|
if deleted
|
|
puts "branch #{branch} was deleted, not triggering build"
|
|
elsif job_names.include? project
|
|
trigger_job(project, branch)
|
|
else
|
|
puts "no such job #{project}"
|
|
end
|
|
end
|
|
|
|
# debugging helper
|
|
post '/debug' do
|
|
puts params[:payload]
|
|
end
|
|
|
|
## END OF FILE #################################################################
|