evrone-ci-worker 0.2.0.pre27 → 0.2.0.pre28

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1d9087b50e29982ccf2df4af64ce15f8e6e10801
4
- data.tar.gz: 9c3c7f1304a4a5aed273e5906387a50dddbca6c0
3
+ metadata.gz: e6cf0b0887a284839ad78e87338b5c6c01b6387f
4
+ data.tar.gz: 9d0bc82d9da7bfb5b03d226fa5387e477e858672
5
5
  SHA512:
6
- metadata.gz: fb491b907daf77ece535d898e6c4594b4e0865b7b7d44a53794871a75a7aa75ea1b8baf54cdd4e7bf2af8042accd47162a3acf848ad66d9125869a57a32086de
7
- data.tar.gz: 035e7619385e2dcff48ff222a2bdf8d9c5607d27f949bb3b597d449851b690b48e8128cf5efd45ad9a4b0930b8392e250af1627097a1a358e10ff439cd2b0a83
6
+ metadata.gz: f4ba61e8fc3398c563d264071290d2e214f1d6c1c505b8e0300fab0d869f97232dd6a29ad53ceb49988ce8c881fda7f175bc3db183693d8e694e8bf4b10b8dad
7
+ data.tar.gz: 94eccc5cfebd5472a7c69c40fb7b1acb236e2e70282691f4eba171c8e1ff0bf306d2bce0665303864e3ec7477f525680ac372f2969a9254826b1f71e12cc0bed
data/Gemfile CHANGED
@@ -4,3 +4,4 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
  gem 'evrone-ci-common', path: File.expand_path("../../common", __FILE__)
6
6
  gem 'evrone-ci-message', path: File.expand_path("../../message", __FILE__)
7
+ gem 'evrone-ci-container_connector', path: File.expand_path("../../container_connector", __FILE__)
data/Rakefile CHANGED
@@ -23,5 +23,5 @@ end
23
23
 
24
24
  desc "run travis build"
25
25
  task :travis do
26
- exec "bundle exec rake SPEC_OPTS='--format documentation -t ~run_docker --order=rand'"
26
+ exec "bundle exec rake SPEC_OPTS='--format documentation -t ~docker --order=rand'"
27
27
  end
@@ -18,10 +18,10 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_runtime_dependency 'evrone-ci-common', "= #{Evrone::CI::Worker::VERSION}"
22
- spec.add_runtime_dependency 'evrone-ci-message', "= #{Evrone::CI::Worker::VERSION}"
21
+ spec.add_runtime_dependency 'evrone-ci-common', "= #{Evrone::CI::Worker::VERSION}"
22
+ spec.add_runtime_dependency 'evrone-ci-message', "= #{Evrone::CI::Worker::VERSION}"
23
+ spec.add_runtime_dependency 'evrone-ci-container_connector', "= #{Evrone::CI::Worker::VERSION}"
23
24
  spec.add_runtime_dependency 'evrone-common-amqp', '~> 0.2.5'
24
- spec.add_runtime_dependency 'docker-api', '= 1.5.4'
25
25
  spec.add_runtime_dependency 'hashr', '= 0.0.22'
26
26
 
27
27
  spec.add_development_dependency "bundler", "~> 1.3"
@@ -22,12 +22,8 @@ module Evrone
22
22
  autoload :LogJob, File.expand_path("../worker/middlewares/log_job", __FILE__)
23
23
  autoload :UpdateJobStatus, File.expand_path("../worker/middlewares/update_job_status", __FILE__)
24
24
  autoload :Timeout, File.expand_path("../worker/middlewares/timeout", __FILE__)
25
-
26
- autoload :LocalCreateDirs, File.expand_path("../worker/middlewares/local_create_dirs", __FILE__)
27
- autoload :LocalScript, File.expand_path("../worker/middlewares/local_script", __FILE__)
28
-
29
- autoload :DockerStartContainer, File.expand_path("../worker/middlewares/docker_start_container", __FILE__)
30
- autoload :DockerScript, File.expand_path("../worker/middlewares/docker_script", __FILE__)
25
+ autoload :StartConnector, File.expand_path("../worker/middlewares/start_connector", __FILE__)
26
+ autoload :RunScript, File.expand_path("../worker/middlewares/run_script", __FILE__)
31
27
 
