octopusci 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. data/README.markdown +132 -0
  2. data/bin/octopusci-reset-redis +26 -0
  3. data/bin/octopusci-skel +2 -7
  4. data/bin/octopusci-tentacles +2 -2
  5. data/config.ru +1 -1
  6. data/lib/octopusci.rb +3 -7
  7. data/lib/octopusci/config.rb +63 -49
  8. data/lib/octopusci/errors.rb +2 -0
  9. data/lib/octopusci/helpers.rb +16 -15
  10. data/lib/octopusci/io.rb +70 -0
  11. data/lib/octopusci/job.rb +145 -34
  12. data/lib/octopusci/job_store.rb +67 -0
  13. data/lib/octopusci/notifier.rb +7 -17
  14. data/lib/octopusci/notifier/job_complete.html.erb +76 -3
  15. data/lib/octopusci/queue.rb +14 -10
  16. data/lib/octopusci/server.rb +17 -20
  17. data/lib/octopusci/server/views/index.erb +3 -4
  18. data/lib/octopusci/server/views/job.erb +3 -3
  19. data/lib/octopusci/server/views/job_summary.erb +18 -18
  20. data/lib/octopusci/server/views/layout.erb +6 -5
  21. data/lib/octopusci/stage_locker.rb +11 -7
  22. data/lib/octopusci/version.rb +1 -1
  23. data/lib/octopusci/worker_launcher.rb +1 -1
  24. data/spec/lib/octopusci/config_spec.rb +195 -0
  25. data/spec/lib/octopusci/io_spec.rb +64 -0
  26. data/spec/lib/octopusci/job_spec.rb +122 -0
  27. data/spec/lib/octopusci/job_store_spec.rb +155 -0
  28. data/spec/lib/octopusci/notifier_spec.rb +0 -15
  29. data/spec/lib/octopusci/queue_spec.rb +122 -0
  30. data/spec/lib/octopusci/server_spec.rb +92 -1
  31. data/spec/lib/octopusci/stage_locker_spec.rb +94 -0
  32. data/spec/spec_helper.rb +8 -0
  33. metadata +39 -58
  34. data/README +0 -63
  35. data/bin/octopusci-db-migrate +0 -10
  36. data/db/migrate/0001_init.rb +0 -29
  37. data/db/migrate/0002_add_status_job.rb +0 -19
  38. data/lib/octopusci/notifier/job_complete.text.erb +0 -5
  39. data/lib/octopusci/schema.rb +0 -140
@@ -1,19 +0,0 @@
1
- class AddStatusJob < ActiveRecord::Migration
2
- def self.up
3
- add_column(:jobs, :status, :string)
4
- add_column(:jobs, :stage, :string)
5
- add_column(:jobs, :output_file_path, :string)
6
- remove_column(:jobs, :output)
7
- remove_column(:jobs, :successful)
8
- remove_column(:jobs, :running)
9
- end
10
-
11
- def self.down
12
- add_column(:jobs, :running, :boolean)
13
- add_column(:jobs, :successful, :boolean)
14
- add_column(:jobs, :output, :text)
15
- remove_column(:jobs, :output_file_path)
16
- remove_column(:jobs, :stage)
17
- remove_column(:jobs, :status)
18
- end
19
- end
@@ -1,5 +0,0 @@
1
- # Octopusci Build
2
-
3
- ## Command Output
4
-
5
- <%= @cmd_output %>
@@ -1,140 +0,0 @@
1
- require 'active_record'
2
-
3
- class Job < ActiveRecord::Base
4
- STATUS = {
5
- 'pending' => 'Pending...',
6
- 'running' => 'Running...',
7
- 'successful' => 'Successful',
8
- 'failed' => 'Failed',
9
- 'error' => 'Error'
10
- }
11
-
12
- serialize :payload
13
-
14
- after_create :set_output_file_path
15
-
16
- def branch_name
17
- self.ref.gsub(/refs\/heads\//, '')
18
- end
19
-
20
- def display_status
21
- return STATUS[self.status]
22
- end
23
-
24
- def successful?
25
- return self.status == 'successful'
26
- end
27
-
28
- def failed?
29
- return self.status == 'failed'
30
- end
31
-
32
- def finished?
33
- return ['successful', 'failed', 'error'].include?(self.status)
34
- end
35
-
36
- def output
37
- if File.exists?(self.abs_output_file_path)
38
- return File.open(self.abs_output_file_path, 'r').read()
39
- else
40
- return ""
41
- end
42
- end
43
-
44
- def silent_output
45
- if File.exists?(self.abs_silent_output_file_path)
46
- return File.open(self.abs_silent_output_file_path, 'r').read()
47
- else
48
- return ""
49
- end
50
- end
51
-
52
- def workspace_path
53
- return "#{Octopusci::CONFIG['general']['workspace_base_path']}/#{self.stage}"
54
- end
55
-
56
- # Relative path of the output file to the workspace base path.
57
- def rel_output_file_path
58
- "/jobs/#{self.id}/output.txt"
59
- end
60
-
61
- def abs_output_file_path
62
- return "#{Octopusci::CONFIG['general']['workspace_base_path']}#{self.rel_output_file_path}"
63
- end
64
-
65
- def abs_silent_output_file_path
66
- return "#{self.abs_output_path}/silent_output.txt"
67
- end
68
-
69
- def repository_path
70
- return "#{self.workspace_path}/#{self.repo_name}"
71
- end
72
-
73
- def abs_output_path
74
- return "#{Octopusci::CONFIG['general']['workspace_base_path']}/jobs/#{self.id}"
75
- end
76
-
77
- def code_cloned?
78
- return File.directory?(self.repository_path)
79
- end
80
-
81
- def clone_code(job_conf)
82
- if self.code_cloned?
83
- return 0
84
- else
85
- if !Dir.exists?(self.workspace_path)
86
- FileUtils.mkdir_p(self.workspace_path)
87
- end
88
- return self.run_command("cd #{self.workspace_path} 2>&1 && git clone #{job_conf['repo_uri']} #{self.repo_name} 2>&1", true)
89
- end
90
- end
91
-
92
- def checkout_branch(job_conf)
93
- if !self.code_cloned?
94
- self.clone_code(job_conf)
95
- end
96
-
97
- return self.run_command("cd #{self.repository_path} 2>&1 && git fetch --all -p 2>&1 && git checkout #{self.branch_name} 2>&1 && git pull -f origin #{self.branch_name}:#{self.branch_name} 2>&1", true)
98
- end
99
-
100
- # Runs a command and logs it standard output to the job's associated
101
- # output file. It also returns the exit status of the command that was
102
- # run as the integer exit status of the commands on the command line.
103
- def run_command(cmd_str, silently=false)
104
- # Make sure that the directory structure is in place for the job output.
105
- if !File.directory?(self.abs_output_path)
106
- FileUtils.mkdir_p(self.abs_output_path)
107
- end
108
-
109
- out_f = nil
110
-
111
- # Run the command and output the output to the job file
112
- if silently
113
- out_f = File.open(self.abs_silent_output_file_path, 'a')
114
- else
115
- out_f = File.open(self.abs_output_file_path, 'a')
116
- end
117
- out_f << "\n\nRunning: #{cmd_str}\n"
118
- out_f << "-"*30
119
- out_f << "\n"
120
- out_f.flush
121
-
122
- f = IO.popen(cmd_str)
123
- while(cur_line = f.gets) do
124
- out_f << cur_line
125
- out_f.flush
126
- end
127
-
128
- out_f.close
129
- f.close
130
-
131
- return $?.exitstatus.to_i
132
- end
133
-
134
- private
135
-
136
- def set_output_file_path
137
- self.output_file_path = self.rel_output_file_path()
138
- self.save!
139
- end
140
- end