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/talker.rb,
lib/cijoe/version.rb,
lib/cijoe/campfire.rb
Defined Under Namespace
Modules: Campfire, Talker 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.
27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/cijoe.rb', line 27 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.
25 26 27 |
# File 'lib/cijoe.rb', line 25 def current_build @current_build end |
#last_build ⇒ Object (readonly)
Returns the value of attribute last_build.
25 26 27 |
# File 'lib/cijoe.rb', line 25 def last_build @last_build end |
#project ⇒ Object (readonly)
Returns the value of attribute project.
25 26 27 |
# File 'lib/cijoe.rb', line 25 def project @project end |
#url ⇒ Object (readonly)
Returns the value of attribute url.
25 26 27 |
# File 'lib/cijoe.rb', line 25 def url @url end |
#user ⇒ Object (readonly)
Returns the value of attribute user.
25 26 27 |
# File 'lib/cijoe.rb', line 25 def user @user end |
Instance Method Details
#build ⇒ Object
run the build but make sure only one is running at a time
81 82 83 84 85 86 |
# File 'lib/cijoe.rb', line 81 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
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/cijoe.rb', line 103 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
57 58 59 60 |
# File 'lib/cijoe.rb', line 57 def build_failed(output, error) finish_build :failed, "#{error}\n\n#{output}" run_hook "build-failed" end |
#build_worked(output) ⇒ Object
62 63 64 65 |
# File 'lib/cijoe.rb', line 62 def build_worked(output) finish_build :worked, output run_hook "build-worked" end |
#building? ⇒ Boolean
is a build running?
41 42 43 |
# File 'lib/cijoe.rb', line 41 def building? !!@current_build end |
#finish_build(status, output) ⇒ Object
67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/cijoe.rb', line 67 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
147 148 149 150 |
# File 'lib/cijoe.rb', line 147 def git_branch branch = Config.cijoe.branch.to_s branch == '' ? "master" : branch end |
#git_sha ⇒ Object
134 135 136 |
# File 'lib/cijoe.rb', line 134 def git_sha `git rev-parse origin/#{git_branch}`.chomp end |
#git_update ⇒ Object
138 139 140 141 |
# File 'lib/cijoe.rb', line 138 def git_update `git fetch origin && git reset --hard origin/#{git_branch}` run_hook "after-reset" end |
#git_user_and_project ⇒ Object
143 144 145 |
# File 'lib/cijoe.rb', line 143 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
88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/cijoe.rb', line 88 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
46 47 48 |
# File 'lib/cijoe.rb', line 46 def pid building? and current_build.pid end |
#read_build(name) ⇒ Object
load build info from file.
200 201 202 |
# File 'lib/cijoe.rb', line 200 def read_build(name) Build.load(".git/builds/#{name}") end |
#restore ⇒ Object
restore current / last build state from disk.
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
# File 'lib/cijoe.rb', line 172 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
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'lib/cijoe.rb', line 153 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
129 130 131 132 |
# File 'lib/cijoe.rb', line 129 def runner_command runner = Config.cijoe.runner.to_s runner == '' ? "rake -s test:units" : runner end |
#stop ⇒ Object
kill the child and exit
51 52 53 54 |
# File 'lib/cijoe.rb', line 51 def stop Process.kill(9, pid) if pid exit! end |
#write_build(name, build) ⇒ Object
write build info for build to file.
189 190 191 192 193 194 195 196 197 |
# File 'lib/cijoe.rb', line 189 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 |