32
28
  module Helper
33
29
  autoload :Logger, File.expand_path("../worker/helper/logger", __FILE__)
@@ -19,24 +19,19 @@ module Evrone
19
19
  timeout: 30 * 60,
20
20
  logger: Common::TaggedLogging.new(Logger.new STDOUT),
21
21
 
22
- tmp_dir_name: "tmp",
23
-
24
22
  workers: 1,
25
23
  path_prefix: nil,
26
24
 
27
25
  docker: {
28
- remote_dir: "/home/ci",
26
+ user: "ci",
27
+ password: "ci",
29
28
  init: %w{ /usr/bin/runsvdir -P /etc/service },
30
29
  image: "dmexe/ci",
30
+ remote_dir: "/home/ci",
31
+ },
31
32
 
32
- ssh: {
33
- host: nil, # used in tests
34
- port: nil, # used in tests
35
- user: "ci",
36
- password: "ci"
37
- },
38
-
39
- create_options: nil # used in tests
33
+ local: {
34
+ remote_dir: "/tmp/.local_connector"
40
35
  }
41
36
 
42
37
  def timeout
@@ -55,6 +50,14 @@ module Evrone
55
50
  @@null_logger
56
51
  end
57
52
 
53
+ def connector_options
54
+ self[self.run]
55
+ end
56
+
57
+ def connector_remote_dir
58
+ connector_options[:remote_dir]
59
+ end
60
+
58
61
  end
59
62
  end
60
63
  end
@@ -14,8 +14,8 @@ module Evrone
14
14
  use LogJob
15
15
  use UpdateJobStatus
16
16
  use Timeout
17
- use DockerStartContainer
18
- use DockerScript
17
+ use StartConnector
18
+ use RunScript
19
19
  end
20
20
 
21
21
  def initialize(job, _)
@@ -9,23 +9,22 @@ module Evrone
9
9
 
10
10
  include Common::Helper::Middlewares
11
11
 
12
- attr_reader :job, :path_prefix
12
+ attr_reader :job
13
13
 
14
14
  middlewares do
15
15
  use LogJob
16
16
  use UpdateJobStatus
17
17
  use Timeout
18
- use LocalCreateDirs
19
- use LocalScript
18
+ use StartConnector
19
+ use RunScript
20
20
  end
21
21
 
22
- def initialize(job, path_prefix)
23
- @job = job
24
- @path_prefix = Pathname.new(path_prefix).expand_path
22
+ def initialize(job, _)
23
+ @job = job
25
24
  end
26
25
 
27
26
  def perform
28
- env = OpenStruct.new job: job, path_prefix: path_prefix
27
+ env = OpenStruct.new job: job
29
28
  run_middlewares(env){ |_| 0 }
30
29
  end
31
30
 
@@ -1,15 +1,17 @@
1
+ require 'evrone/ci/common'
2
+
1
3
  module Evrone
2
4
  module CI
3
5
  module Worker
4
6
 
5
- DockerScript = Struct.new(:app) do
7
+ RunScript = Struct.new(:app) do
6
8
 
7
9
  include Helper::Logger
8
10
  include Helper::Config
9
11
  include Common::Helper::UploadShCommand
10
12
 
11
13
  def call(env)
12
- if env.ssh && env.docker_repo_dir
14
+ if env.spawner
13
15
  code = run_script(env)
14
16
  run_after_script(env)
15
17
 
@@ -31,32 +33,30 @@ module Evrone
31
33
  private
32
34
 
33
35
  def run_script(env)
34
- home = config.docker.remote_dir
35
- file = [home, ".ci_build.sh"].join("/")
36
+ file = [env.spawner.work_dir, ".ci_build.sh"].join("/")
36
37
 
