brocket 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2cf15efdda61d666c2aa047bdda6db4024ac212e
4
- data.tar.gz: e90df6e84b87669fe3d7640098028f4a051671c6
3
+ metadata.gz: 11877a1035cefbf2e5fc03974785020abe76f506
4
+ data.tar.gz: 7aa8e5b2ea41dabf1340bb7aa3ec88dec609c703
5
5
  SHA512:
6
- metadata.gz: 268c7b07e00950c094bf5e10763e9bb4bb1c3a59fc1f956fe9a94bec10c0d77ce2e4fb42a9c575e8a31f9f826353dfdbf0fa547d7e848626874767a0d37a95c0
7
- data.tar.gz: b1e6605471f85a84ad8d44f6ca3bf0bb1367f542f658e61791045c79cbdbc4ec6087d280a872fbc2e63585bfa4bf05a9fa819ee0a6e682428f00ca42dda308a8
6
+ metadata.gz: 38588fe126cef222d6a46d947c16431707b8ffb49c7f10ba47c408a69e8c32c92e1849c4a5b7cebb080d036efdc20a66070a97e580622edea37ac8c28b517525
7
+ data.tar.gz: 26c84f52932368579a46644ca90e76a8a2ac81a2d72556cfa833dcf62e36a51d56fb3a3edea1c467f2060fa9e6512f610aa0afe61f9011905af7b71ce9e39994
@@ -10,6 +10,8 @@ module BRocket
10
10
  CONFIG_LINE_HEADER = /\A\#\s*#{Regexp.escape(CONFIG_LINE_SEP)}\s?/.freeze
11
11
 
12
12
  class_option :dockerfile, aliases: '-f', type: :string, default: "Dockerfile", desc: "Dockerfile to build"
13
+ # This option is used in Brocket::Docker, but it can set via BRocket::Cli
14
+ class_option :use_sudo_for_docker, aliases: '-S', type: :string, default: "auto", desc: "auto, true, false"
13
15
 
14
16
  no_commands do
15
17
  def config_image_name
@@ -57,7 +57,7 @@ module BRocket
57
57
  def build_build_command
58
58
  img_name = config_image_name
59
59
  version = sub(VersionFile).current
60
- cmd = "docker build -t #{img_name}:#{version}"
60
+ cmd = sudo("docker build -t #{img_name}:#{version}")
61
61
  if options[:dockerfile]
62
62
  fp = config_relpath
63
63
  unless fp == "Dockerfile"
@@ -77,12 +77,12 @@ module BRocket
77
77
  build_cmd = config_hash['DOCKER_PUSH_COMMAND'] || 'docker push'
78
78
  cmd = [
79
79
  (registry || username) ?
80
- "docker tag -f #{config_image_name}:#{version} #{img_name}:#{version}" : nil,
80
+ sudo("docker tag -f #{config_image_name}:#{version} #{img_name}:#{version}") : nil,
81
81
  (registry || username) && extra_tag ?
82
- "docker tag -f #{config_image_name}:#{version} #{img_name}:#{extra_tag}" : nil,
83
- "#{build_cmd} #{img_name}:#{version}",
82
+ sudo("docker tag -f #{config_image_name}:#{version} #{img_name}:#{extra_tag}") : nil,
83
+ sudo("#{build_cmd} #{img_name}:#{version}"),
84
84
  extra_tag ?
85
- "#{build_cmd} #{img_name}:#{extra_tag}" : nil,
85
+ sudo("#{build_cmd} #{img_name}:#{extra_tag}") : nil,
86
86
  ].compact.join(' && ')
87
87
  return cmd
88
88
  end
@@ -93,6 +93,18 @@ module BRocket
93
93
  commands = commands.compact.map(&:strip).reject(&:empty?)
94
94
  commands.each{|cmd| sh(cmd) }
95
95
  end
96
+
97
+ def sudo(cmd)
98
+ if @sudo_required.nil?
99
+ @sudo_required =
100
+ case options[:use_sudo_for_docker]
101
+ when /auto/i then !system("docker ps >/dev/null 2>/dev/null")
102
+ when /true/i then true
103
+ else false
104
+ end
105
+ end
106
+ @sudo_required ? "sudo #{cmd}" : cmd
107
+ end
96
108
  end
