brocket 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,22 @@
1
+ #
2
+ # [config] IMAGE_NAME: "rails-example"
3
+ # [config] DOCKER_PUSH_COMMAND: "gcloud docker push"
4
+ # [config] DOCKER_PUSH_REGISTRY: "asia.gcr.io"
5
+ # [config] DOCKER_PUSH_USERNAME: "groovenauts"
6
+ #
7
+
8
+ FROM groovenauts/ruby:2.1.2
9
+ MAINTAINER tech@groovenauts.jp
10
+
11
+ ENV RAILS_ENV production
12
+
13
+ # for debug via HTTP dicrectly
14
+ EXPOSE 3000
15
+
16
+ ADD . /usr/src/app
17
+ WORKDIR /usr/src/app
18
+ VOLUME /usr/src/app/log
19
+
20
+ RUN bundle install --system
21
+
22
+ CMD ["bundle", "exec", "rails", "s", "-e", "production"]
@@ -1,6 +1,9 @@
1
1
  #
2
2
  # [config] IMAGE_NAME: "groovenauts/rails-example"
3
3
  # [config]
4
+ # [config] # 作業ディレクトリ
5
+ # [config] WORKING_DIR: "."
6
+ # [config]
4
7
  # [config] # ビルド前
5
8
  # [config] BEFORE_BUILD:
6
9
  # [config] - abc
@@ -0,0 +1,19 @@
1
+ #
2
+ # [config] IMAGE_NAME: "groovenauts/rails-example"
3
+ # [config] VERSION_FILE: "not-existing"
4
+
5
+ FROM groovenauts/ruby:2.1.2
6
+ MAINTAINER tech@groovenauts.jp
7
+
8
+ ENV RAILS_ENV production
9
+
10
+ # for debug via HTTP dicrectly
11
+ EXPOSE 3000
12
+
13
+ ADD . /usr/src/app
14
+ WORKDIR /usr/src/app
15
+ VOLUME /usr/src/app/log
16
+
17
+ RUN bundle install --system
18
+
19
+ CMD ["bundle", "exec", "rails", "s", "-e", "production"]
@@ -0,0 +1,21 @@
1
+ #
2
+ # [config] IMAGE_NAME: "groovenauts/rails-example"
3
+ # [config]
4
+ # [config] WORKING_DIR: ".."
5
+ #
6
+
7
+ FROM groovenauts/ruby:2.1.2
8
+ MAINTAINER tech@groovenauts.jp
9
+
10
+ ENV RAILS_ENV production
11
+
12
+ # for debug via HTTP dicrectly
13
+ EXPOSE 3000
14
+
15
+ ADD . /usr/src/app
16
+ WORKDIR /usr/src/app
17
+ VOLUME /usr/src/app/log
18
+
19
+ RUN bundle install --system
20
+
21
+ CMD ["bundle", "exec", "rails", "s", "-e", "production"]
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe BRocket::Base do
4
+
5
+ let(:subject){ BRocket::Base.new }
6
+
7
+ describe :sh do
8
+ let(:cmd){ 'echo "FOO"' }
9
+ it "without dryrun" do
10
+ expect(LoggerPipe).to receive(:run).with(BRocket.logger, cmd, dry_run: nil)
11
+ end
12
+ it "with dryrun" do
13
+ subject.options = {dryrun: true}
14
+ expect(LoggerPipe).to receive(:run).with(BRocket.logger, cmd, dry_run: true)
15
+ end
16
+
17
+ after do
18
+ subject.sh(cmd)
19
+ end
20
+ end
21
+
22
+ describe :verbose do
23
+ let(:msg){ "FOOO" }
24
+ it "without verbose" do
25
+ expect(BRocket.logger).not_to receive(:debug).with(msg)
26
+ subject.verbose(msg)
27
+ end
28
+ it "without verbose" do
29
+ subject.options = {verbose: true}
30
+ called = false
31
+ expect(BRocket.logger).to receive(:debug) do |actual_msg|
32
+ expect(actual_msg.strip).to match /#{msg}/
33
+ called = true
34
+ end
35
+ subject.verbose(msg)
36
+ expect(called).to be_truthy
37
+ end
38
+ end
39
+ end
@@ -4,18 +4,30 @@ describe BRocket::Docker do
4
4
 
5
5
  let(:subject){ BRocket::Docker.new }
6
6
 
7
+ let(:image_name){ "groovenauts/rails-example" }
8
+ let(:version){ "2.3.4" }
9
+
10
+ let(:expected_options){ {"dockerfile"=>"Dockerfile"} }
11
+ before do
12
+ version_file = double(:version_file, current: version)
13
+ allow(version_file).to receive(:options=).with(expected_options)
14
+ allow(BRocket::VersionFile).to receive(:new).and_return(version_file)
15
+ end
16
+
7
17
  describe "Dockerfile-basic" do