37
- script = [upload_sh_command(file, script_content(env, home))]
38
+ script = [upload_sh_command(file, script_content(env))]
38
39
  script << "env - HOME=$HOME bash #{file}"
39
40
  script = script.join(" && ")
40
41
 
41
- env.ssh.spawn script, chdir: home, read_timeout: read_timeout, &env.job.method(:add_to_output)
42
+ env.spawner.spawn script, read_timeout: read_timeout, &env.job.method(:add_to_output)
42
43
  end
43
44
 
44
45
  def run_after_script(env)
45
- home = config.docker.remote_dir
46
- file = [home, ".ci_after_build.sh"].join("/")
46
+ file = [env.spawner.work_dir, ".ci_after_build.sh"].join("/")
47
47
 
48
48
  script = [upload_sh_command(file, after_script_content(env))]
49
49
  script << "env - HOME=$HOME bash #{file}"
50
50
  script = script.join(" && ")
51
51
 
52
- env.ssh.spawn script, chdir: home, read_timeout: read_timeout, &env.job.method(:add_to_output)
52
+ env.spawner.spawn script, read_timeout: read_timeout, &env.job.method(:add_to_output)
53
53
  end
54
54
 
55
- def script_content(env, home)
55
+ def script_content(env)
56
56
  buf = ["set -e"]
57
- buf << "echo before_script > #{home}/.ci_state"
57
+ buf << "echo before_script > #{env.spawner.work_dir}/.ci_state"
58
58
  buf << env.job.message.before_script
59
- buf << "echo script > #{home}/.ci_state"
59
+ buf << "echo script > #{env.spawner.work_dir}/.ci_state"
60
60
  buf << env.job.message.script
61
61
  buf.join("\n")
62
62
  end
@@ -68,10 +68,9 @@ module Evrone
68
68
  end
69
69
 
70
70
  def read_state(env)
71
- home = config.docker.remote_dir
72
71
  buf = ""
73
- state_file = "#{home}/.ci_state"
74
- env.ssh.spawn "cat #{state_file}" do |out|
72
+ state_file = "#{env.spawner.work_dir}/.ci_state"
73
+ env.spawner.spawn "cat #{state_file}" do |out|
75
74
  buf << out
76
75
  end
77
76
  buf.strip
@@ -0,0 +1,36 @@
1
+ require 'socket'
2
+ require 'pathname'
3
+ require 'evrone/ci/container_connector'
4
+
5
+ module Evrone
6
+ module CI
7
+ module Worker
8
+
9
+ StartConnector = Struct.new(:app) do
10
+
11
+ include Helper::Config
12
+ include Helper::Logger
13
+
14
+ def call(env)
15
+ options = config.connector_options
16
+ options.merge! logger: logger
17
+ env.connector = Evrone::CI::ContainerConnector.lookup(config.run, options)
18
+ env.connector.start do |spawner|
19
+ env.job.add_to_output "using #{Socket.gethostname}##{spawner.id}\n"
20
+ logger.tagged("#{spawner.id}") do
21
+ begin
22
+ env.spawner = spawner
23
+ app.call env
24
+ ensure
25
+ env.spawner = spawner
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+
36
+
@@ -1,7 +1,7 @@
1
1
  module Evrone
2
2
  module CI
3
3
  module Worker
4
- VERSION = "0.2.0.pre27"
4
+ VERSION = "0.2.0.pre28"
5
5
  end
6
6
  end
7
7
  end
@@ -4,26 +4,27 @@ describe Evrone::CI::Worker::Configuration do
4
4
  let(:config) { Evrone::CI::Worker.config }
5
5
  subject { config }
6
6
 
7
- its(:run) { should eq :docker }
8
- its(:docker) { should be }
9
- its(:tmp_dir_name) { should eq 'tmp' }
10
- its(:timeout) { should eq 1800 }
11
- its(:amqp_url) { should be_nil }
7
+ its(:run) { should eq :docker }
8
+ its(:docker) { should be }
9
+ its(:timeout) { should eq 1800 }
10
+ its(:amqp_url) { should be_nil }
11
+ its(:connector_options) { should eq config.docker }
12
+ its(:connector_remote_dir) { should eq config.docker.remote_dir }
12
13
 
13
14
  context "docker" do
14
15
  subject { config.docker }
15
16
 
16
- its(:ssh) { should be }
17
- its(:remote_dir) { should eq '/home/ci' }
18
- its(:init) { should be }
19
- its(:image) { should eq 'dmexe/ci' }
17
+ its(:user) { should be }
18
+ its(:password) { should be }
19
+ its(:init) { should be }
20
+ its(:image) { should be }
21
+ its(:remote_dir) { should be }
20
22
  end
21
23
 
22
- context "docker.ssh" do
23
- subject { config.docker.ssh }
24
+ context "local" do
25
+ subject { config.local }
24
26
 
25
- its(:user) { should eq 'ci' }
26
- its(:password) { should eq 'ci' }
27
+ its(:remote_dir){ should be }
27
28
  end
28
29
 
29
30
  context ".configure" do
@@ -33,7 +34,7 @@ describe Evrone::CI::Worker::Configuration do
33
34
  c.docker.image = 'image'
34
35
  end
35
36
  }
36
- its(:run) { should eq :local }
37
- its("docker.image") { should eq 'image' }
37
+ its(:run) { should eq :local }
38
+ its("docker.image") { should eq 'image' }
38
39
  end
39
40
  end
@@ -1,20 +1,19 @@
1
1
  require 'spec_helper'
2
- require 'pathname'
3
- require 'fileutils'
4
2
 
5
- describe Evrone::CI::Worker::Docker do
3
+ describe Evrone::CI::Worker::Docker, docker: true do
6
4
  let(:options) { { } }
7
5
  let(:job) { create :job, options }
8
- let(:path) { '/tmp/.ci' }
9
- let(:local) { described_class.new job, path }
6
+ let(:local) { described_class.new job, nil }
10
7
  subject { local }
11
8
 
12
- after { FileUtils.rm_rf path }
13
-
14
- context "perform", run_docker: true do
9
+ context "perform" do
15
10
  subject { local.perform }
16
11
  it { should eq 0 }
17
12
 
13
+ before do
14
+ Evrone::CI::Worker.config.run = "docker"
15
+ end
16
+
18
17
  context "when fail before_script" do
19
18
  let(:options) { { before_script: "false" } }
20
19
  it { should eq(-1) }
@@ -1,18 +1,18 @@
1
1
  require 'spec_helper'
2
- require 'pathname'
3
- require 'fileutils'
4
2
 
5
3
  describe Evrone::CI::Worker::Local do
6
4
  let(:options) { { } }
7
5
  let(:job) { create :job, options }
8
- let(:path) { '/tmp/.ci' }
9
- let(:local) { described_class.new job, path }
6
+ let(:local) { described_class.new job, nil }
10
7
  subject { local }
11
8
 
12
- after { FileUtils.rm_rf path }
13
-
14
- context "perform", local_run: true do
9
+ context "perform" do
15
10
  subject { local.perform }
11
+
12
+ before do
13
+ Evrone::CI::Worker.config.run = "local"
14
+ end
15
+
16
16
  it { should eq 0 }
17
17
 
18
18
  context "when fail before_script" do
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe Evrone::CI::Worker::RunScript do
4
+ let(:exit_code) { 0 }
5
+ let(:app) { ->(_) { exit_code } }
6
+ let(:script) { "echo script" }
7
+ let(:before_script) { "echo before_script" }
8
+ let(:after_script) { "echo after_script" }
9
+ let(:job) { create :job,
10
+ script: script,
11
+ before_script: before_script,
12
+ after_script: after_script }
13
+ let(:env) { OpenStruct.new job: job }
14
+ let(:mid) { described_class.new app }
15
+ let(:connector_mid) { Evrone::CI::Worker::StartConnector.new(mid) }
16
+
17
+ subject { connector_mid.call env }
18
+
19
+ shared_examples "run script" do
20
+
21
+ it "should be" do
22
+ expect(subject).to eq 0
23
+ job.release
24
+ expect(all_job_log_output).to match("script")
25
+ expect(all_job_log_output).to match("after_script")
26
+ end
27
+
28
+ context "when script failed" do
29
+ let(:script) { "false" }
30
+ it "should be" do
31
+ expect(subject).to eq(1)
32
+ job.release
33
+ expect(all_job_log_output).to match("after_script")
34
+ end
35
+ end
36
+
37
+ context "when before_script failed" do
38
+ let(:before_script) { "false" }
39
+ it "should be" do
40
+ expect(subject).to eq(-1)
41
+ job.release
42
+ expect(all_job_log_output).to match("after_script")
43
+ end
44
+ end
45
+ end
46
+
47
+ context "local connector" do
48
+ before do
49
+ Evrone::CI::Worker.config.run = "local"
50
+ end
51
+
52
+ it_should_behave_like "run script"
53
+ end
54
+
55
+ context "local connector", docker: true do
56
+ before do
57
+ Evrone::CI::Worker.config.run = "docker"
58
+ end
59
+
60
+ it_should_behave_like "run script"
61
+ end
62
+ end
63
+
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe Evrone::CI::Worker::StartConnector do
4
+ let(:exit_code) { 0 }
5
+ let(:app) { ->(_) { exit_code } }
6
+ let(:job) { create :job }
7
+ let(:env) { OpenStruct.new job: job }
8
+ let(:mid) { described_class.new app }
9
+
10
+ subject { mid.call env }
11
+
12
+ context "local connector" do
13
+ before do
14
+ Evrone::CI::Worker.config.run = "local"
15
+ end
16
+
17
+ it "should successfully start" do
18
+ expect(subject).to eq 0
19
+ expect(env.connector).to be
20
+ end
21
+ end
22
+
23
+ context "docker connector", docker: true do
24
+ before do
25
+ Evrone::CI::Worker.config.run = "docker"
26
+ end
27
+
28
+ it "should successfully start" do
29
+ expect(subject).to eq 0
30
+ expect(env.connector).to be
31
+ end
32
+ end
33
+ end
34
+
@@ -14,5 +14,15 @@ RSpec.configure do |config|
14
14
  config.before(:each) do
15
15
  Evrone::Common::AMQP::Testing.clear
16
16
  Evrone::CI::Worker.reset_config!
17
+
18
+ Evrone::CI::Worker.configure do |c|
19
+ =begin
20
+ c.docker.ssh.port = 2223
21
+ c.docker.ssh.host = 'localhost'
22
+ c.docker.create_options = {
23
+ 'PortSpecs' => ['2022:22']
24
+ }
25
+ =end
26
+ end
17
27
  end
18
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evrone-ci-worker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0.pre27
4
+ version: 0.2.0.pre28
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Galinsky
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-03 00:00:00.000000000 Z
11
+ date: 2013-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: evrone-ci-common
@@ -16,56 +16,56 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.2.0.pre27
19
+ version: 0.2.0.pre28
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.2.0.pre27
26
+ version: 0.2.0.pre28
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: evrone-ci-message
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.2.0.pre27
33
+ version: 0.2.0.pre28
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 0.2.0.pre27
40
+ version: 0.2.0.pre28
41
41
  - !ruby/object:Gem::Dependency
42
- name: evrone-common-amqp
42
+ name: evrone-ci-container_connector
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 0.2.5
47
+ version: 0.2.0.pre28
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 0.2.5
54
+ version: 0.2.0.pre28
55
55
  - !ruby/object:Gem::Dependency
56
- name: docker-api
56
+ name: evrone-common-amqp
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '='
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: 1.5.4
61
+ version: 0.2.5
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '='
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: 1.5.4
68
+ version: 0.2.5
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: hashr
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -169,11 +169,9 @@ files:
169
169
  - lib/evrone/ci/worker/initializers/amqp.rb
