Skip to content

Instantly share code, notes, and snippets.

@kisel
Created December 13, 2013 11:27
Show Gist options
  • Save kisel/7942993 to your computer and use it in GitHub Desktop.
Save kisel/7942993 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
# script to upload binaries to github release from Jenkins
# [email protected]
require 'json'
require 'restclient'
require 'uri'
GITHUB_OAUTH_TOKEN=ENV['GITHUB_OAUTH_TOKEN'] || abort("GITHUB_OAUTH_TOKEN not specified")
USER=ENV['USER'] || abort("USER not specified")
REPO=ENV['REPO'] || abort("REPO not specified")
GIT_COMMIT=ENV['GIT_COMMIT'] || abort("GIT_COMMIT not specified")
FILE=ENV['FILE'] || abort("FILE not specified")
FILE_NAME=ENV['FILE_NAME'] || abort("FILE_NAME not specified")
FILE_DESCR=ENV['FILE_DESCR']
RELEASE_BASENAME=ENV['RELEASE_BASENAME'] || 'latest-build'
class GitHubUploader
AUTH_HEADERS = {
"Authorization" => "token #{GITHUB_OAUTH_TOKEN}"
}
def api urlpart, part='api'
"https://#{part}.github.com/repos/#{USER}/#{REPO}#{urlpart}"
end
def makerelease
req = {
"tag_name" => RELEASE_BASENAME,
"name" => RELEASE_BASENAME,
"draft" => true,
"prerelease" => true,
"target_commitish" => GIT_COMMIT,
"body" => "Latest build: #{GIT_COMMIT}"
}.to_json
res = RestClient.post api('/releases'), req, AUTH_HEADERS
JSON.parse res
end
def prepare_release
rel = RestClient.get api('/releases'), AUTH_HEADERS
rel = JSON.parse rel
target_release = nil
rel.each do |release|
puts "REL #{release}"
next if not release['draft']
next if not release['name'].start_with? RELEASE_BASENAME
id = release['id']
if release['target_commitish'] == GIT_COMMIT
puts "Using existing release"
target_release = id
next
end
puts RestClient.delete api("/releases/#{id}"), AUTH_HEADERS
end
if not target_release
puts "Creating new release"
rel = makerelease
target_release = rel['id']
end
puts "Release id: #{target_release}"
return target_release
end
def main
release_id = prepare_release
payload = File.new(FILE, 'rb')
asset_name = FILE_NAME
asset_label = FILE_DESCR
asset_api_url = api("/releases/#{release_id}/assets?name=#{asset_name}", 'uploads')
asset_headers = {'Content-Type' => 'application/octet-stream'}
asset_headers.merge! AUTH_HEADERS
asset_res = RestClient.post asset_api_url, payload, asset_headers
asset_res = JSON.parse asset_res
asset_url = asset_res['url']
puts "Asset id: #{asset_res['id']}"
if asset_label and asset_label != ""
asset_params = { :name => asset_name, :label => asset_label }.to_json
patch_result = RestClient.patch asset_url, asset_params, AUTH_HEADERS
puts "Asset patch: #{patch_result}"
end
end
end
GitHubUploader.new.main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment