magi 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/README.md +2 -2
- data/app/assets/stylesheets/jobs.scss +4 -0
- data/app/assets/stylesheets/mixin.scss +20 -0
- data/app/controllers/application_controller.rb +2 -16
- data/app/models/job.rb +27 -31
- data/app/views/jobs/_form.html.slim +3 -14
- data/db/schema.rb +9 -9
- data/lib/magi/version.rb +1 -1
- data/plugins/simplecov/simplecov.rb +14 -1
- data/spec/magi/command_spec.rb +49 -0
- data/spec/spec_helper.rb +6 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d9b37e2f2249ebba06dacf853b32344b7de4dbc8
|
4
|
+
data.tar.gz: 07d0c016c8eb3cbd46433416923d912d44f8025a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14299f4ba42d7a39813ad25815abde2cc7096c000f5ad660599c1afc3010b2f6555872dbd229a422228e770f1c828d8875dbe163091a203f1f3cff5604f5a216
|
7
|
+
data.tar.gz: a0f096a9d2dbf44468755b1a84312abd4df7bb161c93bdc2c6a45d167bc9e274b2aec86928cae26846b3e1df7666ff6fdde610c6adf71c5c4e8b5a9dc88afc00
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
# Magi
|
1
|
+
# Magi [![Build Status](https://travis-ci.org/r7kamura/magi.png?branch=master)](https://travis-ci.org/r7kamura/magi) [![Code Climate](https://codeclimate.com/github/r7kamura/magi.png)](https://codeclimate.com/github/r7kamura/magi) [![Coverage Status](https://coveralls.io/repos/r7kamura/magi/badge.png)](https://coveralls.io/r/r7kamura/magi)
|
2
2
|
Casual CI server system (magi is a temporal name).
|
3
3
|
|
4
4
|
## Usage
|
5
5
|
```
|
6
6
|
$ gem install magi # install magi.gem
|
7
|
-
$ brew install mysql redis # install
|
7
|
+
$ brew install mysql redis # install mysql and redis
|
8
8
|
$ magi setup # create mysql tables
|
9
9
|
$ magi start # launch server on http://localhost:3000
|
10
10
|
```
|
@@ -4,3 +4,23 @@
|
|
4
4
|
padding: .2em .6em;
|
5
5
|
margin-bottom: .5em;
|
6
6
|
}
|
7
|
+
|
8
|
+
@mixin stripe {
|
9
|
+
background-size: 30px 30px;
|
10
|
+
background-color: #ddd;
|
11
|
+
background-image: linear-gradient(
|
12
|
+
135deg,
|
13
|
+
rgba(255, 255, 255, .30) 25%,
|
14
|
+
transparent 25%,
|
15
|
+
transparent 50%,
|
16
|
+
rgba(255, 255, 255, .30) 50%,
|
17
|
+
rgba(255, 255, 255, .30) 75%,
|
18
|
+
transparent 75%,
|
19
|
+
transparent
|
20
|
+
);
|
21
|
+
-webkit-animation: progress 3s linear infinite;
|
22
|
+
}
|
23
|
+
|
24
|
+
@-webkit-keyframes progress {
|
25
|
+
0% { background-position: 0 0; } 100% { background-position: 60px 0; }
|
26
|
+
}
|
@@ -3,23 +3,9 @@ class ApplicationController < ActionController::Base
|
|
3
3
|
|
4
4
|
respond_to :html, :json
|
5
5
|
|
6
|
-
rescue_from WeakParameters::ValidationError do
|
7
|
-
head 400
|
8
|
-
end
|
9
|
-
|
10
6
|
self.responder = Magi::Responder
|
11
7
|
|
12
|
-
|
13
|
-
|
14
|
-
def require_resource_params
|
15
|
-
head 400 unless resource_params
|
16
|
-
end
|
17
|
-
|
18
|
-
def resource_name
|
19
|
-
self.class.name.split("::").last.sub(/Controller$/, "").singularize.underscore
|
20
|
-
end
|
21
|
-
|
22
|
-
def resource_params
|
23
|
-
params[resource_name]
|
8
|
+
rescue_from WeakParameters::ValidationError do
|
9
|
+
head 400
|
24
10
|
end
|
25
11
|
end
|
data/app/models/job.rb
CHANGED
@@ -13,6 +13,12 @@ class Job < ActiveRecord::Base
|
|
13
13
|
|
14
14
|
delegate :scheduled?, to: :scheduler, allow_nil: true
|
15
15
|
|
16
|
+
property(:description, type: :text)
|
17
|
+
|
18
|
+
property(:script, type: :text)
|
19
|
+
|
20
|
+
property(:schedule, placeholder: "* * * * *")
|
21
|
+
|
16
22
|
class << self
|
17
23
|
def create_with_properties(params)
|
18
24
|
new.update_attributes_with_properties(params)
|
@@ -55,12 +61,6 @@ class Job < ActiveRecord::Base
|
|
55
61
|
end
|
56
62
|
end
|
57
63
|
|
58
|
-
property(:description)
|
59
|
-
|
60
|
-
property(:schedule)
|
61
|
-
|
62
|
-
property(:script)
|
63
|
-
|
64
64
|
def run
|
65
65
|
script ? execute : raise_script_not_found
|
66
66
|
end
|
@@ -70,22 +70,12 @@ class Job < ActiveRecord::Base
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def enqueue
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
def enqueue_with_before_enqueues
|
77
|
-
if self.class.before_enqueues.all? {|hook| instance_exec(&hook) != false }
|
78
|
-
enqueue_without_before_enqueues
|
79
|
-
end
|
73
|
+
enqueue_without_before_enqueues if execute_before_enqueues
|
80
74
|
end
|
81
|
-
alias_method_chain :enqueue, :before_enqueues
|
82
75
|
|
83
|
-
def
|
84
|
-
|
85
|
-
self.class.after_enqueues.all? {|hook| instance_exec(&hook) != false }
|
86
|
-
end
|
76
|
+
def enqueue_without_before_enqueues
|
77
|
+
builds.create.tap(&:enqueue).tap { execute_after_enqueues }
|
87
78
|
end
|
88
|
-
alias_method_chain :enqueue, :after_enqueues
|
89
79
|
|
90
80
|
def status_name
|
91
81
|
last_finished_build.try(:status_name) || "unfinished"
|
@@ -100,9 +90,7 @@ class Job < ActiveRecord::Base
|
|
100
90
|
end
|
101
91
|
|
102
92
|
def update_attributes_with_properties(params)
|
103
|
-
params.slice(:name, *self.class.property_names).each
|
104
|
-
send("#{key}=", value)
|
105
|
-
end
|
93
|
+
params.slice(:name, *self.class.property_names).each {|key, value| send("#{key}=", value) }
|
106
94
|
tap(&:save)
|
107
95
|
end
|
108
96
|
|
@@ -117,21 +105,29 @@ class Job < ActiveRecord::Base
|
|
117
105
|
end
|
118
106
|
|
119
107
|
def execute
|
120
|
-
|
108
|
+
execute_before_executes
|
109
|
+
workspace.chdir { execute_script }.tap { execute_after_executes }
|
121
110
|
end
|
122
111
|
|
123
|
-
def
|
112
|
+
def execute_script
|
113
|
+
Magi::Executer.execute(script)
|
114
|
+
end
|
115
|
+
|
116
|
+
def execute_before_enqueues
|
117
|
+
self.class.before_enqueues.all? {|hook| instance_exec(&hook) != false }
|
118
|
+
end
|
119
|
+
|
120
|
+
def execute_after_enqueues
|
121
|
+
self.class.after_enqueues.all? {|hook| instance_exec(&hook) != false }
|
122
|
+
end
|
123
|
+
|
124
|
+
def execute_before_executes
|
124
125
|
self.class.before_executes.all? {|hook| instance_exec(&hook) != false }
|
125
|
-
execute_without_before_executes
|
126
126
|
end
|
127
|
-
alias_method_chain :execute, :before_executes
|
128
127
|
|
129
|
-
def
|
130
|
-
|
131
|
-
self.class.after_executes.all? {|hook| instance_exec(&hook) != false }
|
132
|
-
end
|
128
|
+
def execute_after_executes
|
129
|
+
self.class.after_executes.all? {|hook| instance_exec(&hook) != false }
|
133
130
|
end
|
134
|
-
alias_method_chain :execute, :after_executes
|
135
131
|
|
136
132
|
def raise_script_not_found
|
137
133
|
raise ScriptNotFound, 'You must set properties["script"]'
|
@@ -6,28 +6,17 @@ section.job_settings
|
|
6
6
|
p= f.label :name
|
7
7
|
p= f.text_field :name, placeholder: "required"
|
8
8
|
|
9
|
-
.field
|
10
|
-
p= f.label :description
|
11
|
-
p= f.text_area :description, rows: 3
|
12
|
-
|
13
|
-
.field
|
14
|
-
p= f.label :script
|
15
|
-
p= f.text_area :script, rows: 6
|
16
|
-
|
17
|
-
.field
|
18
|
-
p= f.label :schedule
|
19
|
-
p= f.text_field :schedule, placeholder: "* * * * *"
|
20
|
-
|
21
9
|
- resource.class.properties.each do |property|
|
22
|
-
- next if property.name.in?([:description, :schedule, :script])
|
23
10
|
.field
|
24
11
|
p= f.label property.name
|
25
12
|
p
|
26
13
|
- case property.type
|
27
14
|
- when :boolean
|
28
15
|
= f.check_box property.name, {}, "true", "false"
|
16
|
+
- when :text
|
17
|
+
= f.text_area property.name, rows: 3
|
29
18
|
- else
|
30
|
-
= f.text_field property.name
|
19
|
+
= f.text_field property.name, placeholder: property.options[:placeholder]
|
31
20
|
|
32
21
|
.field
|
33
22
|
p= f.submit class: "button"
|
data/db/schema.rb
CHANGED
@@ -9,28 +9,28 @@
|
|
9
9
|
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
10
10
|
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
11
11
|
#
|
12
|
-
# It's strongly recommended
|
12
|
+
# It's strongly recommended that you check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(:
|
14
|
+
ActiveRecord::Schema.define(version: 20130608153655) do
|
15
15
|
|
16
|
-
create_table "builds", :
|
16
|
+
create_table "builds", force: true do |t|
|
17
17
|
t.boolean "status"
|
18
18
|
t.datetime "started_at"
|
19
19
|
t.datetime "finished_at"
|
20
20
|
t.integer "job_id"
|
21
21
|
t.text "output"
|
22
|
-
t.datetime "created_at", :
|
23
|
-
t.datetime "updated_at", :
|
22
|
+
t.datetime "created_at", null: false
|
23
|
+
t.datetime "updated_at", null: false
|
24
24
|
t.text "properties"
|
25
25
|
end
|
26
26
|
|
27
|
-
add_index "builds", ["job_id"], :
|
27
|
+
add_index "builds", ["job_id"], name: "index_builds_on_job_id", using: :btree
|
28
28
|
|
29
|
-
create_table "jobs", :
|
29
|
+
create_table "jobs", force: true do |t|
|
30
30
|
t.string "name"
|
31
31
|
t.text "properties"
|
32
|
-
t.datetime "created_at", :
|
33
|
-
t.datetime "updated_at", :
|
32
|
+
t.datetime "created_at", null: false
|
33
|
+
t.datetime "updated_at", null: false
|
34
34
|
end
|
35
35
|
|
36
36
|
end
|
data/lib/magi/version.rb
CHANGED
@@ -14,7 +14,7 @@ module Magi
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def enabled?
|
17
|
-
job.enable_simplecov
|
17
|
+
!!job.enable_simplecov
|
18
18
|
end
|
19
19
|
|
20
20
|
def workspace_path
|
@@ -67,10 +67,19 @@ module Magi
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def save
|
70
|
+
save_files
|
71
|
+
save_build
|
72
|
+
end
|
73
|
+
|
74
|
+
def save_files
|
70
75
|
current_build_path.mkpath
|
71
76
|
symlink_assets
|
72
77
|
copy_result_html
|
73
78
|
end
|
79
|
+
|
80
|
+
def save_build
|
81
|
+
job.current_build.update_properties(coverage: last_coverage)
|
82
|
+
end
|
74
83
|
end
|
75
84
|
end
|
76
85
|
|
@@ -83,3 +92,7 @@ Job.class_eval do
|
|
83
92
|
@coverage ||= Magi::SimpleCov.new(self)
|
84
93
|
end
|
85
94
|
end
|
95
|
+
|
96
|
+
Build.class_eval do
|
97
|
+
property(:coverage)
|
98
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Magi::Command do
|
4
|
+
let(:command) do
|
5
|
+
described_class.new(arguments)
|
6
|
+
end
|
7
|
+
|
8
|
+
describe ".call" do
|
9
|
+
it "delegates to #call" do
|
10
|
+
described_class.any_instance.should_receive(:call)
|
11
|
+
described_class.call(["setup"])
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#call" do
|
16
|
+
context "with `setup`" do
|
17
|
+
let(:arguments) do
|
18
|
+
["setup"]
|
19
|
+
end
|
20
|
+
|
21
|
+
it "executes setup script" do
|
22
|
+
command.should_receive(:system).with("cd #{Dir.pwd} && rake db:create db:migrate")
|
23
|
+
command.call
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "with `start`" do
|
28
|
+
let(:arguments) do
|
29
|
+
["start"]
|
30
|
+
end
|
31
|
+
|
32
|
+
it "executes start script" do
|
33
|
+
command.should_receive(:system).with({ "WORKSPACE_PATH" => Dir.pwd }, "cd #{Dir.pwd} && foreman start")
|
34
|
+
command.call
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "with unknown arguments" do
|
39
|
+
let(:arguments) do
|
40
|
+
[]
|
41
|
+
end
|
42
|
+
|
43
|
+
it "shows usage" do
|
44
|
+
command.should_receive(:puts).with("Usage: magi {setup|start}")
|
45
|
+
command.call
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: magi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-06-
|
11
|
+
date: 2013-06-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: clockwork
|
@@ -373,6 +373,7 @@ files:
|
|
373
373
|
- script/rails
|
374
374
|
- spec/factories/build.rb
|
375
375
|
- spec/factories/job.rb
|
376
|
+
- spec/magi/command_spec.rb
|
376
377
|
- spec/models/build_spec.rb
|
377
378
|
- spec/models/job_spec.rb
|
378
379
|
- spec/requests/builds_spec.rb
|
@@ -412,6 +413,7 @@ summary: Magi
|
|
412
413
|
test_files:
|
413
414
|
- spec/factories/build.rb
|
414
415
|
- spec/factories/job.rb
|
416
|
+
- spec/magi/command_spec.rb
|
415
417
|
- spec/models/build_spec.rb
|
416
418
|
- spec/models/job_spec.rb
|
417
419
|
- spec/requests/builds_spec.rb
|