evrone-ci-worker 0.2.0.pre4 → 0.2.0.pre5

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 (33) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -1
  3. data/bin/evrone-ci-worker +0 -1
  4. data/docker/bootstrap.sh +40 -11
  5. data/evrone-ci-worker.gemspec +0 -1
  6. data/lib/evrone/ci/worker/configuration.rb +3 -8
  7. data/lib/evrone/ci/worker/docker.rb +0 -2
  8. data/lib/evrone/ci/worker/job.rb +11 -6
  9. data/lib/evrone/ci/worker/local.rb +0 -1
  10. data/lib/evrone/ci/worker/middlewares/docker_script.rb +34 -10
  11. data/lib/evrone/ci/worker/middlewares/docker_start_container.rb +4 -3
  12. data/lib/evrone/ci/worker/middlewares/local_create_dirs.rb +0 -17
  13. data/lib/evrone/ci/worker/middlewares/local_script.rb +1 -1
  14. data/lib/evrone/ci/worker/middlewares/update_job_status.rb +1 -1
  15. data/lib/evrone/ci/worker/version.rb +1 -1
  16. data/lib/evrone/ci/worker.rb +4 -4
  17. data/spec/lib/worker/configuration_spec.rb +1 -2
  18. data/spec/lib/worker/job_spec.rb +21 -11
  19. data/spec/lib/worker/middlewares/docker_script_spec.rb +12 -2
  20. data/spec/lib/worker/middlewares/local_create_dirs_spec.rb +0 -10
  21. data/spec/lib/worker/middlewares/local_script_spec.rb +2 -1
  22. data/spec/support/all_job_log_output.rb +3 -0
  23. data/spec/support/create.rb +1 -15
  24. data/spec/support/last_job_logs_message.rb +3 -0
  25. metadata +10 -31
  26. data/lib/evrone/ci/worker/middlewares/docker_fetch_repo.rb +0 -73
  27. data/lib/evrone/ci/worker/middlewares/docker_webdav_cache.rb +0 -95
  28. data/lib/evrone/ci/worker/middlewares/local_fetch_repo.rb +0 -47
  29. data/lib/evrone/ci/worker/runner/docker.rb +0 -0
  30. data/lib/evrone/ci/worker/runner/local.rb +0 -52
  31. data/spec/lib/worker/middlewares/docker_fetch_repo_spec.rb +0 -26
  32. data/spec/lib/worker/middlewares/docker_webdav_cache_spec.rb +0 -49
  33. data/spec/lib/worker/middlewares/local_fetch_repo_spec.rb +0 -56
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 68127fd3cbc0497af22109a49d12dd4ce6fc6589
4
- data.tar.gz: 615fc7a4536c6dbb205d7f78313efd062e8e6907
3
+ metadata.gz: 73edf7643aed536ce533c1bf4933c5395952d512
4
+ data.tar.gz: b7ba035941f4101819506ab44f0dcf9e655d4e8d
5
5
  SHA512:
6
- metadata.gz: 0f3d0cb41b8f525031ae76b78a6b05c26ff8a63609e1991d8485cd714cf331e580ba7d7c6ea05a319f90c84d4810e011fd9e386bd764fad702f362f6bb8774a2
7
- data.tar.gz: dbd57ed0c0c7981b45c00c2f30aed6e71fc9abf5e7ceafb64e9782f98d67dd7a555d8ddb64850899ef0e8bbfcc98f79f1be360476c6b75642afbc6e3b3f2082d
6
+ metadata.gz: 8c9d3c82ba6750443f38bb71ca029f24128fb04f823af0105bff44093e952fc311be39e347b38992d0b5fcef49fdc9c790bf3c017c76b2527f648aef785eb8ee
7
+ data.tar.gz: bfeb80657ba8e550dbe0eceb132815eff2080f98442ece836a710a2dc9f5a122f736f8ac06a97f0f52e08fc962c2666ac279ffe1d15b4ef16ca65c5a53f5c049
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 -t ~webdav --order=rand'"
26
+ exec "bundle exec rake SPEC_OPTS='--format documentation -t ~run_docker --order=rand'"
27
27
  end
data/bin/evrone-ci-worker CHANGED
@@ -6,7 +6,6 @@ cli = Evrone::CI::Worker::CLI.new
6
6
 
7
7
  if RUBY_PLATFORM =~ /darwin/ # developer
8
8
  Evrone::CI::Worker.configure do |c|
9
- c.webdav_cache_url = 'http://10.0.2.15:8080'
10
9
  c.docker.ssh.port = 2223
11
10
  c.docker.ssh.host = 'localhost'
