Skip to content

Instantly share code, notes, and snippets.

@RobertDober
Created December 5, 2017 15:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RobertDober/61051b0417f8962344ffb70fd9d24db3 to your computer and use it in GitHub Desktop.
Save RobertDober/61051b0417f8962344ffb70fd9d24db3 to your computer and use it in GitHub Desktop.
require 'awesome_print'
require 'faraday'
module Main extend self
def run jenkins_name=nil, first=nil, last=first
return usage unless last
(first..last).each{ |build| get_console_output_for_build jenkins_name, build }
end
private
# Worker Bees
# -----------
def get_console_output_for_build jenkins_name, build
response = connection.get("job/#{jenkins_name}/#{build}/consoleText")
if response.status == 200
puts "#{"get ok".green} Saving console text of #{jenkins_name} build #{build} to #{tmp_dir}/#{file_name(jenkins_name, build)}"
save_to_file response, jenkins_name, build
else
$stderr.puts "#{"get error".red} Could not fetch resource from #{"job/#{jenkins_name}/#{build}/consoleText".red}"
end
end
def save_to_file response, jenkins_name, build
File.open(File.join(tmp_dir, file_name(jenkins_name, build)), "w") do |file|
file.write(response.body)
end
end
def usage
$stderr.puts <<-EOS
usage:
#{$0.blue} #{"jenkins_name".green} #{"first_build_id".green} [#{"last_build_id".green} ]
#{"last_build_id".green} defaults to #{"first_build_id".green}
Searches the console output of all builds from #{"first_build".green} .. #{"last_build".green} and saves them into
files in your $TMP dir.
EOS
end
# Constants
# ---------
def url
"https://ci.af83.io/"
end
# Lazy Values
# -----------
def api_token
@__api_token__ ||= ENV.fetch('JENKINS_API_TOKEN') do
$stderr.puts "ConfigurtionError".red, "Need to define the env var #{"JENKINS_API_TOKEN".red}"
raise KeyError, 'JENKINS_API_TOKEN'
end
end
def connection
@__connection__ ||= Faraday.new(url: url).tap do |conn|
conn.basic_auth(userid, api_token)
end
end
def file_name jenkins_name, build # !!! idempotent for **all** parameter combinations
@__file_name__ ||= "console-text_#{jenkins_name}_#{build}"
end
def tmp_dir
@__tmp_dir__ ||= ENV.fetch('TMP').tap do |dir|
raise RuntimeError, "$TMP = #{dir} but is no directory" unless File.directory? dir
end
end
def userid
@__userid__ ||= ENV.fetch('JENKINS_USERID', 'robert.dober')
end
end
Main.run(* ARGV.dup )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment