Created
December 13, 2013 11:27
-
-
Save kisel/7942993 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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