97
109
 
98
110
  end
data/lib/brocket/git.rb CHANGED
@@ -7,9 +7,15 @@ module BRocket
7
7
 
8
8
  desc "guard_clean", "Raise error if some difference exists."
9
9
  def guard_clean
10
- (clean? && committed?) ?
11
- success("[git guard_clean] OK") :
10
+ if (clean? && committed?)
11
+ if already_tagged? && !same_commit_as?(version_tag)
12
+ error("#{version_tag} is already tagged to another commit")
13
+ else
14
+ success("[git guard_clean] OK")
15
+ end
16
+ else
12
17
  error("There are files that need to be committed first. Run `git status`")
18
+ end
13
19
  end
14
20
 
15
21
  desc "push", "push commit and tag it"
@@ -73,6 +79,14 @@ module BRocket
73
79
  "%s%s" % [prefix, version]
74
80
  end
75
81
 
82
+ def same_commit_as?(tag)
83
+ get_sha(tag) == get_sha("HEAD")
84
+ end
85
+
86
+ def get_sha(obj)
87
+ sh_stdout("git show #{obj} --format=\"%H\" --quiet").strip
88
+ end
89
+
76
90
  end
77
91
 
78
92
  end
@@ -1,3 +1,3 @@
1
1
  module BRocket
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
@@ -10,10 +10,12 @@ describe BRocket::Docker do
10
10
  let(:expected_options){ {"dockerfile"=>"Dockerfile"} }
11
11
  before do
12
12
  version_file = double(:version_file, current: version)
13
- allow(version_file).to receive(:options=).with(expected_options)
13
+ allow(version_file).to receive(:options=).with(Hash)
14
14
  allow(BRocket::VersionFile).to receive(:new).and_return(version_file)
15
15
  end
16
16
 
17
+ before{ allow(subject).to receive(:system).with("docker ps >/dev/null 2>/dev/null").and_return(true) }
18
+
17
19
  describe "Dockerfile-basic" do
18
20
  let(:filepath){ File.expand_path("../Dockerfiles/Dockerfile-basic", __FILE__) }
19
21
  before{ allow(BRocket).to receive(:user_pwd).and_return(File.dirname(filepath)) }
@@ -190,4 +192,62 @@ describe BRocket::Docker do
190
192
  end
191
193
  end
192
194
 
195
+ describe "use_sudo_for_docker" do
196
+ let(:filepath){ File.expand_path("../Dockerfiles/Dockerfile-basic", __FILE__) }
197
+ before{ allow(BRocket).to receive(:user_pwd).and_return(File.dirname(filepath)) }
198
+ before{ subject.options = {dockerfile: filepath} }
199
+
200
+ context "auto and need sudo" do
201
+ before{ subject.options = {use_sudo_for_docker: "auto"}.update(subject.options) }
202
+ before{ allow(subject).to receive(:system).with("docker ps >/dev/null 2>/dev/null").and_return(false) }
203
+ it :build do
204
+ expect(subject).to receive(:sh).with("sudo docker build -t #{image_name}:#{version} -f Dockerfile-basic .")
205
+ subject.build
206
+ end
207
+ it :push do
208
+ expect(subject).to receive(:sh).with("sudo docker push #{image_name}:#{version}")
209
+ subject.push
210
+ end
211
+ end
212
+
213
+ context "auto and don't need sudo" do
214
+ before{ subject.options = {use_sudo_for_docker: "auto"}.update(subject.options) }
215
+ before{ allow(subject).to receive(:system).with("docker ps >/dev/null 2>/dev/null").and_return(true) }
216
+ it :build do
217
+ expect(subject).to receive(:sh).with("docker build -t #{image_name}:#{version} -f Dockerfile-basic .")
218
+ subject.build
219
+ end
220
+ it :push do
221
+ expect(subject).to receive(:sh).with("docker push #{image_name}:#{version}")
222
+ subject.push
223
+ end
224
+ end
225
+
226
+ context "true" do
227
+ before{ subject.options = {use_sudo_for_docker: "true"}.update(subject.options) }
228
+ before{ allow(subject).to receive(:system).with("docker ps >/dev/null 2>/dev/null").and_return(false) }
229
+ it :build do
230
+ expect(subject).to receive(:sh).with("sudo docker build -t #{image_name}:#{version} -f Dockerfile-basic .")
231
+ subject.build
232
+ end
233
+ it :push do
234
+ expect(subject).to receive(:sh).with("sudo docker push #{image_name}:#{version}")
235
+ subject.push
236
+ end
237
+ end
238
+
239
+ context "false" do
240
+ before{ subject.options = {use_sudo_for_docker: "false"}.update(subject.options) }
241
+ before{ allow(subject).to receive(:system).with("docker ps >/dev/null 2>/dev/null").and_return(true) }
242
+ it :build do
243
+ expect(subject).to receive(:sh).with("docker build -t #{image_name}:#{version} -f Dockerfile-basic .")
244
+ subject.build
245
+ end
246
+ it :push do
247
+ expect(subject).to receive(:sh).with("docker push #{image_name}:#{version}")
248
+ subject.push
249
+ end
250
+ end
251
+ end
252
+
193
253
  end