170
170
  - lib/evrone/ci/worker/job.rb
171
171
  - lib/evrone/ci/worker/local.rb
172
- - lib/evrone/ci/worker/middlewares/docker_script.rb
173
- - lib/evrone/ci/worker/middlewares/docker_start_container.rb
174
- - lib/evrone/ci/worker/middlewares/local_create_dirs.rb
175
- - lib/evrone/ci/worker/middlewares/local_script.rb
176
172
  - lib/evrone/ci/worker/middlewares/log_job.rb
173
+ - lib/evrone/ci/worker/middlewares/run_script.rb
174
+ - lib/evrone/ci/worker/middlewares/start_connector.rb
177
175
  - lib/evrone/ci/worker/middlewares/timeout.rb
178
176
  - lib/evrone/ci/worker/middlewares/update_job_status.rb
179
177
  - lib/evrone/ci/worker/version.rb
@@ -181,11 +179,9 @@ files:
181
179
  - spec/lib/worker/docker_spec.rb
182
180
  - spec/lib/worker/job_spec.rb
183
181
  - spec/lib/worker/local_spec.rb
184
- - spec/lib/worker/middlewares/docker_script_spec.rb
185
- - spec/lib/worker/middlewares/docker_start_container_spec.rb
186
- - spec/lib/worker/middlewares/local_create_dirs_spec.rb
187
- - spec/lib/worker/middlewares/local_script_spec.rb
188
182
  - spec/lib/worker/middlewares/log_job_spec.rb
183
+ - spec/lib/worker/middlewares/run_script_spec.rb
184
+ - spec/lib/worker/middlewares/start_connector_spec.rb
189
185
  - spec/lib/worker/middlewares/timeout_spec.rb
190
186
  - spec/lib/worker/middlewares/update_job_status_spec.rb
191
187
  - spec/lib/worker_spec.rb
@@ -223,11 +219,9 @@ test_files:
223
219
  - spec/lib/worker/docker_spec.rb
224
220
  - spec/lib/worker/job_spec.rb
225
221
  - spec/lib/worker/local_spec.rb
226
- - spec/lib/worker/middlewares/docker_script_spec.rb
227
- - spec/lib/worker/middlewares/docker_start_container_spec.rb
228
- - spec/lib/worker/middlewares/local_create_dirs_spec.rb
229
- - spec/lib/worker/middlewares/local_script_spec.rb
230
222
  - spec/lib/worker/middlewares/log_job_spec.rb
223
+ - spec/lib/worker/middlewares/run_script_spec.rb
224
+ - spec/lib/worker/middlewares/start_connector_spec.rb
231
225
  - spec/lib/worker/middlewares/timeout_spec.rb
232
226
  - spec/lib/worker/middlewares/update_job_status_spec.rb
233
227
  - spec/lib/worker_spec.rb