8
18
  let(:filepath){ File.expand_path("../Dockerfiles/Dockerfile-basic", __FILE__) }
9
- let(:image_name){ "groovenauts/rails-example" }
10
- let(:version){ "2.3.4" }
19
+ before{ allow(BRocket).to receive(:user_pwd).and_return(File.dirname(filepath)) }
11
20
 
12
21
  before do
13
22
  allow(subject).to receive(:read_config_file).with(any_args).and_return(File.read(filepath))
14
- allow_any_instance_of(BRocket::VersionFile).to receive(:current).and_return(version)
15
23
  end
16
24
 
17
25
  describe :config do
18
26
  it{ expect(subject.config_hash).to eq({"IMAGE_NAME" => image_name}) }
27
+ it do
28
+ expect($stdout).to receive(:puts).with(YAML.dump(subject.config_hash))
29
+ subject.config
30
+ end
19
31
  end
20
32
 
21
33
  describe :build do
@@ -24,22 +36,85 @@ describe BRocket::Docker do
24
36
  subject.build
25
37
  end
26
38
  end
39
+
40
+ describe :push do
41
+ it do
42
+ expect(subject).to receive(:sh).with("docker push #{image_name}:#{version}")
43
+ subject.push
44
+ end
45
+ end
27
46
  end
28
47
 
48
+ describe "Dockerfile-gcr" do
49
+ let(:original_image_name){ "rails-example" }
50
+ let(:gcr_image_name){ "asia.gcr.io/groovenauts/rails-example" }
51
+ let(:filepath){ File.expand_path("../Dockerfiles/Dockerfile-gcr", __FILE__) }
52
+ before{ allow(BRocket).to receive(:user_pwd).and_return(File.dirname(filepath)) }
29
53
 
30
- describe "Dockerfile-basic" do
54
+ before do
55
+ allow(subject).to receive(:read_config_file).with(any_args).and_return(File.read(filepath))
56
+ end
57
+
58
+ describe :push do
59
+ it do
60
+ expected_cmd = [
61
+ "docker tag -f #{original_image_name}:#{version} #{gcr_image_name}:#{version}",
62
+ "gcloud docker push #{gcr_image_name}:#{version}"
63
+ ].join(' && ')
64
+ expect(subject).to receive(:sh).with(expected_cmd)
65
+ subject.push
66
+ end
67
+ end
68
+ end
69
+
70
+ describe "Dockerfile-working_dir" do
71
+ let(:filepath){ File.expand_path("../Dockerfiles/Dockerfile-working_dir", __FILE__) }
72
+ let(:expected_options){ {dockerfile: filepath} }
73
+ before{ allow(BRocket).to receive(:user_pwd).and_return(File.dirname(filepath)) }
74
+
75
+ before do
76
+ allow(subject).to receive(:read_config_file).with(any_args).and_return(File.read(filepath))
77
+ end
78
+
79
+ describe :config do
80
+ it{ expect(subject.config_hash).to eq({"IMAGE_NAME" => image_name, "WORKING_DIR" => ".."}) }
81
+ end
82
+
83
+ describe :build do
84
+ it do
85
+ dir = File.expand_path("../..", filepath)
86
+ expect(Dir).to receive(:chdir).with(dir).and_yield
87
+ expect(subject).to receive(:sh).with("docker build -t #{image_name}:#{version} -f Dockerfiles/Dockerfile-working_dir .")
88
+ subject.options = {dockerfile: filepath}
89
+ subject.build
90
+ end
91
+ end
92
+ end
93
+
94
+
95
+ describe "Dockerfile not found" do
96
+ let(:filepath){ File.expand_path("../Dockerfiles/Dockerfile-noexist", __FILE__) }
97
+ before{ allow(BRocket).to receive(:user_pwd).and_return(File.dirname(filepath)) }
98
+
99
+ describe :config do
100
+ it do
101
+ expect{ subject.config }.to raise_error(/file not found/i)
102
+ end
103
+ end
104
+ end
105
+
106
+ describe "Dockerfile-hook" do
31
107
  let(:filepath){ File.expand_path("../Dockerfiles/Dockerfile-hook", __FILE__) }
32
- let(:image_name){ "groovenauts/rails-example" }
33
- let(:version){ "2.3.4" }
108
+ before{ allow(BRocket).to receive(:user_pwd).and_return(File.dirname(filepath)) }
34
109
 
35
110
  before do
36
111
  allow(subject).to receive(:read_config_file).with(any_args).and_return(File.read(filepath))
37
- allow_any_instance_of(BRocket::VersionFile).to receive(:current).and_return(version)
38
112
  end
39
113
 
40
114
  describe :config do
41
115
  it do
