Class: CIJoe
- Inherits:
-
Object
- Object
- CIJoe
- Defined in:
- lib/cijoe.rb,
lib/cijoe/build.rb,
lib/cijoe/commit.rb,
lib/cijoe/config.rb,
lib/cijoe/server.rb,
lib/cijoe/version.rb,
lib/cijoe/campfire.rb
Defined Under Namespace
Modules: Campfire Classes: Build, Commit, Config, Server
Constant Summary collapse
- Version =
"0.2.1"
Instance Attribute Summary collapse
-
#current_build ⇒ Object
readonly
Returns the value of attribute current_build.
-
#last_build ⇒ Object
readonly
Returns the value of attribute last_build.
-
#project ⇒ Object
readonly
Returns the value of attribute project.
-
#url ⇒ Object
readonly
Returns the value of attribute url.
-
#user ⇒ Object
readonly
Returns the value of attribute user.
Instance Method Summary collapse
-
#build ⇒ Object
run the build but make sure only one is running at a time.
-
#build! ⇒ Object
update git then run the build.
-
#build_failed(output, error) ⇒ Object
build callbacks.
- #build_worked(output) ⇒ Object
-
#building? ⇒ Boolean
is a build running?.
- #finish_build(status, output) ⇒ Object
- #git_branch ⇒ Object
- #git_sha ⇒ Object
- #git_update ⇒ Object
- #git_user_and_project ⇒ Object
-
#initialize(project_path) ⇒ CIJoe
constructor
A new instance of CIJoe.
- #open_pipe(cmd) {|read, pid| ... } ⇒ Object
-
#pid ⇒ Object
the pid of the running child process.
-
#read_build(name) ⇒ Object
load build info from file.
-
#restore ⇒ Object
restore current / last build state from disk.
-
#run_hook(hook) ⇒ Object
massage our repo.
-
#runner_command ⇒ Object
shellin’ out.
-
#stop ⇒ Object
kill the child and exit.
-
#write_build(name, build) ⇒ Object
write build info for build to file.
Constructor Details
#initialize(project_path) ⇒ CIJoe
Returns a new instance of CIJoe.
26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/cijoe.rb', line 26 def initialize(project_path) project_path = File.(project_path) Dir.chdir(project_path) @user, @project = git_user_and_project @url = "http://github.com/#{@user}/#{@project}" @last_build = nil @current_build = nil trap("INT") { stop } end |
Instance Attribute Details
#current_build ⇒ Object (readonly)
Returns the value of attribute current_build.
24 25 26 |
# File 'lib/cijoe.rb', line 24 def current_build @current_build end |
#last_build ⇒ Object (readonly)
Returns the value of attribute last_build.
24 25 26 |
# File 'lib/cijoe.rb', line 24 def last_build @last_build end |
#project ⇒ Object (readonly)
Returns the value of attribute project.
24 25 26 |
# File 'lib/cijoe.rb', line 24 def project @project end |
#url ⇒ Object (readonly)
Returns the value of attribute url.
24 25 26 |
# File 'lib/cijoe.rb', line 24 def url @url end |
#user ⇒ Object (readonly)
Returns the value of attribute user.
24 25 26 |
# File 'lib/cijoe.rb', line 24 def user @user end |
Instance Method Details
#build ⇒ Object
run the build but make sure only one is running at a time
80 81 82 83 84 85 |
# File 'lib/cijoe.rb', line 80 def build return if building? @current_build = Build.new(@user, @project) write_build 'current', @current_build Thread.new { build! } end |
#build! ⇒ Object
update git then run the build
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/cijoe.rb', line 102 def build! build = @current_build output = '' git_update build.sha = git_sha write_build 'current', build open_pipe("#{runner_command} 2>&1") do |pipe, pid| puts "#{Time.now.to_i}: Building #{build.short_sha}: pid=#{pid}" build.pid = pid write_build 'current', build output = pipe.read end Process.waitpid(build.pid) status = $?.exitstatus.to_i puts "#{Time.now.to_i}: Built #{build.short_sha}: status=#{status}" status == 0 ? build_worked(output) : build_failed('', output) rescue Object => e puts "Exception building: #{e.} (#{e.class})" build_failed('', e.to_s) end |
#build_failed(output, error) ⇒ Object
build callbacks
56 57 58 59 |
# File 'lib/cijoe.rb', line 56 def build_failed(output, error) finish_build :failed, "#{error}\n\n#{output}" run_hook "build-failed" end |
#build_worked(output) ⇒ Object
61 62 63 64 |
# File 'lib/cijoe.rb', line 61 def build_worked(output) finish_build :worked, output run_hook "build-worked" end |
#building? ⇒ Boolean
is a build running?
40 41 42 |
# File 'lib/cijoe.rb', line 40 def building? !!@current_build end |
#finish_build(status, output) ⇒ Object
66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/cijoe.rb', line 66 def finish_build(status, output) @current_build.finished_at = Time.now @current_build.status = status @current_build.output = output @last_build = @current_build @current_build = nil write_build 'current', @current_build write_build 'last', @last_build @last_build.notify if @last_build.respond_to? :notify end |
#git_branch ⇒ Object
146 147 148 149 |
# File 'lib/cijoe.rb', line 146 def git_branch branch = Config.cijoe.branch.to_s branch == '' ? "master" : branch end |
#git_sha ⇒ Object
133 134 135 |
# File 'lib/cijoe.rb', line 133 def git_sha `git rev-parse origin/#{git_branch}`.chomp end |
#git_update ⇒ Object
137 138 139 140 |
# File 'lib/cijoe.rb', line 137 def git_update `git fetch origin && git reset --hard origin/#{git_branch}` run_hook "after-reset" end |
#git_user_and_project ⇒ Object
142 143 144 |
# File 'lib/cijoe.rb', line 142 def git_user_and_project Config.remote.origin.url.to_s.chomp('.git').split(':')[-1].split('/')[-2, 2] end |
#open_pipe(cmd) {|read, pid| ... } ⇒ Object
87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/cijoe.rb', line 87 def open_pipe(cmd) read, write = IO.pipe pid = fork do read.close $stdout.reopen write exec cmd end write.close yield read, pid end |
#pid ⇒ Object
the pid of the running child process
45 46 47 |
# File 'lib/cijoe.rb', line 45 def pid building? and current_build.pid end |
#read_build(name) ⇒ Object
load build info from file.
199 200 201 |
# File 'lib/cijoe.rb', line 199 def read_build(name) Build.load(".git/builds/#{name}") end |
#restore ⇒ Object
restore current / last build state from disk.
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
# File 'lib/cijoe.rb', line 171 def restore unless @last_build @last_build = read_build('last') end unless @current_build @current_build = read_build('current') end Process.kill(0, @current_build.pid) if @current_build && @current_build.pid rescue Errno::ESRCH # build pid isn't running anymore. assume previous # server died and reset. @current_build = nil end |
#run_hook(hook) ⇒ Object
massage our repo
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
# File 'lib/cijoe.rb', line 152 def run_hook(hook) if File.exists?(file=".git/hooks/#{hook}") && File.executable?(file) data = if @last_build && @last_build.commit { "MESSAGE" => @last_build.commit., "AUTHOR" => @last_build.commit., "SHA" => @last_build.commit.sha, "OUTPUT" => @last_build.clean_output } else {} end env = data.collect { |k, v| %(#{k}=#{v.inspect}) }.join(" ") `#{env} sh #{file}` end end |
#runner_command ⇒ Object
shellin’ out
128 129 130 131 |
# File 'lib/cijoe.rb', line 128 def runner_command runner = Config.cijoe.runner.to_s runner == '' ? "rake -s test:units" : runner end |
#stop ⇒ Object
kill the child and exit
50 51 52 53 |
# File 'lib/cijoe.rb', line 50 def stop Process.kill(9, pid) if pid exit! end |
#write_build(name, build) ⇒ Object
write build info for build to file.
188 189 190 191 192 193 194 195 196 |
# File 'lib/cijoe.rb', line 188 def write_build(name, build) filename = ".git/builds/#{name}" Dir.mkdir '.git/builds' unless File.directory?('.git/builds') if build build.dump filename elsif File.exist?(filename) File.unlink filename end end |