@@ -1,83 +0,0 @@
1
- require 'docker'
2
- require 'evrone/common/spawn'
3
- require 'socket'
4
- require 'pathname'
5
-
6
- module Evrone
7
- module CI
8
- module Worker
9
-
10
- DockerStartContainer = Struct.new(:app) do
11
-
12
- include Helper::Config
13
- include Helper::Logger
14
- include Evrone::Common::Spawn
15
-
16
- def call(env)
17
- spawn_container(env) do
18
- open_ssh_session(env) do
19
- app.call env
20
- end
21
- end
22
- end
23
-
24
- private
25
-
26
- def open_ssh_session(env)
27
- host = env.container_addr
28
- user = config.docker.ssh.user
29
- pass = config.docker.ssh.password
30
-
31
- ssh_options = {
32
- password: pass,
33
- port: config.docker.ssh.port || 22,
34
- paranoid: false,
35
- forward_agent: false
36
- }
37
- sleep 2
38
- env.job.add_to_output "open ssh session to #{user}@#{host}:#{ssh_options[:port]}\n"
39
- open_ssh(host, "ci", ssh_options) do |ssh|
40
- begin
41
- env.ssh = ssh
42
- logger.tagged "ssh" do
43
- yield
44
- end
45
- end
46
- end
47
- end
48
-
49
- def spawn_container(env)
50
- env.container = ::Docker::Container.create create_options
51
- env.container.start
52
-
53
- env.job.add_to_output "using #{Socket.gethostname}/#{env.container.id}\n"
54
-
55
- env.container_addr = env.container.json['NetworkSettings']['IPAddress']
56
- env.docker_repo_dir = Pathname.new(config.docker.remote_dir).join(env.job.message.name)
57
-
58
- logger.tagged "docker #{env.container.id}" do
59
- begin
60
- logger.info "start container"
61
- sleep 3
62
- yield
63
- ensure
64
- env.container.stop
65
- logger.info "stop container"
66
- end
67
- end
68
- end
69
-
70
- def create_options
71
- {
72
- 'Cmd' => config.docker.init,
73
- 'Image' => config.docker.image,
74
- 'Memory' => 1610612736, # 1.5g
75
- }.merge(config.docker.create_options || {})
76
- end
77
-
78
- end
79
- end
80
- end
81
- end
82
-
83
-
@@ -1,29 +0,0 @@
1
- require 'evrone/ci/common'
2
-
3
- module Evrone
4
- module CI
5
- module Worker
6
-
7
- LocalCreateDirs = Struct.new(:app) do
8
-
9
- include Common::Helper::Shell
10
- include Worker::Helper::Config
11
-
12
- def call(env)
13
- tmp_dir! env
14
-
15
- app.call env
16
- end
17
-
18
- private
19
-
20
- def tmp_dir!(env)
21
- env.tmp_dir = env.path_prefix.join(config.tmp_dir_name)
22
- .join(env.job.message.name)
23
- recreate env.tmp_dir
24
- end
25
- end
26
-
27
- end
28
- end
29
- end
@@ -1,53 +0,0 @@
1
- require 'evrone/ci/common'
2
-
3
- module Evrone
4
- module CI
5
- module Worker
6
-
7
- LocalScript = Struct.new(:app) do
8
-
9
- include Common::Helper::Shell
10
-
11
- def call(env)
12
- script = env.tmp_dir.join("build.sh")
13
- write_file script, content(env), 0700
14
-
15
- code = bash file: script, &env.job.method(:add_to_output)
16
-
17
- if code == 0
18
- app.call env
19
- else
20
- state = read_state(env)
21
- case state
22
- when "script"
23
- code
24
- else
25
- code * -1
26
- end
27
- end
28
- end
29
-
30
- private
31
-
32
- def content(env)
33
- buf = ["set -e"]
34
- buf << "echo before_script > #{env.tmp_dir}/state"
35
- buf << env.job.message.before_script
36
- buf << "echo script > #{env.tmp_dir}/state"
37
- buf << env.job.message.script
38
- buf.join("\n")
39
- end
40
-
41
- def read_state(env)
42
- state_file = env.tmp_dir.join("state")
43
- if File.readable? state_file
44
- File.read(state_file).strip
45
- end
46
- end
47
-
48
- end
49
- end
50
- end
51
- end
52
-
53
-
@@ -1,48 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Evrone::CI::Worker::DockerScript, run_docker: true do
4
- let(:exit_code) { 0 }
5
- let(:app) { ->(_) { exit_code } }
6
- let(:script) { "echo script" }
7
- let(:before_script) { "echo before_script" }
8
- let(:after_script) { "echo after_script" }
9
- let(:job) { create :job,
10
- script: script,
11
- before_script: before_script,
12
- after_script: after_script }
13
- let(:env) { OpenStruct.new job: job }
14
- let(:mid) { described_class.new app }
15
- let(:docker_mid) { Evrone::CI::Worker::DockerStartContainer.new(mid) }
16
-
17
- subject { docker_mid.call env }
18
-
19
- before do
20
- stub(env).docker_repo_dir { Pathname.new '/tmp' }
21
- end
22
-
23
- it "should be" do
24
- expect(subject).to eq 0
25
- job.release
26
- expect(all_job_log_output).to match("script")
27
- expect(all_job_log_output).to match("after_script")
28
- end
29
-
30
- context "when script failed" do
31
- let(:script) { "false" }
32
- it "should be" do
33
- expect(subject).to eq(1)
34
- job.release
35
- expect(all_job_log_output).to match("after_script")
36
- end
37
- end
38
-
39
- context "when before_script failed" do
40
- let(:before_script) { "false" }
41
- it "should be" do
42
- expect(subject).to eq(-1)
43
- job.release
44
- expect(all_job_log_output).to match("after_script")
45
- end
46
- end
47
- end
48
-
@@ -1,21 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Evrone::CI::Worker::DockerStartContainer, run_docker: true do
4
- let(:exit_code) { 0 }
5
- let(:app) { ->(_) { exit_code } }
6
- let(:job) { create :job }
7
- let(:env) { OpenStruct.new job: job }
8
- let(:mid) { described_class.new app }
9
-
10
- subject { mid.call env }
11
-
12
- it "should be" do
13
- expect(subject).to eq 0
14
-
15
- expect(env.ssh).to be
16
- expect(env.container).to be
17
- expect(env.docker_repo_dir.to_s).to eq "/home/ci/evrone/test-repo"
18
- end
19
-
20
- end
21
-
@@ -1,32 +0,0 @@
1
- require 'spec_helper'
2
- require 'pathname'
3
- require 'fileutils'
4
-
5
- describe Evrone::CI::Worker::LocalCreateDirs do
6
- let(:app) { ->(_) { 0 } }
7
- let(:job) { create :job }
8
- let(:path_prefix) { Pathname.new '/tmp/.ci' }
9
- let(:env) { OpenStruct.new job: job, path_prefix: path_prefix }
10
- let(:mid) { described_class.new app }
11
-
12
- subject { mid.call env }
13
-
14
- after do
15
- FileUtils.rm_rf path_prefix
16
- end
17
-
18
- it { should eq 0 }
19
-
20
- context "create and assign directories" do
21
-
22
- before do
23
- subject
24
- end
25
-
26
- it "tmp_dir" do
27
- expect(env.tmp_dir.to_s).to eq '/tmp/.ci/tmp/evrone/test-repo'
28
- expect(File.directory? env.tmp_dir).to be
29
- end
30
-
31
- end
32
- end
@@ -1,45 +0,0 @@
1
- require 'spec_helper'
2
- require 'pathname'
3
- require 'fileutils'
4
-
5
- describe Evrone::CI::Worker::LocalScript do
6
- let(:before_script) { "echo before_script" }
7
- let(:script) { "echo script" }
8
- let(:app) { ->(_) { 0 } }
9
- let(:job) { create :job, script: script, before_script: before_script }
10
- let(:path_prefix) { Pathname.new "/tmp/.ci" }
11
- let(:work_dir) { path_prefix.join("work") }
12
- let(:tmp_dir) { path_prefix.join("tmp") }
13
- let(:env) { OpenStruct.new job: job, work_dir: work_dir, tmp_dir: tmp_dir }
14
- let(:mid) { described_class.new app }
15
-
16
- subject { mid.call env }
17
-
18
- after do
19
- FileUtils.rm_rf path_prefix
20
- end
21
-
22
- before do
23
- FileUtils.mkdir_p work_dir
24
- FileUtils.mkdir_p tmp_dir
25
- end
26
-
27
- it { should eq 0 }
28
-
29
- it "should capture output" do
30
- subject
31
- job.release
32
- expect(last_job_log_message.log).to be_include("before_script\nscript\n")
33
- end
34
-
35
- context "when script failed" do
36
- let(:script) { 'false' }
37
- it { should satisfy { |n| [1,127].include?(n) } }
38
- end
39
-
40
- context "when before_script failed" do
41
- let(:before_script) { 'false' }
42
- it { should satisfy { |n| [-1,-127].include?(n) } }
43
- end
44
- end
45
-