12
11
  c.docker.create_options = {
data/docker/bootstrap.sh CHANGED
@@ -6,12 +6,20 @@ set -e
6
6
  echo "deb http://us.archive.ubuntu.com/ubuntu/ precise universe" >> /etc/apt/sources.list
7
7
  echo "deb http://us.archive.ubuntu.com/ubuntu/ precise multiverse" >> /etc/apt/sources.list
8
8
 
9
+ # fixes locales
10
+ locale-gen en_US.UTF-8
11
+ dpkg-reconfigure -fnoninteractive locales
12
+ update-locale LC_ALL="en_US.UTF-8" LANG="en_US.UTF-8" LANGUAGE="en_US"
13
+ export LANGUAGE=en_US
14
+ export LANG=en_US.UTF-8
15
+ export LC_ALL=en_US.UTF-8
16
+
9
17
  # replace init
10
18
  dpkg-divert --local --rename --add /sbin/initctl
11
19
  ln -s /bin/true /sbin/initctl
12
20
 
13
21
  apt-get -qy update
14
- apt-get install -qy curl git-core build-essential
22
+ apt-get install -qy curl git-core build-essential vim-tiny
15
23
 
16
24
  # add evrone repo
17
25
  mkdir -p /etc/apt/sources.list.d
@@ -21,7 +29,7 @@ apt-get -qy update
21
29
 
22
30
  # add packages
23
31
  apt-get install -qy libmysqlclient-dev libpq-dev imagemagick libmagickwand-dev \
24
- libcurl4-openssl-dev nodejs postgresql-contrib-9.1 libxml2-dev libxslt-dev \
32
+ libcurl4-openssl-dev nodejs libxml2-dev libxslt-dev \
25
33
  openjdk-7-jre-headless libsqlite3-dev libgeos-dev ruby
26
34
 
27
35
  # install runit
@@ -35,24 +43,43 @@ echo "ci:ci" | chpasswd
35
43
  apt-get -qy install sudo
36
44
  echo "ci ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
37
45
 
38
- # fixes locales
39
- locale-gen en_US.UTF-8
40
- dpkg-reconfigure -fnoninteractive locales
41
- update-locale LC_ALL="en_US.UTF-8" LANG="en_US.UTF-8" LANGUAGE="en_US"
42
-
43
46
  # install ssh
44
47
  apt-get install -qy openssh-server
45
48
  mkdir -p /var/run/sshd
46
49
  sv-gen ssh "/usr/sbin/sshd -D -e"
47
50
 
48
51
  # install postgresql
49
- apt-get install -qy postgresql
50
- echo "host all all all trust" > /etc/postgresql/9.1/main/pg_hba.conf
52
+ apt-get install -qy postgresql-9.1 postgresql-contrib-9.1
53
+ echo "local all all trust" > /etc/postgresql/9.1/main/pg_hba.conf
54
+ echo "host all all all trust" >> /etc/postgresql/9.1/main/pg_hba.conf
51
55
  sv-gen postgresql "/usr/lib/postgresql/9.1/bin/postgres -D /var/lib/postgresql/9.1/main -c config_file=/etc/postgresql/9.1/main/postgresql.conf" postgres
52
56
 
53
57
  # install mysql
54
- apt-get install -qy mysql-server
55
- sv-gen mysqld "/usr/sbin/mysqld" mysql
58
+ apt-get install -qy mysql-server-5.5
59
+ sv-gen mysql "/usr/sbin/mysqld" mysql
60
+
61
+ # install redis-server
62
+ apt-get install -qy redis-server
63
+ sed -i 's|daemonize yes|daemonize no|g' /etc/redis/redis.conf
64
+ sv-gen redis-server "/usr/bin/redis-server /etc/redis/redis.conf" redis
65
+
66
+ # install rabbitmq-server
67
+ apt-get install -qy rabbitmq-server
68
+ sv-gen rabbitmq-server "/usr/sbin/rabbitmq-server" root
69
+
70
+ # install elasticsearch
71
+ ES_PKG=elasticsearch-0.90.5.deb
72
+ curl https://download.elasticsearch.org/elasticsearch/elasticsearch/$ES_PKG -o /tmp/$ES_PKG
73
+ dpkg -i /tmp/$ES_PKG
74
+ rm -f /tmp/$ES_PKG
75
+ sv-gen elasticsearch "/usr/share/elasticsearch/bin/elasticsearch -f -Des.path.data=/var/lib/elasticsearch" elasticsearch
76
+
77
+ # install phantomjs
78
+ PH_PKG=phantomjs-1.9.2-linux-x86_64.tar.bz2
79
+ curl https://phantomjs.googlecode.com/files/$PH_PKG -o /tmp/$PH_PKG
80
+ tar -jxf /tmp/$PH_PKG -C /usr/local
81
+ rm -f /tmp/$PH_PKG
82
+ ln -sf /usr/local/$(basename $PH_PKG .tar.bz2)/bin/phantomjs /usr/local/bin
56
83
 
57
84
  # add ruby
58
85
  apt-get install -qy rbenv rbenv-2.0.0-p195 rbenv-1.9.3-p448
@@ -64,3 +91,5 @@ apt-get -qy clean autoremove
64
91
 
65
92
  sv-enable postgresql
66
93
  sv-enable ssh
94
+ sv-enable mysql
95
+ sv-enable redis-server
@@ -23,7 +23,6 @@ Gem::Specification.new do |spec|
23
23
  spec.add_runtime_dependency 'evrone-common-amqp', '~> 0.1.1'
24
24
  spec.add_runtime_dependency 'docker-api', '= 1.5.4'
25
25
  spec.add_runtime_dependency 'hashr', '= 0.0.22'
26
- spec.add_runtime_dependency 'net-scp', '= 1.1.2'
27
26
 
28
27
  spec.add_development_dependency "bundler", "~> 1.3"
29
28
  spec.add_development_dependency "rake"
@@ -19,15 +19,10 @@ module Evrone
19
19
  timeout: 30 * 60,
20
20
  logger: Common::TaggedLogging.new(Logger.new STDOUT),
21
21
 
22
- work_dir_name: "work",
23
- repo_dir_name: "repo",
24
- tmp_dir_name: "tmp",
22
+ tmp_dir_name: "tmp",
25
23
 
26
- sleep_after_job: 5,
27
-
28
- workers: 1,
29
- path_prefix: nil,
30
- webdav_cache_url:nil,
24
+ workers: 1,
25
+ path_prefix: nil,
31
26
 
32
27
  docker: {
33
28
  remote_dir: "/home/ci",
@@ -14,8 +14,6 @@ module Evrone
14
14
  use LogJob
15
15
  use UpdateJobStatus
16
16
  use DockerStartContainer
17
- use DockerFetchRepo
18
- use DockerWebdavCache
19
17
  use DockerScript
20
18
  end
21
19
 
@@ -12,14 +12,13 @@ module Evrone
12
12
 
13
13
  def initialize(perform_job_message)
14
14
  @output_counter = 0
15
- @output = ""
16
15
  @message = perform_job_message
16
+ @output = Common::OutputBuffer.new(&method(:publish_job_log_message))
17
17
  end
18
18
 
19
19
  def add_to_output(str)
20
20
  output << str
21
21
  logger.debug str.strip if logger.level == 0
22
- JobLogsConsumer.publish create_job_log_message(str)
23
22
  end
24
23
 
25
24
  def add_command_to_output(cmd)
@@ -30,14 +29,20 @@ module Evrone
30
29
  add_to_output log.split(/\n/).map{|i| " ===> #{i}\n" }.join
31
30
  end
32
31
 
33
- def create_job_log_message(data)
32
+ def release
33
+ output.close
34
+ end
35
+
36
+ def publish_job_log_message(str)
34
37
  @output_counter += 1
35
- Message::JobLog.new(
38
+ log = Message::JobLog.new(
36
39
  build_id: message.id,
37
40
  job_id: message.job_id,
38
- tm: @output_counter,
39
- log: data
41
+ tm: output_counter,
42
+ log: str
40
43
  )
44
+ JobLogsConsumer.publish log
45
+ log
41
46
  end
42
47
 
43
48
  end
@@ -15,7 +15,6 @@ module Evrone
15
15
  use LogJob
16
16
  use UpdateJobStatus
17
17
  use LocalCreateDirs
18
- use LocalFetchRepo
19
18
  use LocalScript
20
19
  end
21
20
 
@@ -1,5 +1,3 @@
1
- require 'net/scp'
2
-
3
1
  module Evrone
4
2
  module CI
5
3
  module Worker
@@ -7,10 +5,14 @@ module Evrone
7
5
  DockerScript = Struct.new(:app) do
8
6
 
9
7
  include Helper::Logger
8
+ include Helper::Config
9
+ include Common::Helper::UploadShCommand
10
10
 
11
11
  def call(env)
12
12
  if env.ssh && env.docker_repo_dir
13
13
  code = run_script(env)
14
+ run_after_script(env)
15
+
14
16
  if code == 0
15
17
  app.call env
16
18
  else
@@ -29,24 +31,46 @@ module Evrone
29
31
  private
30
32
 
31
33
  def run_script(env)
32
- scp = ::Net::SCP.new(env.ssh.connection)
33
- script = [env.docker_repo_dir, ".ci_build.sh"].join("/")
34
- scp.upload! StringIO.new(content(env)), script
35
- env.ssh.spawn "env - HOME=$HOME bash #{script}", chdir: env.docker_repo_dir, &env.job.method(:add_to_output)
34
+ home = config.docker.remote_dir
35
+ file = [home, ".ci_build.sh"].join("/")
36
+
37
+ script = [upload_sh_command(file, script_content(env, home))]
38
+ script << "env - HOME=$HOME bash #{file}"
39
+ script = script.join(" && ")
40
+
41
+ env.ssh.spawn script, chdir: home, &env.job.method(:add_to_output)
42
+ end
43
+
44
+ def run_after_script(env)
45
+ home = config.docker.remote_dir
46
+ file = [home, ".ci_after_build.sh"].join("/")
47
+
48
+ script = [upload_sh_command(file, after_script_content(env))]
49
+ script << "env - HOME=$HOME bash #{file}"
50
+ script = script.join(" && ")
51
+
52
+ env.ssh.spawn script, chdir: home, &env.job.method(:add_to_output)
36
53
  end
37
54
 
38
- def content(env)
55
+ def script_content(env, home)
39
56
  buf = ["set -e"]
40
- buf << "echo before_script > #{env.docker_repo_dir}/.ci_state"
57
+ buf << "echo before_script > #{home}/.ci_state"
41
58
  buf << env.job.message.before_script
42
- buf << "echo script > #{env.docker_repo_dir}/.ci_state"
59
+ buf << "echo script > #{home}/.ci_state"
43
60
  buf << env.job.message.script
44
61
  buf.join("\n")
45
62
  end
46
63
 
64
+ def after_script_content(env)
65
+ buf = ["set -e"]
66
+ buf << env.job.message.after_script
67
+ buf.join("\n")
68
+ end
69
+
47
70
  def read_state(env)
71
+ home = config.docker.remote_dir
48
72
  buf = ""
49
- state_file = env.docker_repo_dir.join(".ci_state")
73
+ state_file = "#{home}/.ci_state"
50
74
  env.ssh.spawn "cat #{state_file}" do |out|
51
75
  buf << out
52
76
  end
@@ -52,9 +52,10 @@ module Evrone
52
52
 
53
53
  env.job.add_to_output "using #{Socket.gethostname}/#{env.container.id}\n"
54
54
 
55
- env.container_addr = config.docker.ssh.host
56
- env.container_addr ||= env.container.json['NetworkSettings']['IPAddress']
57
- env.docker_repo_dir = Pathname.new(config.docker.remote_dir).join(env.job.message.name)
55
+ env.container_addr = config.docker.ssh.host
56
+ env.container_addr ||= env.container.json['NetworkSettings']['IPAddress']
57
+ env.container_gateway ||= env.container.json['NetworkSettings']['Gateway']
58
+ env.docker_repo_dir = Pathname.new(config.docker.remote_dir).join(env.job.message.name)
58
59
 
59
60
  logger.tagged "DOCKER #{env.container.id}" do
60
61
  begin
@@ -11,8 +11,6 @@ module Evrone
11
11
 
12
12
  def call(env)
13
13
  tmp_dir! env
14
- work_dir! env
15
- repo_dir! env
16
14
 
17
15
  app.call env
18
16
  end
@@ -24,21 +22,6 @@ module Evrone
24
22
  .join(env.job.message.name)
25
23
  recreate env.tmp_dir
26
24
  end
27
-
28
- def work_dir!(env)
29
- env.work_dir = env.path_prefix.join(config.work_dir_name)
30
- .join(env.job.message.name)
31
-
32
- recreate env.work_dir
33
- end
34
-
35
- def repo_dir!(env)
36
- env.repo_dir = env.path_prefix.join(config.repo_dir_name)
37
- .join(env.job.message.name)
38
-
39
- mkdir env.repo_dir
40
- end
41
-
42
25
  end
43
26
 
44
27
  end
@@ -12,7 +12,7 @@ module Evrone
12
12
  script = env.tmp_dir.join("build.sh")
13
13
  write_file script, content(env), 0700
14
14
 
15
- code = bash file: script, chdir: env.work_dir, &env.job.method(:add_to_output)
15
+ code = bash file: script, &env.job.method(:add_to_output)
16
16
 
17
17
  if code == 0
18
18
  app.call env
@@ -20,7 +20,7 @@ module Evrone
20
20
  begin
21
21
  rs = app.call env
22
22
  rescue Exception => e
23
- env.job.add_to_output("ERROR: #{e.inspect}\n")
23
+ env.job.add_to_output("\n\nERROR: #{e.inspect}\n")
24
24
  logger.error("ERROR: #{e.inspect}\n BACKTRACE:\n#{e.backtrace.map{|i| " #{i}" }.join("\n")}")
25
25
  end
26
26
 
@@ -1,7 +1,7 @@
1
1
  module Evrone
2
2
  module CI
3
3
  module Worker
4
- VERSION = "0.2.0.pre4"
4
+ VERSION = "0.2.0.pre5"
5
5
  end
6
6
  end
7
7
  end
@@ -20,18 +20,16 @@ module Evrone
20
20
  autoload :Local, File.expand_path("../worker/local", __FILE__)
21
21
  autoload :Docker, File.expand_path("../worker/docker", __FILE__)
22
22
  autoload :CLI, File.expand_path("../worker/cli", __FILE__)
23
+ autoload :OutputBuffer, File.expand_path("../worker/output_buffer", __FILE__)
23
24
 
24
25
  autoload :LogJob, File.expand_path("../worker/middlewares/log_job", __FILE__)
25
26
  autoload :UpdateJobStatus, File.expand_path("../worker/middlewares/update_job_status", __FILE__)
26
27
 
27
28
  autoload :LocalCreateDirs, File.expand_path("../worker/middlewares/local_create_dirs", __FILE__)
28
- autoload :LocalFetchRepo, File.expand_path("../worker/middlewares/local_fetch_repo", __FILE__)
29
29
  autoload :LocalScript, File.expand_path("../worker/middlewares/local_script", __FILE__)
30
30
 
31
31
  autoload :DockerStartContainer, File.expand_path("../worker/middlewares/docker_start_container", __FILE__)
32
- autoload :DockerFetchRepo, File.expand_path("../worker/middlewares/docker_fetch_repo", __FILE__)
33
32
  autoload :DockerScript, File.expand_path("../worker/middlewares/docker_script", __FILE__)
34
- autoload :DockerWebdavCache, File.expand_path("../worker/middlewares/docker_webdav_cache", __FILE__)
35
33
 
36
34
  module Helper
37
35
  autoload :Logger, File.expand_path("../worker/helper/logger", __FILE__)
@@ -69,7 +67,9 @@ module Evrone
69
67
  end
70
68
 
71
69
  def perform(job, path_prefix)
72
- run_class.new(job, path_prefix).perform
70
+ rs = run_class.new(job, path_prefix).perform
71
+ job.release
72
+ rs
73
73
  end
74
74
 
75
75
  def run_class
@@ -6,8 +6,7 @@ describe Evrone::CI::Worker::Configuration do
6
6
 
7
7
  its(:run) { should eq :docker }
8
8
  its(:docker) { should be }
9
- its(:work_dir_name) { should eq 'work' }
10
- its(:repo_dir_name) { should eq 'repo' }
9
+ its(:tmp_dir_name) { should eq 'tmp' }
11
10
  its(:timeout) { should eq 1800 }
12
11
  its(:amqp_url) { should be_nil }
13
12
 
@@ -8,13 +8,13 @@ describe Evrone::CI::Worker::Job do
8
8
 
9
9
  context "just created" do
10
10
  its(:message) { should eq message }
11
- its(:output) { should eq '' }
11
+ its(:output) { should be_an_instance_of(Evrone::CI::Common::OutputBuffer) }
12
12
  its(:output_counter) { should eq 0 }
13
13
  end
14
14
 
15
- context "create_job_log_message" do
15
+ context "publish_job_log_message" do
16
16
  let(:data) { 'log' }
17
- subject { job.create_job_log_message data }
17
+ subject { job.publish_job_log_message data }
18
18
 
19
19
  it { should be_an_instance_of(Evrone::CI::Message::JobLog) }
20
20
  its(:job_id) { should eq job.message.job_id }
@@ -32,13 +32,17 @@ describe Evrone::CI::Worker::Job do
32
32
  context "add_to_output" do
33
33
  let(:data) { 'data' }
34
34
  let(:messages) { Evrone::CI::Worker::JobLogsConsumer.messages }
35
- subject { job.add_to_output(data) ; job }
35
+ subject do
36
+ job.add_to_output(data)
37
+ job.output.flush
38
+ job
39
+ end
36
40
 
37
- its(:output) { should eq data }
38
41
  it "should delivery message" do
39
42
  expect {
40
43
  subject
41
44
  }.to change(messages, :size).by(1)
45
+ expect(messages.first.log).to eq data
42
46
  end
43
47
 
44
48
  it "should increment output_counter" do
@@ -52,14 +56,17 @@ describe Evrone::CI::Worker::Job do
52
56
  context "add_command_to_output" do
53
57
  let(:data) { 'data' }
54
58
  let(:messages) { Evrone::CI::Worker::JobLogsConsumer.messages }
55
- subject { job.add_command_to_output(data) ; job }
56
-
57
- its(:output) { should eq "$ #{data}\n" }
59
+ subject do
60
+ job.add_command_to_output(data)
61
+ job.output.flush
62
+ job
63
+ end
58
64
 
59
65
  it "should delivery message" do
60
66
  expect {
61
67
  subject
62
68
  }.to change(messages, :size).by(1)
69
+ expect(messages.first.log).to eq "$ #{data}\n"
63
70
  end
64
71
 
65
72
  it "should increment output_counter" do
@@ -73,14 +80,17 @@ describe Evrone::CI::Worker::Job do
73
80
  context "add_trace_to_output" do
74
81
  let(:data) { 'data' }
75
82
  let(:messages) { Evrone::CI::Worker::JobLogsConsumer.messages }
76
- subject { job.add_trace_to_output(data) ; job }
77
-
78
- its(:output) { should eq " ===> #{data}\n" }
83
+ subject do
84
+ job.add_trace_to_output(data)
85
+ job.output.flush
86
+ job
87
+ end
79
88
 
80
89
  it "should delivery message" do
81
90
  expect {
82
91
  subject
83
92
  }.to change(messages, :size).by(1)
93
+ expect(messages.first.log).to eq " ===> #{data}\n"
84
94
  end
85
95
 
86
96
  it "should increment output_counter" do
@@ -5,7 +5,11 @@ describe Evrone::CI::Worker::DockerScript, run_docker: true do
5
5
  let(:app) { ->(_) { exit_code } }
6
6
  let(:script) { "echo script" }
7
7
  let(:before_script) { "echo before_script" }
8
- let(:job) { create :job, script: script, before_script: 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 }
9
13
  let(:env) { OpenStruct.new job: job }
10
14
  let(:mid) { described_class.new app }
11
15
  let(:docker_mid) { Evrone::CI::Worker::DockerStartContainer.new(mid) }
@@ -18,13 +22,17 @@ describe Evrone::CI::Worker::DockerScript, run_docker: true do
18
22
 
19
23
  it "should be" do
20
24
  expect(subject).to eq 0
21
- expect(job.output).to match("script")
25
+ job.release
26
+ expect(all_job_log_output).to match("script")
27
+ expect(all_job_log_output).to match("after_script")
22
28
  end
23
29
 
24
30
  context "when script failed" do
25
31
  let(:script) { "false" }
26
32
  it "should be" do
27
33
  expect(subject).to eq(1)
34
+ job.release
35
+ expect(all_job_log_output).to match("after_script")
28
36
  end
29
37
  end
30
38
 
@@ -32,6 +40,8 @@ describe Evrone::CI::Worker::DockerScript, run_docker: true do
32
40
  let(:before_script) { "false" }
33
41
  it "should be" do
34
42
  expect(subject).to eq(-1)
43
+ job.release
44
+ expect(all_job_log_output).to match("after_script")
35
45
  end
36
46
  end
37
47
  end
@@ -23,20 +23,10 @@ describe Evrone::CI::Worker::LocalCreateDirs do
23
23
  subject
24
24
  end
25
25
 
26
- it "work_dir" do
27
- expect(env.work_dir.to_s).to eq '/tmp/.ci/work/evrone/test-repo'
28
- expect(File.directory? env.work_dir).to be
29
- end
30
-
31
26
  it "tmp_dir" do
32
27
  expect(env.tmp_dir.to_s).to eq '/tmp/.ci/tmp/evrone/test-repo'
33
28
  expect(File.directory? env.tmp_dir).to be
34
29
  end
35
30
 
36
- it "repo_dir" do
37
- expect(env.repo_dir.to_s).to eq '/tmp/.ci/repo/evrone/test-repo'
38
- expect(File.directory? env.repo_dir).to be
39
- end
40
-
41
31
  end
42
32
  end
@@ -28,7 +28,8 @@ describe Evrone::CI::Worker::LocalScript do
28
28
 
29
29
  it "should capture output" do
30
30
  subject
31
- expect(job.output).to eq "before_script\nscript\n"
31
+ job.release
32
+ expect(last_job_log_message.log).to be_include("before_script\nscript\n")
32
33
  end
33
34
 
34
35
  context "when script failed" do
@@ -0,0 +1,3 @@
1
+ def last_job_log_message
2
+ Evrone::CI::Worker::JobLogsConsumer.messages.last
3
+ end
@@ -6,12 +6,8 @@ def create(who, *args)
6
6
 
7
7
  case who
8
8
 
9
- when :local_repo
10
- Evrone::CI::Worker.root.join("fixtures/repo").to_s
11
-
12
9
  when :message
13
- name = args.shift
14
-
10
+ name = args.shift
15
11
  klass = Evrone::CI::Message.const_get name
16
12
  klass.test_message options
17
13
 
@@ -19,15 +15,5 @@ def create(who, *args)
19
15
  message = options[:message] || create(:message, 'PerformJob', options)
20
16
  Evrone::CI::Worker::Job.new message
21
17
 
22
- when :working_dirs
23
-
24
- Evrone::CI::Worker::WorkingDirs.create args.shift, args.shift || '/tmp/.test'
25
-
26
- when :git
27
- build = args.shift
28
- path = args.shift
29
- Evrone::CI::SCM::Git.new build.src, build.sha, path, deploy_key: build.deploy_key, &build.method(:add_to_output)
30
-
31
18
  end
32
-
33
19
  end
@@ -0,0 +1,3 @@
1
+ def all_job_log_output
2
+ Evrone::CI::Worker::JobLogsConsumer.messages.map{|i| i.log }.join("\n")
3
+ 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.pre4
4
+ version: 0.2.0.pre5
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-10-05 00:00:00.000000000 Z
11
+ date: 2013-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: evrone-ci-common
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.2.0.pre4
19
+ version: 0.2.0.pre5
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.pre4
26
+ version: 0.2.0.pre5
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.pre4
33
+ version: 0.2.0.pre5
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.pre4
40
+ version: 0.2.0.pre5
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: evrone-common-amqp
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - '='
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.0.22
83
- - !ruby/object:Gem::Dependency
84
- name: net-scp
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - '='
88
- - !ruby/object:Gem::Version
89
- version: 1.1.2
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - '='
95
- - !ruby/object:Gem::Version
96
- version: 1.1.2
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: bundler
99
85
  requirement: !ruby/object:Gem::Requirement
@@ -183,34 +169,28 @@ files:
183
169
  - lib/evrone/ci/worker/initializers/amqp.rb
184
170
  - lib/evrone/ci/worker/job.rb
185
171
  - lib/evrone/ci/worker/local.rb
186
- - lib/evrone/ci/worker/middlewares/docker_fetch_repo.rb
187
172
  - lib/evrone/ci/worker/middlewares/docker_script.rb
188
173
  - lib/evrone/ci/worker/middlewares/docker_start_container.rb
189
- - lib/evrone/ci/worker/middlewares/docker_webdav_cache.rb
190
174
  - lib/evrone/ci/worker/middlewares/local_create_dirs.rb
191
- - lib/evrone/ci/worker/middlewares/local_fetch_repo.rb
192
175
  - lib/evrone/ci/worker/middlewares/local_script.rb
193
176
  - lib/evrone/ci/worker/middlewares/log_job.rb
194
177
  - lib/evrone/ci/worker/middlewares/update_job_status.rb
195
- - lib/evrone/ci/worker/runner/docker.rb
196
- - lib/evrone/ci/worker/runner/local.rb
197
178
  - lib/evrone/ci/worker/version.rb
198
179
  - spec/lib/worker/configuration_spec.rb
199
180
  - spec/lib/worker/docker_spec.rb
200
181
  - spec/lib/worker/job_spec.rb
201
182
  - spec/lib/worker/local_spec.rb
202
- - spec/lib/worker/middlewares/docker_fetch_repo_spec.rb
203
183
  - spec/lib/worker/middlewares/docker_script_spec.rb
204
184
  - spec/lib/worker/middlewares/docker_start_container_spec.rb
205
- - spec/lib/worker/middlewares/docker_webdav_cache_spec.rb
206
185
  - spec/lib/worker/middlewares/local_create_dirs_spec.rb
207
- - spec/lib/worker/middlewares/local_fetch_repo_spec.rb
208
186
  - spec/lib/worker/middlewares/local_script_spec.rb
209
187
  - spec/lib/worker/middlewares/log_job_spec.rb
210
188
  - spec/lib/worker/middlewares/update_job_status_spec.rb
211
189
  - spec/lib/worker_spec.rb
212
190
  - spec/spec_helper.rb
191
+ - spec/support/all_job_log_output.rb
213
192
  - spec/support/create.rb
193
+ - spec/support/last_job_logs_message.rb
214
194
  - spec/support/shared_examples/update_job_status_message_spec.rb
215
195
  homepage: ''
216
196
  licenses:
@@ -241,16 +221,15 @@ test_files:
241
221
  - spec/lib/worker/docker_spec.rb
242
222
  - spec/lib/worker/job_spec.rb
243
223
  - spec/lib/worker/local_spec.rb
244
- - spec/lib/worker/middlewares/docker_fetch_repo_spec.rb
245
224
  - spec/lib/worker/middlewares/docker_script_spec.rb
246
225
  - spec/lib/worker/middlewares/docker_start_container_spec.rb
247
- - spec/lib/worker/middlewares/docker_webdav_cache_spec.rb
248
226
  - spec/lib/worker/middlewares/local_create_dirs_spec.rb
249
- - spec/lib/worker/middlewares/local_fetch_repo_spec.rb
250
227
  - spec/lib/worker/middlewares/local_script_spec.rb
251
228
  - spec/lib/worker/middlewares/log_job_spec.rb
252
229
  - spec/lib/worker/middlewares/update_job_status_spec.rb
253
230
  - spec/lib/worker_spec.rb
254
231
  - spec/spec_helper.rb
232
+ - spec/support/all_job_log_output.rb
255
233
  - spec/support/create.rb
234
+ - spec/support/last_job_logs_message.rb
256
235
  - spec/support/shared_examples/update_job_status_message_spec.rb
@@ -1,73 +0,0 @@
1
- require 'docker'
2
- require 'evrone/common/spawn'
3
- require 'net/scp'
4
-
5
- module Evrone
6
- module CI
7
- module Worker
8
-
9
- DockerFetchRepo = Struct.new(:app) do
10
-
11
- include Helper::Logger
12
- include Helper::Config
13
-
14
- def call(env)
15
- if env.ssh && env.docker_repo_dir
16
- code = -1
17
-
18
- code = prepare_ssh_files(env)
19
- code = spawn_script(env) if code == 0
20
-
21
- if code == 0
22
- app.call env
23
- else
24
- code * -1
25
- end
26
- else
27
- app.call env
28
- end
29
- end
30
-
31
- private
32
-
33
- def prepare_ssh_files(env)
34
- dir = config.docker.remote_dir
35
- scp = ::Net::SCP.new(env.ssh.connection)
36
-
37
- code = env.ssh.spawn "mkdir -p #{dir}/.ssh && chmod 0700 #{dir}/.ssh", &env.job.method(:add_to_output)
38
-
39
- if code == 0
40
- config = "Host *\n"
41
- config << " StrictHostKeyChecking no\n"
42
- config << " UserKnownHostsFile /dev/null\n"
43
-
44
- scp.upload! StringIO.new(config), "#{dir}/.ssh/config"
45
- scp.upload! StringIO.new(env.job.message.deploy_key.to_s), "#{dir}/.ssh/id_rsa"
46
-
47
- code = env.ssh.spawn "chmod 0600 #{dir}/.ssh/id_rsa", &env.job.method(:add_to_output)
48
- end
49
- code
50
- end
51
-
52
- def spawn_script(env)
53
- scm = create_scm(env)
54
-
55
- script = "sh -c '#{scm.make_fetch_command}'"
56
- env.ssh.spawn script, &env.job.method(:add_to_output)
57
- end
58
-
59
- def create_scm(env)
60
- SCM::Git.new(
61
- env.job.message.src,
62
- env.job.message.sha,
63
- env.docker_repo_dir,
64
- &env.job.method(:add_to_output)
65
- )
66
- end
67
-
68
- end
69
- end
70
- end
71
- end
72
-
73
-
@@ -1,95 +0,0 @@
1
- require 'net/scp'
2
-
3
- module Evrone
4
- module CI
5
- module Worker
6
-
7
- DockerWebdavCache = Struct.new(:app) do
8
-
9
- include Helper::Config
10
- include Helper::Logger
11
-
12
- CASHER_URL = "https://raw.github.com/travis-ci/casher/master/bin/casher"
13
- CASHER_BIN = "$HOME/.casher/bin/casher"
14
-
15
- def call(env)
16
- if env.ssh && config.webdav_cache_url
17
- assign_url(env) &&
18
- prepare(env) &&
19
- fetch(env) &&
20
- add(env)
21
- end
22
-
23
- rs = app.call env
24
-
25
- if env.ssh && env.webdav_cache_url
26
- push(env)
27
- end
28
-
29
- rs
30
- end
31
-
32
- private
33
-
34
- def assign_url(env)
35
- release = nil
36
-
37
- env.ssh.spawn "lsb_release -s -c" do |out|
38
- release ||= out.gsub(/[^a-z0-9]/, '')
39
- end
40
- release = 'unknown' unless release
41
-
42
- name = env.job.message.name.dup
43
- name << "-#{release}"
44
- name << "-#{env.job.message.matrix_keys.join("_")}.tgz"
45
- name = name.gsub(/[^a-z0-9_\-.]/, '')
46
-
47
- env.webdav_cache_url = "#{config.webdav_cache_url.dup}/#{name}"
48
- true
49
- end
50
-
51
- def push(env)
52
- cmd = %{
53
- #{CASHER_BIN} push #{env.webdav_cache_url}
54
- }.compact
55
-
56
- logger.debug "push cache to #{env.webdav_cache_url.inspect}"
57
- env.ssh.spawn cmd, &env.job.method(:add_trace_to_output)
58
- true
59
- end
60
-
61
- def add(env)
62
- cmd = %{
63
- #{CASHER_BIN} add $HOME/cached
64
- }.compact
65
- env.ssh.spawn cmd, &env.job.method(:add_trace_to_output)
66
- true
67
- end
68
-
69
- def fetch(env)
70
- logger.debug "fetch cache from #{env.webdav_cache_url.inspect}"
71
- cmd = %{
72
- #{CASHER_BIN} fetch #{env.webdav_cache_url}
73
- }.compact
74
- env.ssh.spawn cmd, &env.job.method(:add_trace_to_output)
75
- true
76
- end
77
-
78
- def prepare(env)
79
- cmd = %{
80
- export CASHER_DIR=$HOME/.casher &&
81
- mkdir -p $CASHER_DIR/bin &&
82
- curl #{CASHER_URL} -s -o #{CASHER_BIN} &&
83
- chmod +x #{CASHER_BIN} &&
84
- echo casher successfuly downloaded
85
- }.compact
86
- code = env.ssh.spawn cmd, &env.job.method(:add_trace_to_output)
87
- code == 0
88
- end
89
-
90
- end
91
- end
92
- end
93
- end
94
-
95
-
@@ -1,47 +0,0 @@
1
- require 'evrone/ci/common'
2
-
3
- module Evrone
4
- module CI
5
- module Worker
6
-
7
- LocalFetchRepo = Struct.new(:app) do
8
-
9
- include Common::Helper::Shell
10
-
11
- def call(env)
12
- scm = create_scm(env)
13
-
14
- if env.repo_dir
15
- if scm.fetch == 0 && export(scm, env) == 0
16
- app.call env
17
- else
18
- -1
19
- end
20
- else
21
- app.call env
22
- end
23
- end
24
-
25
- private
26
-
27
- def export(scm, env)
28
- cmd = scm.class.make_export_command env.repo_dir, env.work_dir
29
- env.job.add_command_to_output cmd
30
- bash cmd, &env.job.method(:add_to_output)
31
- end
32
-
33
- def create_scm(env)
34
- SCM::Git.new(
35
- env.job.message.src,
36
- env.job.message.sha,
37
- env.repo_dir,
38
- deploy_key: env.job.message.deploy_key,
39
- &env.job.method(:add_to_output)
40
- )
41
- end
42
-
43
- end
44
-
45
- end
46
- end
47
- end
File without changes
@@ -1,52 +0,0 @@
1
- module Evrone
2
- module CI
3
- module Worker
4
- class Runner
5
- class Local
6
-
7
- include Worker::Helper::Logger
8
- include Worker::Helper::Config
9
- include Common::Helper::Shell
10
-
11
- attr_reader :build, :path, :build_script
12
-
13
- def initialize(build, path)
14
- @build = build
15
- @path = path
16
- @build_script = path.tmp_dir.join(".build.sh").expand_path
17
- end
18
-
19
- def perform
20
- make_build_script
21
- run_build_script
22
- end
23
-
24
- private
25
-
26
- def run_build_script
27
- bash file: build_script, chdir: path.work_dir, &method(:add_output)
28
- end
29
-
30
- def make_build_script
31
- content = build.travis.to_queue.to_shell_script script_replaces do |env|
32
- prepare_env env
33
- end
34
- write_file build_script, content, 0755
35
- add_output_command build_script
36
- end
37
-
38
- def script_replaces
39
- { "SHARED_PATH" => path.shared_dir }
40
- end
41
-
42
- def prepare_env(env)
43
- env['init'].unshift "echo 'copy repo from #{path.repo_dir} to #{path.work_dir}'"
44
- env['init'].unshift build.csm.make_export_command path.repo_dir, path.work_dir
45
- env
46
- end
47
- end
48
- end
49
- end
50
- end
51
- end
52
-
@@ -1,26 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Evrone::CI::Worker::DockerFetchRepo, run_docker: true do
4
- let(:exit_code) { 0 }
5
- let(:app) { ->(_) { exit_code } }
6
- let(:options) { {} }
7
- let(:job) { create :job, options }
8
- let(:env) { OpenStruct.new job: job }
9
- let(:mid) { described_class.new app }
10
- let(:docker_mid) { Evrone::CI::Worker::DockerStartContainer.new(mid) }
11
-
12
- subject { docker_mid.call env }
13
-
14
- it "should be" do
15
- expect(subject).to eq 0
16
- end
17
-
18
- context "when fail to fetch repo" do
19
- let(:options) { { src: "/not-exists-repo.git" } }
20
- it "should be" do
21
- expect(subject).to eq(-128)
22
- expect(job.output).to be_include("does not exist")
23
- end
24
- end
25
- end
26
-
@@ -1,49 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Evrone::CI::Worker::DockerWebdavCache, run_docker: true, webdav: true do
4
- let(:exit_code) { 0 }
5
- let(:app) {
6
- ->(env) {
7
- file = "$HOME/cached/foo.txt"
8
- cmd = %{
9
- if [ -f #{file} ] ; then
10
- echo "!exists" ;
11
- cat #{file} ;
12
- else
13
- echo "!touch" ;
14
- echo 1 > #{file} ;
15
- fi
16
- }.compact
17
- env.ssh.spawn cmd, &job.method(:add_to_output)
18
- }
19
- }
20
- let(:job) { create :job }
21
- let(:env) { OpenStruct.new job: job }
22
- let(:mid) { described_class.new app }
23
- let(:docker_mid) { Evrone::CI::Worker::DockerStartContainer.new(mid) }
24
-
25
- subject { docker_mid.call env }
26
-
27
- before do
28
- Evrone::CI::Worker.config.webdav_cache_url = 'http://192.168.44.1:8080/'
29
- end
30
-
31
- context "first run" do
32
- it "should be" do
33
- expect(subject).to eq 0
34
- end
35
- end
36
-
37
- context "next run" do
38
- before do
39
- expect(docker_mid.call env).to eq 0
40
- job.output.clear
41
- end
42
- it "should be" do
43
- expect(subject).to eq 0
44
- expect(job.output).to match(/\!exists/)
45
- end
46
-
47
- end
48
- end
49
-
@@ -1,56 +0,0 @@
1
- require 'spec_helper'
2
- require 'pathname'
3
- require 'fileutils'
4
-
5
- describe Evrone::CI::Worker::LocalFetchRepo do
6
- let(:exit_code) { 0 }
7
- let(:app) { ->(_) { exit_code } }
8
- let(:job) { create :job }
9
- let(:path_prefix) { Pathname.new("/tmp/.ci") }
10
- let(:repo_dir) { path_prefix.join("repo") }
11
- let(:work_dir) { path_prefix.join("work") }
12
- let(:env) { OpenStruct.new job: job, repo_dir: repo_dir, work_dir: work_dir }
13
- let(:mid) { described_class.new app }
14
-
15
- subject { mid.call env }
16
-
17
- after do
18
- FileUtils.rm_rf path_prefix
19
- end
20
-
21
- it { should eq 0 }
22
-
23
- it "should create repo inside repo_dir" do
24
- subject
25
- expect(File.directory? "/tmp/.ci/repo/.git" ).to be
26
- end
27
-
28
- it "should create copy of repo inside work_dir" do
29
- subject
30
- expect(File.readable? "/tmp/.ci/work/Gemfile").to be
31
- end
32
-
33
- context "when fetch failed" do
34
- before do
35
- any_instance_of(Evrone::CI::SCM::Git) do |git|
36
- mock(git).fetch { 1 }
37
- end
38
- end
39
-
40
- it { should eq(-1) }
41
- end
42
-
43
- context "when export failed" do
44
- before do
45
- any_instance_of(Evrone::CI::SCM::Git) do |git|
46
- mock(git).fetch { 0 }
47
- end
48
- any_instance_of(described_class) do |m|
49
- mock(m).export(anything, anything) { 1 }
50
- end
51
- end
52
-
53
- it { should eq(-1) }
54
- end
55
- end
56
-