evrone-ci-router 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.
- checksums.yaml +4 -4
- data/Rakefile +21 -0
- data/lib/evrone/ci/router/build.rb +18 -21
- data/lib/evrone/ci/router/configuration.rb +8 -6
- data/lib/evrone/ci/router/script_builder/databases.rb +26 -0
- data/lib/evrone/ci/router/script_builder/env.rb +4 -1
- data/lib/evrone/ci/router/script_builder/prepare.rb +55 -0
- data/lib/evrone/ci/router/script_builder/ruby.rb +9 -9
- data/lib/evrone/ci/router/script_builder/webdav_cache.rb +72 -0
- data/lib/evrone/ci/router/script_builder.rb +44 -7
- data/lib/evrone/ci/router/travis.rb +2 -2
- data/lib/evrone/ci/router/version.rb +1 -1
- data/lib/evrone/ci/router.rb +5 -24
- data/spec/lib/build_spec.rb +35 -45
- data/spec/lib/router_spec.rb +3 -45
- data/spec/lib/script_builder/prepare_spec.rb +44 -0
- data/spec/lib/script_builder/webdav_cache_spec.rb +70 -0
- data/spec/lib/script_builder_spec.rb +15 -34
- data/spec/lib/travis_spec.rb +2 -1
- data/spec/support/create.rb +0 -7
- data/spec/support/last_build_log_message.rb +3 -0
- metadata +15 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8eaca86f6f37eb7af8d1e7817f99b833f5693d5c
|
4
|
+
data.tar.gz: a161f3bb1eb84f7e35647b5508e008528ca489cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4512bb8e7d369c43a232945bcba2e1315f31aa53d5edda9acc27d87514e59d61710988e72243ce7f0114930a03f8e0527c84dc3d85b33334bd98fea39460822a
|
7
|
+
data.tar.gz: 206febdaae5c7ca4b9bf9300e0010c15edb6ce69f7d7a5ddf1ce67eae19d67d0e35ddc2962d0827c6500a3870cbc46248359245f7aebedfec75a560ac0799bbd
|
data/Rakefile
CHANGED
@@ -23,3 +23,24 @@ end
|
|
23
23
|
|
24
24
|
desc "run travis build"
|
25
25
|
task :travis => :default
|
26
|
+
|
27
|
+
namespace :print do
|
28
|
+
task :script do
|
29
|
+
require 'evrone/ci/message/testing'
|
30
|
+
require File.expand_path("../spec/support/fixture", __FILE__)
|
31
|
+
require File.expand_path("../spec/support/create", __FILE__)
|
32
|
+
|
33
|
+
build = create :build
|
34
|
+
travis = create :travis
|
35
|
+
|
36
|
+
script_builder = travis.to_script_builder(build)
|
37
|
+
|
38
|
+
puts "\n#===> BEGIN BEFORE SCRIPT"
|
39
|
+
puts script_builder.to_before_script
|
40
|
+
puts "#===> END BEFORE SCRIPT\n"
|
41
|
+
|
42
|
+
puts "\n#===> BEGIN SCRIPT\n"
|
43
|
+
puts script_builder.to_script
|
44
|
+
puts "#===> END SCRIPT\n\n"
|
45
|
+
end
|
46
|
+
end
|
@@ -14,26 +14,27 @@ module Evrone
|
|
14
14
|
include Router::Helper::Config
|
15
15
|
|
16
16
|
attr_reader :message, :output, :output_counter
|
17
|
-
attr_accessor :jobs_count
|
17
|
+
attr_accessor :jobs_count
|
18
18
|
|
19
19
|
def initialize(perform_build_message)
|
20
20
|
@output_counter = 0
|
21
|
-
@output =
|
21
|
+
@output = Common::OutputBuffer.new(&method(:publish_build_log_message))
|
22
22
|
@message = perform_build_message
|
23
23
|
end
|
24
24
|
|
25
|
+
def release
|
26
|
+
output.close
|
27
|
+
end
|
28
|
+
|
25
29
|
def to_perform_job_message(travis, job_id)
|
26
|
-
script_builder = travis.to_script_builder
|
27
|
-
sha = (commit_info && commit_info.sha) || message.sha
|
30
|
+
script_builder = travis.to_script_builder(self)
|
28
31
|
job_message = Message::PerformJob.new(
|
29
32
|
id: message.id,
|
30
33
|
name: message.name,
|
31
|
-
src: message.src,
|
32
|
-
sha: sha,
|
33
|
-
deploy_key: message.deploy_key,
|
34
34
|
job_id: job_id,
|
35
35
|
before_script: script_builder.to_before_script,
|
36
36
|
script: script_builder.to_script,
|
37
|
+
after_script: script_builder.to_after_script,
|
37
38
|
matrix_keys: travis.matrix_keys,
|
38
39
|
)
|
39
40
|
job_message
|
@@ -47,35 +48,31 @@ module Evrone
|
|
47
48
|
tm: tm.to_i,
|
48
49
|
jobs_count: jobs_count || 0,
|
49
50
|
}
|
50
|
-
|
51
|
-
if commit_info
|
52
|
-
attributes.merge!(
|
53
|
-
commit_author: commit_info.author,
|
54
|
-
commit_author_email: commit_info.email,
|
55
|
-
commit_sha: commit_info.sha,
|
56
|
-
commit_message: commit_info.message
|
57
|
-
)
|
58
|
-
end
|
59
51
|
Message::BuildStatus.new attributes
|
60
52
|
end
|
61
53
|
|
62
54
|
def add_to_output(str)
|
63
55
|
output << str
|
64
56
|
logger.debug str.strip if logger.level == 0
|
65
|
-
BuildLogsConsumer.publish create_build_log_message(str)
|
66
57
|
end
|
67
58
|
|
68
59
|
def add_command_to_output(cmd)
|
69
60
|
add_to_output "$ #{cmd}\n"
|
70
61
|
end
|
71
62
|
|
72
|
-
def
|
63
|
+
def publish_build_log_message(str)
|
73
64
|
@output_counter += 1
|
74
|
-
Message::BuildLog.new(
|
65
|
+
log = Message::BuildLog.new(
|
75
66
|
build_id: message.id,
|
76
|
-
tm:
|
77
|
-
log:
|
67
|
+
tm: output_counter,
|
68
|
+
log: str
|
78
69
|
)
|
70
|
+
BuildLogsConsumer.publish log
|
71
|
+
log
|
72
|
+
end
|
73
|
+
|
74
|
+
def scm_class
|
75
|
+
Evrone::CI::SCM::Git
|
79
76
|
end
|
80
77
|
|
81
78
|
end
|
@@ -12,12 +12,14 @@ module Evrone
|
|
12
12
|
self.env_namespace = 'ci_router'
|
13
13
|
self.raise_missing_keys = true
|
14
14
|
|
15
|
-
define amqp_url:
|
16
|
-
timeout:
|
17
|
-
logger:
|
18
|
-
repo_dir_name:
|
19
|
-
workers:
|
20
|
-
path_prefix:
|
15
|
+
define amqp_url: nil,
|
16
|
+
timeout: 30 * 60,
|
17
|
+
logger: Common::TaggedLogging.new(Logger.new STDOUT),
|
18
|
+
repo_dir_name: "repo",
|
19
|
+
workers: 1,
|
20
|
+
path_prefix: nil,
|
21
|
+
webdav_cache_url: nil
|
22
|
+
|
21
23
|
|
22
24
|
def timeout
|
23
25
|
self[:timeout].to_i
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Evrone
|
2
|
+
module CI
|
3
|
+
class Router
|
4
|
+
class ScriptBuilder
|
5
|
+
|
6
|
+
Databases = Struct.new(:app) do
|
7
|
+
|
8
|
+
include Helper::TraceShCommand
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
psql = []
|
12
|
+
psql << %{sudo -u postgres psql -q -h localhost -c "create role ci with login superuser password 'ci'" || true}
|
13
|
+
psql << %{sudo -u postgres psql -q -h localhost -c "create database ci" || true}
|
14
|
+
env.init.tap do |i|
|
15
|
+
i << psql
|
16
|
+
end
|
17
|
+
app.call(env)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
@@ -12,7 +12,10 @@ module Evrone
|
|
12
12
|
env.travis.global_env.each do |e|
|
13
13
|
env.init << trace_sh_command("export #{e}")
|
14
14
|
end
|
15
|
-
env.
|
15
|
+
env.travis.matrix_env.each do |e|
|
16
|
+
env.init << trace_sh_command("export #{e}")
|
17
|
+
end
|
18
|
+
env.announce << trace_sh_command("env")
|
16
19
|
app.call(env)
|
17
20
|
end
|
18
21
|
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Evrone
|
2
|
+
module CI
|
3
|
+
class Router
|
4
|
+
class ScriptBuilder
|
5
|
+
|
6
|
+
Prepare = Struct.new(:app) do
|
7
|
+
|
8
|
+
include Helper::TraceShCommand
|
9
|
+
include Common::Helper::UploadShCommand
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
name = env.build.message.name
|
13
|
+
deploy_key = env.build.message.deploy_key
|
14
|
+
|
15
|
+
repo_path = "code/#{name}"
|
16
|
+
data_path = "data/#{name}"
|
17
|
+
key_file = "#{data_path}/key"
|
18
|
+
git_ssh_file = "#{data_path}/git_ssh"
|
19
|
+
|
20
|
+
sha = env.build.message.sha
|
21
|
+
scm = build_scm(env, sha, repo_path)
|
22
|
+
git_ssh = scm.git_ssh.class.template(deploy_key && "$PWD/#{key_file}")
|
23
|
+
|
24
|
+
env.init.tap do |i|
|
25
|
+
i << "mkdir -p #{data_path}"
|
26
|
+
i << "mkdir -p #{repo_path}"
|
27
|
+
|
28
|
+
if deploy_key
|
29
|
+
i << "echo instaling keys"
|
30
|
+
i << upload_sh_command(key_file, deploy_key)
|
31
|
+
i << "chmod 0600 #{key_file}"
|
32
|
+
end
|
33
|
+
|
34
|
+
i << upload_sh_command(git_ssh_file, git_ssh)
|
35
|
+
i << "chmod 0750 #{git_ssh_file}"
|
36
|
+
|
37
|
+
i << "export GIT_SSH=$PWD/#{git_ssh_file}"
|
38
|
+
i << scm.make_fetch_command
|
39
|
+
end
|
40
|
+
|
41
|
+
app.call env
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def build_scm(env, sha, path)
|
47
|
+
SCM::Git.new(env.build.message.src, sha, "$PWD/#{path}")
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
@@ -9,22 +9,22 @@ module Evrone
|
|
9
9
|
|
10
10
|
def call(env)
|
11
11
|
if rvm env
|
12
|
-
env.
|
12
|
+
env.before_install.tap do |i|
|
13
13
|
i << 'eval "$(rbenv init -)" || true'
|
14
14
|
i << "rbenv shell #{make_rbenv_version_command env}"
|
15
|
-
i << 'export BUNDLE_GEMFILE=${PWD}/Gemfile'
|
16
|
-
i << 'export GEM_HOME=$HOME/cached/rubygems'
|
15
|
+
i << trace_sh_command('export BUNDLE_GEMFILE=${PWD}/Gemfile')
|
16
|
+
i << trace_sh_command('export GEM_HOME=$HOME/cached/rubygems')
|
17
17
|
end
|
18
18
|
|
19
|
-
env.
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
b << trace_sh_command("bundle --version")
|
19
|
+
env.announce.tap do |a|
|
20
|
+
a << trace_sh_command("ruby --version")
|
21
|
+
a << trace_sh_command("gem --version")
|
22
|
+
a << trace_sh_command("bundle --version")
|
24
23
|
end
|
25
24
|
|
26
25
|
env.install.tap do |i|
|
27
|
-
i << trace_sh_command("bundle install
|
26
|
+
i << trace_sh_command("bundle install")
|
27
|
+
i << trace_sh_command("bundle clean --force")
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Evrone
|
2
|
+
module CI
|
3
|
+
class Router
|
4
|
+
class ScriptBuilder
|
5
|
+
|
6
|
+
WebdavCache = Struct.new(:app) do
|
7
|
+
|
8
|
+
include Helper::Config
|
9
|
+
include Helper::Logger
|
10
|
+
|
11
|
+
CASHER_URL = "https://raw.github.com/travis-ci/casher/master/bin/casher"
|
12
|
+
CASHER_BIN = "$HOME/.casher/bin/casher"
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
if config.webdav_cache_url
|
16
|
+
assign_url_to_env(env)
|
17
|
+
prepare(env)
|
18
|
+
fetch(env)
|
19
|
+
add(env)
|
20
|
+
push(env)
|
21
|
+
end
|
22
|
+
app.call env
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def assign_url_to_env(env)
|
28
|
+
name = []
|
29
|
+
name << env.build.message.name.dup
|
30
|
+
|
31
|
+
# convert keys from ["rvm:2.0.0"] to "rvm 2.0.0"
|
32
|
+
name += env.travis.matrix_keys.map{|i| i.split(":").join(" ") }
|
33
|
+
# replace non word chars to ' '
|
34
|
+
name = name.join("-").gsub(/[^a-z0-9_\-.]/, ' ')
|
35
|
+
|
36
|
+
name = name.strip().gsub(/ +/, '-').downcase
|
37
|
+
name << ".tgz"
|
38
|
+
|
39
|
+
env.webdav_cache_url = "#{config.webdav_cache_url}/#{name}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def prepare(env)
|
43
|
+
cmd = %{
|
44
|
+
export CASHER_DIR=$HOME/.casher &&
|
45
|
+
( mkdir -p $CASHER_DIR/bin &&
|
46
|
+
curl #{CASHER_URL} -s -o #{CASHER_BIN} &&
|
47
|
+
chmod +x #{CASHER_BIN} &&
|
48
|
+
echo casher successfuly downloaded ) ||
|
49
|
+
true
|
50
|
+
}.compact
|
51
|
+
env.init << cmd
|
52
|
+
end
|
53
|
+
|
54
|
+
def fetch(env)
|
55
|
+
env.init << "#{CASHER_BIN} fetch #{env.webdav_cache_url} || true"
|
56
|
+
end
|
57
|
+
|
58
|
+
def add(env)
|
59
|
+
env.init << "#{CASHER_BIN} add $HOME/cached || true"
|
60
|
+
env.init << "unset CASHER_DIR"
|
61
|
+
end
|
62
|
+
|
63
|
+
def push(env)
|
64
|
+
env.after_script << "#{CASHER_BIN} push #{env.webdav_cache_url}"
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
@@ -6,36 +6,61 @@ module Evrone
|
|
6
6
|
class Router
|
7
7
|
class ScriptBuilder
|
8
8
|
|
9
|
-
autoload :Env,
|
10
|
-
autoload :Ruby,
|
11
|
-
autoload :Script,
|
9
|
+
autoload :Env, File.expand_path("../script_builder/env", __FILE__)
|
10
|
+
autoload :Ruby, File.expand_path("../script_builder/ruby", __FILE__)
|
11
|
+
autoload :Script, File.expand_path("../script_builder/script", __FILE__)
|
12
|
+
autoload :Prepare, File.expand_path("../script_builder/prepare", __FILE__)
|
13
|
+
autoload :Databases, File.expand_path("../script_builder/databases", __FILE__)
|
14
|
+
autoload :WebdavCache, File.expand_path("../script_builder/webdav_cache", __FILE__)
|
12
15
|
|
13
16
|
include Common::Helper::Middlewares
|
14
17
|
|
15
18
|
middlewares do
|
19
|
+
use ScriptBuilder::WebdavCache
|
16
20
|
use ScriptBuilder::Env
|
21
|
+
use ScriptBuilder::Prepare
|
22
|
+
use ScriptBuilder::Databases
|
17
23
|
use ScriptBuilder::Ruby
|
18
24
|
use ScriptBuilder::Script
|
19
25
|
end
|
20
26
|
|
21
|
-
attr_reader :travis
|
27
|
+
attr_reader :travis, :build
|
22
28
|
|
23
|
-
def initialize(travis)
|
29
|
+
def initialize(build, travis)
|
24
30
|
@travis = travis
|
31
|
+
@build = build
|
25
32
|
end
|
26
33
|
|
27
34
|
def to_before_script
|
28
35
|
a = []
|
36
|
+
a << "\n# init"
|
29
37
|
a += env.init
|
38
|
+
|
39
|
+
a << "\n# before install"
|
30
40
|
a += env.before_install
|
41
|
+
|
42
|
+
a << "\n# announce"
|
43
|
+
a += env.announce
|
44
|
+
|
45
|
+
a << "\n# install"
|
31
46
|
a += env.install
|
47
|
+
|
48
|
+
a << "\n# before script"
|
32
49
|
a += env.before_script
|
33
50
|
a.join("\n")
|
34
51
|
end
|
35
52
|
|
53
|
+
def to_after_script
|
54
|
+
a = []
|
55
|
+
a << "\n# after script"
|
56
|
+
a += env.after_script
|
57
|
+
a.join("\n")
|
58
|
+
end
|
59
|
+
|
36
60
|
def to_script
|
37
61
|
a = []
|
38
|
-
a <<
|
62
|
+
a << "\n# script"
|
63
|
+
a += env.script
|
39
64
|
a.join("\n")
|
40
65
|
end
|
41
66
|
|
@@ -47,12 +72,24 @@ module Evrone
|
|
47
72
|
|
48
73
|
def default_env
|
49
74
|
OpenStruct.new(
|
75
|
+
# initialization, repo does not exists
|
50
76
|
init: [],
|
77
|
+
|
78
|
+
# before instalation, using for system setup
|
51
79
|
before_install: [],
|
80
|
+
|
81
|
+
# instalation, using for application setup
|
52
82
|
install: [],
|
83
|
+
|
84
|
+
# announce software and services version
|
85
|
+
announce: [],
|
86
|
+
|
53
87
|
before_script: [],
|
54
88
|
script: [],
|
55
|
-
|
89
|
+
after_script: [],
|
90
|
+
|
91
|
+
travis: travis,
|
92
|
+
build: build,
|
56
93
|
)
|
57
94
|
end
|
58
95
|
|
data/lib/evrone/ci/router.rb
CHANGED
@@ -70,26 +70,21 @@ module Evrone
|
|
70
70
|
include Helper::Logger
|
71
71
|
include Helper::Config
|
72
72
|
|
73
|
-
attr_reader :build, :
|
73
|
+
attr_reader :build, :travis
|
74
74
|
|
75
|
-
def initialize(build
|
75
|
+
def initialize(build)
|
76
76
|
@build = build
|
77
|
-
@path_prefix = Pathname.new(path_prefix).expand_path
|
78
|
-
@repo_dir = @path_prefix.join(config.repo_dir_name)
|
79
|
-
.join(build.message.name)
|
80
77
|
@travis = nil
|
81
78
|
end
|
82
79
|
|
83
80
|
def perform
|
84
81
|
log_build do
|
85
82
|
update_build_status do
|
86
|
-
|
87
|
-
fetch_repo &&
|
88
|
-
assign_commit_info &&
|
89
|
-
load_travis &&
|
83
|
+
load_travis &&
|
90
84
|
create_and_delivery_build_matrix
|
91
85
|
end
|
92
86
|
end
|
87
|
+
build.release
|
93
88
|
end
|
94
89
|
|
95
90
|
def create_and_delivery_build_matrix
|
@@ -107,24 +102,10 @@ module Evrone
|
|
107
102
|
end
|
108
103
|
|
109
104
|
def load_travis
|
110
|
-
@travis = Travis.
|
105
|
+
@travis = Travis.from_yaml build.message.travis
|
111
106
|
@travis
|
112
107
|
end
|
113
108
|
|
114
|
-
def create_repo_dir
|
115
|
-
FileUtils.mkdir_p(repo_dir) unless repo_dir.directory?
|
116
|
-
true
|
117
|
-
end
|
118
|
-
|
119
|
-
def fetch_repo
|
120
|
-
scm.fetch == 0
|
121
|
-
end
|
122
|
-
|
123
|
-
def assign_commit_info
|
124
|
-
build.commit_info = scm.commit_info
|
125
|
-
true
|
126
|
-
end
|
127
|
-
|
128
109
|
def log_build
|
129
110
|
logger.tagged("BUILD #{build.message.id}") do
|
130
111
|
logger.info "starting build"
|
data/spec/lib/build_spec.rb
CHANGED
@@ -8,13 +8,13 @@ describe Evrone::CI::Router::Build do
|
|
8
8
|
|
9
9
|
context "just created" do
|
10
10
|
its(:message) { should eq msg }
|
11
|
-
its(:output) { should
|
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 "
|
15
|
+
context "publish_build_log_message" do
|
16
16
|
let(:data) { 'log' }
|
17
|
-
subject { build.
|
17
|
+
subject { build.publish_build_log_message data }
|
18
18
|
|
19
19
|
it { should be_an_instance_of(Evrone::CI::Message::BuildLog) }
|
20
20
|
its(:build_id) { should eq build.message.id }
|
@@ -26,6 +26,13 @@ describe Evrone::CI::Router::Build do
|
|
26
26
|
subject
|
27
27
|
}.to change(build, :output_counter).by(1)
|
28
28
|
end
|
29
|
+
|
30
|
+
it "should delivery message" do
|
31
|
+
expect {
|
32
|
+
subject
|
33
|
+
}.to change(Evrone::CI::Router::BuildLogsConsumer.messages, :count).by(1)
|
34
|
+
expect(last_build_log_message.log).to eq data
|
35
|
+
end
|
29
36
|
end
|
30
37
|
|
31
38
|
context "to_build_status_message" do
|
@@ -40,63 +47,53 @@ describe Evrone::CI::Router::Build do
|
|
40
47
|
its(:status) { should eq 2 }
|
41
48
|
its(:tm) { should be }
|
42
49
|
its(:jobs_count) { should eq 1 }
|
43
|
-
|
44
|
-
context "when commit_info exists" do
|
45
|
-
before do
|
46
|
-
build.commit_info = OpenStruct.new(
|
47
|
-
author: "author",
|
48
|
-
email: "email",
|
49
|
-
sha: 'sha',
|
50
|
-
message: "message"
|
51
|
-
)
|
52
|
-
end
|
53
|
-
|
54
|
-
its(:commit_author) { should eq 'author' }
|
55
|
-
its(:commit_author_email) { should eq 'email' }
|
56
|
-
its(:commit_sha) { should eq 'sha' }
|
57
|
-
its(:commit_message) { should eq 'message' }
|
58
|
-
end
|
59
50
|
end
|
60
51
|
|
61
52
|
context "add_to_output" do
|
62
53
|
let(:data) { 'data' }
|
63
54
|
let(:messages) { Evrone::CI::Router::BuildLogsConsumer.messages }
|
64
|
-
subject
|
65
|
-
|
66
|
-
|
55
|
+
subject do
|
56
|
+
build.add_to_output(data)
|
57
|
+
build.output.flush
|
58
|
+
build
|
59
|
+
end
|
67
60
|
|
68
61
|
it "should delivery message" do
|
69
62
|
expect {
|
70
63
|
subject
|
71
64
|
}.to change(messages, :size).by(1)
|
65
|
+
expect(last_build_log_message.log).to eq data
|
72
66
|
end
|
73
67
|
|
74
68
|
it "should increment output_counter" do
|
75
69
|
expect {
|
76
70
|
subject
|
77
71
|
}.to change(build, :output_counter).by(1)
|
78
|
-
expect(
|
72
|
+
expect(last_build_log_message.tm).to eq 1
|
79
73
|
end
|
80
74
|
end
|
81
75
|
|
82
76
|
context "add_command_to_output" do
|
83
77
|
let(:data) { 'data' }
|
84
78
|
let(:messages) { Evrone::CI::Router::BuildLogsConsumer.messages }
|
85
|
-
subject
|
86
|
-
|
87
|
-
|
79
|
+
subject do
|
80
|
+
build.add_command_to_output(data)
|
81
|
+
build.output.flush
|
82
|
+
build
|
83
|
+
end
|
88
84
|
|
89
85
|
it "should delivery message" do
|
90
86
|
expect {
|
91
87
|
subject
|
92
88
|
}.to change(messages, :size).by(1)
|
89
|
+
expect(last_build_log_message.log).to eq "$ #{data}\n"
|
93
90
|
end
|
94
91
|
|
95
92
|
it "should increment output_counter" do
|
96
93
|
expect {
|
97
94
|
subject
|
98
95
|
}.to change(build, :output_counter).by(1)
|
99
|
-
expect(
|
96
|
+
expect(last_build_log_message.tm).to eq 1
|
100
97
|
end
|
101
98
|
end
|
102
99
|
|
@@ -108,25 +105,18 @@ describe Evrone::CI::Router::Build do
|
|
108
105
|
it { should be_an_instance_of Evrone::CI::Message::PerformJob }
|
109
106
|
|
110
107
|
context "created message" do
|
111
|
-
its(:id) { should eq build.message.id
|
112
|
-
its(:name) { should eq build.message.name
|
113
|
-
its(:
|
114
|
-
its(:
|
115
|
-
its(:
|
116
|
-
|
117
|
-
its(:
|
118
|
-
its(:before_script) { should be }
|
119
|
-
its(:script) { should be }
|
120
|
-
its(:matrix_keys) { should eq ['rvm:2.0.0'] }
|
108
|
+
its(:id) { should eq build.message.id }
|
109
|
+
its(:name) { should eq build.message.name }
|
110
|
+
its(:job_id) { should eq job_id }
|
111
|
+
its(:before_script) { should be }
|
112
|
+
its(:script) { should be }
|
113
|
+
its(:after_script) { should be }
|
114
|
+
its(:matrix_keys) { should eq ['rvm:2.0.0'] }
|
121
115
|
end
|
116
|
+
end
|
122
117
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
end
|
127
|
-
|
128
|
-
its(:sha) { should eq 'commit info sha' }
|
129
|
-
|
130
|
-
end
|
118
|
+
context "scm_class" do
|
119
|
+
subject { build.scm_class }
|
120
|
+
it { should eq ::Evrone::CI::SCM::Git }
|
131
121
|
end
|
132
122
|
end
|
data/spec/lib/router_spec.rb
CHANGED
@@ -4,22 +4,11 @@ require 'pathname'
|
|
4
4
|
|
5
5
|
describe Evrone::CI::Router do
|
6
6
|
let(:build) { create :build }
|
7
|
-
let(:
|
8
|
-
let(:router) { described_class.new build, path_prefix }
|
7
|
+
let(:router) { described_class.new build }
|
9
8
|
subject { router }
|
10
9
|
|
11
|
-
before do
|
12
|
-
FileUtils.rm_rf path_prefix
|
13
|
-
end
|
14
|
-
|
15
|
-
after do
|
16
|
-
FileUtils.rm_rf path_prefix
|
17
|
-
end
|
18
|
-
|
19
10
|
context "just created" do
|
20
11
|
its(:build) { should eq build }
|
21
|
-
its("path_prefix.to_s") { should eq path_prefix }
|
22
|
-
its("repo_dir.to_s") { should eq "/tmp/.test/repo/evrone/test-repo" }
|
23
12
|
end
|
24
13
|
|
25
14
|
context "#perform" do
|
@@ -54,41 +43,10 @@ describe Evrone::CI::Router do
|
|
54
43
|
end
|
55
44
|
end
|
56
45
|
|
57
|
-
context "#create_repo_dir" do
|
58
|
-
subject { router.create_repo_dir }
|
59
|
-
it "should create directory inside path_prefix" do
|
60
|
-
expect(subject).to be_true
|
61
|
-
expect(router.repo_dir).to be_directory
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
context "#fetch_repo" do
|
66
|
-
subject { router.fetch_repo }
|
67
|
-
it "should fetch repo" do
|
68
|
-
expect(subject).to be_true
|
69
|
-
expect(router.repo_dir.join(".git")).to be_directory
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
context "#assign_commit_info" do
|
74
|
-
subject { router.assign_commit_info }
|
75
|
-
before { mock_repo_dir }
|
76
|
-
|
77
|
-
it "should assign commit information to build" do
|
78
|
-
expect(subject).to be_true
|
79
|
-
expect(router.build.commit_info.marshal_dump).to eq(
|
80
|
-
:sha=>"687753389908e70801dd4ff5448be908642055c6",
|
81
|
-
:author=>"Dmitry Galinsky",
|
82
|
-
:email=>"dima.exe@gmail.com",
|
83
|
-
:message=>"test commit #3"
|
84
|
-
)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
46
|
context "#load_travis" do
|
89
47
|
subject { router.load_travis }
|
90
|
-
|
91
|
-
it "should build new travis instance from
|
48
|
+
|
49
|
+
it "should build new travis instance from message" do
|
92
50
|
expect(subject).to be_true
|
93
51
|
expect(router.travis).to be
|
94
52
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'evrone/common/spawn'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
describe Evrone::CI::Router::ScriptBuilder::Prepare do
|
6
|
+
let(:path) { '/tmp/.test' }
|
7
|
+
let(:app) { ->(_) { _ } }
|
8
|
+
let(:build) { create :build }
|
9
|
+
let(:env) { OpenStruct.new build: build, init: [] }
|
10
|
+
let(:mid) { described_class.new app }
|
11
|
+
|
12
|
+
subject { mid.call env }
|
13
|
+
|
14
|
+
before do
|
15
|
+
FileUtils.rm_rf path
|
16
|
+
FileUtils.mkdir_p path
|
17
|
+
end
|
18
|
+
|
19
|
+
after { FileUtils.rm_rf path }
|
20
|
+
|
21
|
+
it { should eq env }
|
22
|
+
its(:init) { should_not be_empty }
|
23
|
+
|
24
|
+
context "run compiled script" do
|
25
|
+
include Evrone::Common::Spawn
|
26
|
+
|
27
|
+
let(:script) { "set -e\nset -x\n" + env.init.join("\n") }
|
28
|
+
before { mid.call env }
|
29
|
+
|
30
|
+
it "should be success" do
|
31
|
+
|
32
|
+
code = spawn script, chdir: path do |out|
|
33
|
+
puts " ===> #{out}"
|
34
|
+
end
|
35
|
+
|
36
|
+
expect(code).to eq 0
|
37
|
+
expect(File).to be_readable("#{path}/data/evrone/test-repo/git_ssh")
|
38
|
+
expect(File).to be_readable("#{path}/data/evrone/test-repo/key")
|
39
|
+
expect(File).to be_directory("#{path}/code/evrone/test-repo/.git")
|
40
|
+
expect(File).to be_readable("#{path}/code/evrone/test-repo/Rakefile")
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'evrone/common/spawn'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
describe Evrone::CI::Router::ScriptBuilder::WebdavCache do
|
6
|
+
let(:path) { '/tmp/.test' }
|
7
|
+
let(:app) { ->(_) { _ } }
|
8
|
+
let(:build) { create :build }
|
9
|
+
let(:travis) { create :travis }
|
10
|
+
let(:env) { OpenStruct.new build: build, init: [], travis: travis, after_script: [] }
|
11
|
+
let(:mid) { described_class.new app }
|
12
|
+
|
13
|
+
subject { mid.call env }
|
14
|
+
|
15
|
+
before do
|
16
|
+
FileUtils.rm_rf path
|
17
|
+
FileUtils.mkdir_p path
|
18
|
+
|
19
|
+
Evrone::CI::Router.configure do |c|
|
20
|
+
c.webdav_cache_url = 'http://localhost:8080'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
after { FileUtils.rm_rf path }
|
25
|
+
|
26
|
+
it { should eq env }
|
27
|
+
its(:init) { should_not be_empty }
|
28
|
+
its(:after_script) { should_not be_empty }
|
29
|
+
its(:webdav_cache_url) { should eq "http://localhost:8080/evrone-test-repo-rvm-2.0.0.tgz" }
|
30
|
+
|
31
|
+
context "execute command" do
|
32
|
+
include Evrone::Common::Spawn
|
33
|
+
|
34
|
+
let(:init_script) { env.init.join("\n") }
|
35
|
+
let(:after_script) { env.after_script.join("\n") }
|
36
|
+
|
37
|
+
before do
|
38
|
+
mid.call env
|
39
|
+
init_script.gsub!("$HOME/cached", path)
|
40
|
+
after_script.gsub!("$HOME/cached", path)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should be success" do
|
44
|
+
out = ""
|
45
|
+
|
46
|
+
code = spawn(init_script, chdir: path) do |o|
|
47
|
+
out << o
|
48
|
+
puts " ===> #{o}"
|
49
|
+
end
|
50
|
+
expect(code).to eq 0
|
51
|
+
|
52
|
+
code = spawn(after_script, chdir: path) do |o|
|
53
|
+
out << o
|
54
|
+
puts " ===> #{o}"
|
55
|
+
end
|
56
|
+
expect(code).to eq 0
|
57
|
+
|
58
|
+
#twice
|
59
|
+
code = spawn(after_script, chdir: path) do |o|
|
60
|
+
out << o
|
61
|
+
puts " ===> #{o}"
|
62
|
+
end
|
63
|
+
expect(code).to eq 0
|
64
|
+
|
65
|
+
expect(out).to match("adding /tmp/.test to cache")
|
66
|
+
expect(out).to match("casher successfuly downloaded")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
@@ -1,51 +1,32 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Evrone::CI::Router::ScriptBuilder do
|
4
|
-
let(:
|
5
|
-
let(:
|
6
|
-
let(:
|
7
|
-
s = []
|
8
|
-
s << "export LC_ALL=en_US.UTF8"
|
9
|
-
s << "eval \"$(rbenv init -)\" || true"
|
10
|
-
s << %{
|
11
|
-
rbenv shell
|
12
|
-
$(rbenv versions |
|
13
|
-
sed -e 's/^*/ /' |
|
14
|
-
awk '{print $1}' |
|
15
|
-
grep -v 'system' |
|
16
|
-
grep '2.0.0' |
|
17
|
-
tail -n1)
|
18
|
-
}.compact
|
19
|
-
s << 'export BUNDLE_GEMFILE=${PWD}/Gemfile'
|
20
|
-
s << "export GEM_HOME=$HOME/cached/rubygems"
|
21
|
-
trace s, "env"
|
22
|
-
s << "gem query -q -in '^bundler$' > /dev/null || gem install bundler -q --no-rdoc --no-ri"
|
23
|
-
trace s, "ruby --version"
|
24
|
-
trace s, "gem --version"
|
25
|
-
trace s, "bundle --version"
|
26
|
-
trace s, "bundle install && bundle clean --force"
|
27
|
-
trace s, "echo before_script"
|
28
|
-
s.join("\n")
|
29
|
-
}
|
30
|
-
let(:expected_script) {
|
31
|
-
s = []
|
32
|
-
trace s, "RAILS_ENV=test ls -1 && echo DONE!"
|
33
|
-
s.join("\n")
|
34
|
-
}
|
4
|
+
let(:build) { create :build }
|
5
|
+
let(:travis) { create :travis }
|
6
|
+
let(:script_builder) { described_class.new build, travis }
|
35
7
|
subject { script_builder }
|
36
8
|
|
37
|
-
|
9
|
+
context "just created" do
|
10
|
+
its(:travis) { should eq travis }
|
11
|
+
its(:build) { should eq build }
|
12
|
+
end
|
38
13
|
|
39
14
|
context "to_before_script" do
|
40
15
|
subject { script_builder.to_before_script }
|
41
16
|
|
42
|
-
it {
|
17
|
+
it { should_not be_empty }
|
43
18
|
end
|
44
19
|
|
45
20
|
context "to_script" do
|
46
21
|
subject { script_builder.to_script }
|
47
22
|
|
48
|
-
it {
|
23
|
+
it { should_not be_empty }
|
24
|
+
end
|
25
|
+
|
26
|
+
context "to_after_script" do
|
27
|
+
subject { script_builder.to_after_script }
|
28
|
+
|
29
|
+
it { should_not be_empty }
|
49
30
|
end
|
50
31
|
|
51
32
|
def trace(s, cmd)
|
data/spec/lib/travis_spec.rb
CHANGED
data/spec/support/create.rb
CHANGED
@@ -35,13 +35,6 @@ def create(who, *args)
|
|
35
35
|
path = args.shift
|
36
36
|
Evrone::CI::SCM::Git.new build.src, build.sha, path, deploy_key: build.deploy_key, &build.method(:add_to_output)
|
37
37
|
|
38
|
-
when :commit_info
|
39
|
-
OpenStruct.new(
|
40
|
-
sha: "sha",
|
41
|
-
author: "author",
|
42
|
-
email: "email",
|
43
|
-
message: "message"
|
44
|
-
)
|
45
38
|
end
|
46
39
|
|
47
40
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: evrone-ci-router
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.0.
|
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-
|
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.
|
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.
|
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.
|
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.
|
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
|
@@ -155,9 +155,12 @@ files:
|
|
155
155
|
- lib/evrone/ci/router/helper/trace_sh_command.rb
|
156
156
|
- lib/evrone/ci/router/initializers/amqp.rb
|
157
157
|
- lib/evrone/ci/router/script_builder.rb
|
158
|
+
- lib/evrone/ci/router/script_builder/databases.rb
|
158
159
|
- lib/evrone/ci/router/script_builder/env.rb
|
160
|
+
- lib/evrone/ci/router/script_builder/prepare.rb
|
159
161
|
- lib/evrone/ci/router/script_builder/ruby.rb
|
160
162
|
- lib/evrone/ci/router/script_builder/script.rb
|
163
|
+
- lib/evrone/ci/router/script_builder/webdav_cache.rb
|
161
164
|
- lib/evrone/ci/router/travis.rb
|
162
165
|
- lib/evrone/ci/router/travis/serializable.rb
|
163
166
|
- lib/evrone/ci/router/version.rb
|
@@ -165,11 +168,14 @@ files:
|
|
165
168
|
- spec/lib/build_spec.rb
|
166
169
|
- spec/lib/configuration_spec.rb
|
167
170
|
- spec/lib/router_spec.rb
|
171
|
+
- spec/lib/script_builder/prepare_spec.rb
|
172
|
+
- spec/lib/script_builder/webdav_cache_spec.rb
|
168
173
|
- spec/lib/script_builder_spec.rb
|
169
174
|
- spec/lib/travis_spec.rb
|
170
175
|
- spec/spec_helper.rb
|
171
176
|
- spec/support/create.rb
|
172
177
|
- spec/support/fixture.rb
|
178
|
+
- spec/support/last_build_log_message.rb
|
173
179
|
- spec/support/shared_examples/update_build_status_message.rb
|
174
180
|
homepage: ''
|
175
181
|
licenses:
|
@@ -200,9 +206,12 @@ test_files:
|
|
200
206
|
- spec/lib/build_spec.rb
|
201
207
|
- spec/lib/configuration_spec.rb
|
202
208
|
- spec/lib/router_spec.rb
|
209
|
+
- spec/lib/script_builder/prepare_spec.rb
|
210
|
+
- spec/lib/script_builder/webdav_cache_spec.rb
|
203
211
|
- spec/lib/script_builder_spec.rb
|
204
212
|
- spec/lib/travis_spec.rb
|
205
213
|
- spec/spec_helper.rb
|
206
214
|
- spec/support/create.rb
|
207
215
|
- spec/support/fixture.rb
|
216
|
+
- spec/support/last_build_log_message.rb
|
208
217
|
- spec/support/shared_examples/update_build_status_message.rb
|