42
116
  expected = {
117
+ "WORKING_DIR" => ".",
43
118
  "IMAGE_NAME" => image_name,
44
119
  "BEFORE_BUILD" => ["abc", "def ghi"],
45
120
  "AFTER_BUILD" => ["jkl", "mno"],
@@ -74,6 +149,23 @@ describe BRocket::Docker do
74
149
  }.to raise_error(error_msg)
75
150
  end
76
151
  end
152
+
153
+ describe :call_before_build do
154
+ it do
155
+ expect(Dir).to receive(:chdir).with(subject.working_dir).and_yield
156
+ expect(subject).to receive(:sh).with("abc")
157
+ expect(subject).to receive(:sh).with("def ghi")
158
+ subject.call_before_build
159
+ end
160
+ end
161
+ describe :call_after_build do
162
+ it do
163
+ expect(Dir).to receive(:chdir).with(subject.working_dir).and_yield
164
+ expect(subject).to receive(:sh).with("jkl")
165
+ expect(subject).to receive(:sh).with("mno")
166
+ subject.call_after_build
167
+ end
168
+ end
77
169
  end
78
170
 
79
171
  end
@@ -1,18 +1,27 @@
1
1
  require 'spec_helper'
2
2
 
3
+ require 'logger_pipe'
4
+
3
5
  describe BRocket::Git do
4
6
 
5
7
  let(:subject){ BRocket::Git.new }
6
8
 
7
9
  describe "Dockerfile-basic" do
8
10
  let(:filepath){ File.expand_path("../Dockerfiles/Dockerfile-git-tag", __FILE__) }
11
+ let(:version_path){ File.expand_path("../Dockerfiles/VERSION", __FILE__) }
9
12
  let(:image_name){ "groovenauts/rails-example" }
10
13
  let(:tag_prefix){ "containers/rails_example/" }
11
14
  let(:version){ "2.3.4" }
12
15
 
13
16
  before do
14
- allow_any_instance_of(BRocket::Docker).to receive(:read_config_file).with(any_args).and_return(File.read(filepath))
15
- allow_any_instance_of(BRocket::VersionFile).to receive(:current).and_return(version)
17
+ docker = BRocket::Docker.new
18
+ allow(BRocket::Docker).to receive(:new).and_return(docker)
19
+ allow(docker).to receive(:read_config_file).with(any_args).and_return(File.read(filepath))
20
+
21
+ version_file = double(:version_file)
22
+ allow(BRocket::VersionFile).to receive(:new).and_return(version_file)
23
+ allow(version_file).to receive(:options=)
24
+ allow(version_file).to receive(:current).and_return(version)
16
25
  end
17
26
 
18
27
  describe :config do
@@ -20,7 +29,90 @@ describe BRocket::Git do
20
29
  expect(subject.version_tag).to eq("containers/rails_example/2.3.4")
21
30
  end
22
31
  end
32
+ end
33
+
34
+ describe "Dockerfile-basic" do
35
+ let(:filepath){ File.expand_path("../Dockerfiles/Dockerfile-git-tag", __FILE__) }
36
+ let(:version_path){ File.expand_path("../Dockerfiles/VERSION", __FILE__) }
37
+ before do
38
+ subject.options = {dockerfile: filepath}
39
+ allow(BRocket).to receive(:user_pwd).and_return(File.dirname(filepath))
40
+ end
41
+
42
+ describe :guard_clean do
43
+ it :clean_and_commited do
44
+ expect(subject).to receive(:sh).with("git diff --exit-code")
45
+ expect(subject).to receive(:sh).with("git diff-index --quiet --cached HEAD")
46
+ expect(subject).to receive(:success).with(an_instance_of(String))
47
+ subject.guard_clean
48
+ end
49
+
50
+ context :error do
51
+ it :clean_and_not_commited do
52
+ expect(subject).to receive(:sh).with("git diff --exit-code")
53
+ expect(subject).to receive(:sh).with("git diff-index --quiet --cached HEAD").and_raise(LoggerPipe::Failure.new("not committed", nil))
54
+ end
55
+
56
+ it :not_clean_and_commited do
57
+ expect(subject).to receive(:sh).with("git diff --exit-code").and_raise(LoggerPipe::Failure.new("not clean", nil))
58
+ allow(subject).to receive(:sh).with("git diff-index --quiet --cached HEAD")
59
+ end
60
+
61
+ it :not_clean_and_not_commited do
62
+ expect(subject).to receive(:sh).with("git diff --exit-code").and_raise(LoggerPipe::Failure.new("not clean", nil))
63
+ allow(subject).to receive(:sh).with("git diff-index --quiet --cached HEAD").and_raise(LoggerPipe::Failure.new("not committed", nil))
64
+ end
65
+
66
+ after do
67
+ expect(subject).to receive(:error).with(an_instance_of(String))
68
+ expect(subject).not_to receive(:success).with(an_instance_of(String))
69
+ subject.guard_clean
70
+ end
71
+ end
72
+ end
73
+
74
+ describe :push do
75
+ it :valid do
76
+ expect(subject).to receive(:sh).with("git tag").and_return(%w[0.9.1 0.9.2].join("\n"))
77
+ expect(subject).to receive(:sh).with("git tag -a -m \"Version containers/rails_example/1.0.0\" containers/rails_example/1.0.0")
78
+ expect($stdout).to receive(:puts).with(/tagged containers\/rails_example\/1\.0\.0/i)
79
+ expect(subject).to receive(:sh).with("git push")
80
+ expect(subject).to receive(:sh).with("git push --tags")
81
+ expect($stdout).to receive(:puts).with(/pushed/i)
82
+ subject.push
83
+ end
84
+ it :already_tagged do
85
+ expect(subject).to receive(:sh).with("git tag").and_return(%w[0.9.1 0.9.2 1.0.0 1.0.1].map{|v| "containers/rails_example/#{v}"}.join("\n"))
86
+ expect($stderr).to receive(:puts).with(/tag .+ already .+ created/i)
87
+ subject.push
88
+ end
89
+
90
+ context :error do
91
+ before do
92
+ expect(subject).to receive(:sh).with("git tag").and_return(%w[0.9.1 0.9.2].join("\n"))
93
+ end
94
+
95
+ it "do untagging on error at git tag" do
96
+ expect(subject).to receive(:sh).
97
+ with("git tag -a -m \"Version containers/rails_example/1.0.0\" containers/rails_example/1.0.0").
98
+ and_raise(LoggerPipe::Failure.new("something wrong", nil))
99
+ expect($stderr).to receive(:puts).with(/untagging/i)
100
+ expect(subject).to receive(:sh).with("git tag -d containers/rails_example/1.0.0")
101
+ expect{ subject.push }.to raise_error(LoggerPipe::Failure)
102
+ end
23
103
 