@@ -40,6 +40,11 @@ describe BRocket::Git do
40
40
  end
41
41
 
42
42
  describe :guard_clean do
43
+ before do
44
+ allow(subject).to receive(:sh_stdout).with("git tag").and_return(%w[0.9.1 0.9.2].map{|v| "containers/rails_example/#{v}"}.join("\n"))
45
+ allow($stderr).to receive(:puts).with(/tag .+ already .+ created/i)
46
+ end
47
+
43
48
  it :clean_and_commited do
44
49
  expect(subject).to receive(:sh).with("git diff --exit-code")
45
50
  expect(subject).to receive(:sh).with("git diff-index --quiet --cached HEAD")
@@ -69,6 +74,33 @@ describe BRocket::Git do
69
74
  subject.guard_clean
70
75
  end
71
76
  end
77
+
78
+ context :already_tagged do
79
+ let(:sha01){ "7693b087d10319df5eaa78f016fd705a53f1d448" }
80
+ let(:sha02){ "a8dd73a3d43dd19077e333b71db8f2d86140df9e" }
81
+
82
+ before do
83
+ expect(subject).to receive(:sh).with("git diff --exit-code")
84
+ expect(subject).to receive(:sh).with("git diff-index --quiet --cached HEAD")
85
+ expect(subject).to receive(:sh_stdout).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
+ end
87
+
88
+ it "The SHAs are the same" do
89
+ expect(subject).to receive(:sh_stdout).with('git show containers/rails_example/1.0.0 --format="%H" --quiet').and_return(sha01)
90
+ expect(subject).to receive(:sh_stdout).with('git show HEAD --format="%H" --quiet').and_return(sha01)
91
+ expect(subject).to receive(:success).with(an_instance_of(String))
92
+ expect(subject).not_to receive(:error).with(an_instance_of(String))
93
+ subject.guard_clean
94
+ end
95
+
96
+ it "The HEAD SHA is different from the tag SHA" do
97
+ expect(subject).to receive(:sh_stdout).with('git show containers/rails_example/1.0.0 --format="%H" --quiet').and_return(sha01)
98
+ expect(subject).to receive(:sh_stdout).with('git show HEAD --format="%H" --quiet').and_return(sha02)
99
+ expect(subject).not_to receive(:success).with(an_instance_of(String))
100
+ expect(subject).to receive(:error).with(/already tagged/)
101
+ subject.guard_clean
102
+ end
103
+ end
72
104
  end
73
105
 
74
106
  describe :push do
@@ -136,6 +136,7 @@ describe :multi_app_proj do
136
136
  # obj.options = {dockerfile: docker_relpath}
137
137
  obj
138
138
  end
139
+ before{ allow(docker_obj).to receive(:system).with("docker ps >/dev/null 2>/dev/null").and_return(true) }
139
140
  it{ expect(docker_obj.working_dir).to eq File.expand_path("..", base_dir) }
140
141
  it{ expect(docker_obj.config_filepath).to eq File.expand_path("Dockerfile", base_dir) }
141
142
  it{ expect(docker_obj.config_relpath ).to eq "app2/Dockerfile" }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brocket
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - akima
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-03 00:00:00.000000000 Z
11
+ date: 2016-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor