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

Sign up to get free protection for your applications and to get access to all the features.
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
-