104
+ it "do untagging on error at git push" do
105
+ expect(subject).to receive(:sh).with("git tag -a -m \"Version containers/rails_example/1.0.0\" containers/rails_example/1.0.0")
106
+ expect($stdout).to receive(:puts).with(/tagged containers\/rails_example\/1\.0\.0/i)
107
+ expect(subject).to receive(:sh).with("git push").
108
+ and_raise(LoggerPipe::Failure.new("something wrong", nil))
109
+ expect($stderr).to receive(:puts).with(/untagging/i)
110
+ expect(subject).to receive(:sh).with("git tag -d containers/rails_example/1.0.0")
111
+ expect{ subject.push }.to raise_error(LoggerPipe::Failure)
112
+ end
113
+ end
114
+
115
+ end
24
116
  end
25
117
 
26
118
  end
@@ -0,0 +1,13 @@
1
+ "app1" is old application and "app2" is newer application.
2
+
3
+ "app2" works with "app1" on the container. So the container of app2 includes app1.
4
+
5
+ ## Directories
6
+
7
+ - app1
8
+ - docker
9
+ - Dockerfile
10
+ - VERSION.txt
11
+ - app2
12
+ - Dockerfile
13
+ - VERSION
@@ -0,0 +1,22 @@
1
+ #
2
+ # [config] IMAGE_NAME: "old_app1"
3
+ # [config]
4
+ # [config] WORKING_DIR: ".."
5
+ # [config] VERSION_FILE: "VERSION.txt"
6
+ #
7
+
8
+ FROM groovenauts/ruby:2.1.2
9
+ MAINTAINER tech@groovenauts.jp
10
+
11
+ ENV RAILS_ENV production
12
+
13
+ # for debug via HTTP dicrectly
14
+ EXPOSE 3000
15
+
16
+ ADD . /usr/src/app1
17
+ WORKDIR /usr/src/app1
18
+ VOLUME /usr/src/app1/log
19
+
20
+ RUN bundle install --system
21
+
22
+ CMD ["bundle", "exec", "rails", "s", "-e", "production"]
@@ -0,0 +1,23 @@
1
+ #
2
+ # [config] IMAGE_NAME: "new_app2"
3
+ # [config]
4
+ # [config] WORKING_DIR: ".."
5
+ # [config] GIT_TAG_PREFIX: "app2/"
6
+ #
7
+
8
+ FROM groovenauts/ruby:2.1.2
9
+ MAINTAINER tech@groovenauts.jp
10
+
11
+ ENV RAILS_ENV production
12
+
13
+ # for debug via HTTP dicrectly
14
+ EXPOSE 3000
15
+
16
+ ADD app1 /usr/src/app1
17
+ ADD app2 /usr/src/app2
18
+ WORKDIR /usr/src/app2
19
+ VOLUME /usr/src/app2/log
20
+
21
+ RUN bundle install --system
22
+
23
+ CMD ["bundle", "exec", "rails", "s", "-e", "production"]