mamiya 0.0.1.beta3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/README.md +14 -37
- data/docs/upgrading.md +25 -0
- data/example/config.agent.rb +2 -1
- data/example/deploy.rb +22 -21
- data/lib/mamiya/agent/task_queue.rb +2 -0
- data/lib/mamiya/agent/tasks/switch.rb +4 -2
- data/lib/mamiya/steps/switch.rb +46 -21
- data/lib/mamiya/version.rb +1 -1
- data/spec/agent/task_queue_spec.rb +7 -4
- data/spec/steps/switch_spec.rb +36 -0
- metadata +5 -7
- data/docs/cli.md +0 -78
- data/docs/sequences/deploy.png +0 -0
- data/docs/sequences/deploy.uml +0 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8fa28dadde7c00c1165fb66de3fceee10b564577
|
4
|
+
data.tar.gz: 614971d0864612144dab18e4db4aee2c3c7a1126
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 494a8f6d5d1e171ec5f2a154a81c534780eb464e6bc30adff4df5e9393788a43eb57a6f2ffaea7e11ce0208c34b9f5a64547fed531149da478a083380ec18a96
|
7
|
+
data.tar.gz: 3cc97e2941f5a10f5ce67552ec1066431f08c1b6ffe4748a2563fa1f085229bc68074e702649529fa3492a682f36f516795b6b963c4f2dbebcf81136be52fd86
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -6,28 +6,22 @@ Mamiya allows you to deploy using without ssh -- using tarballs, some storages (
|
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
9
|
-
$ gem install mamiya
|
10
|
-
|
11
|
-
or bundle it:
|
12
|
-
|
13
|
-
``` ruby
|
14
|
-
gem 'mamiya'
|
15
|
-
```
|
16
|
-
|
17
|
-
## Usage
|
18
|
-
|
19
9
|
(Detailed documentation coming soon)
|
20
10
|
|
21
|
-
1.
|
11
|
+
1. Install gem (`gem install mamiya`, or bundling by `gem 'mamiya'`)
|
12
|
+
2. Prepare master node for `mamiya master` process
|
22
13
|
- master has HTTP API to allow control the cluster via HTTP
|
23
14
|
- master watches agents in the cluster
|
24
|
-
|
25
|
-
|
15
|
+
3. Then install `mamiya agent` in your deployment target hosts
|
16
|
+
4. Write deploy script for your own
|
26
17
|
- how to build package, how to prepare release, how to release, etc.
|
27
|
-
|
28
|
-
|
18
|
+
5. Build then push package
|
19
|
+
6. Time to deploy
|
29
20
|
|
30
|
-
|
21
|
+
### Example configuration
|
22
|
+
|
23
|
+
[example](./example) directory contains configuration files that work out-of-the-box.
|
24
|
+
Try Mamiya in your local machine: `foreman start`
|
31
25
|
|
32
26
|
## Problems in existing deploy tool
|
33
27
|
|
@@ -39,30 +33,13 @@ This solves such problem by using [Serf](http://www.serfdom.io/) and tarball on
|
|
39
33
|
Also, I'm planning to allow to distribute files before the deploy command. I guess this can skip or shorten
|
40
34
|
file transferring phase in deploy.
|
41
35
|
|
36
|
+
## Misc.
|
42
37
|
|
43
|
-
|
44
|
-
|
45
|
-
### 0.0.1.alpha21
|
46
|
-
|
47
|
-
#### Configuration now written in Ruby
|
38
|
+
- [Scalable Deployments - How we deploy Rails app to 150+ hosts in a minute // Speaker Deck](https://speakerdeck.com/sorah/scalable-deployments-how-we-deploy-rails-app-to-150-plus-hosts-in-a-minute)
|
48
39
|
|
49
|
-
|
50
|
-
|
51
|
-
### 0.0.1.alpha20
|
52
|
-
|
53
|
-
_tl;dr_ Don't mix alpha19 and alpha20.
|
54
|
-
|
55
|
-
#### Internal component for distribution has been replaced completely
|
56
|
-
|
57
|
-
alpha20 introduces new class `TaskQueue` and removes `Fetcher`. This changes way to distribute packages -- including internal serf events, job tracking that Distribution API does, etc.
|
58
|
-
So basically there's no compatibility for distribution, between alpha19 and alpha20 and later. Distribute task from alpha20 doesn't effect to alpha19, and vice versa.
|
59
|
-
|
60
|
-
Good new: There's no change in Distribution API.
|
61
|
-
|
62
|
-
#### Agent status has changed
|
40
|
+
## Upgrade Notes
|
63
41
|
|
64
|
-
|
65
|
-
- Added `.queues`, represents task queues that managed by `TaskQueue` class.
|
42
|
+
See [docs/upgrading.md](./docs/upgrading.md).
|
66
43
|
|
67
44
|
## Contributing
|
68
45
|
|
data/docs/upgrading.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# Upgrade Notes
|
2
|
+
|
3
|
+
## 0.0.1.alpha21
|
4
|
+
|
5
|
+
### Configuration now written in Ruby
|
6
|
+
|
7
|
+
You should rewrite your configuration yaml in Ruby. See examples/config.rb for example.
|
8
|
+
|
9
|
+
## 0.0.1.alpha20
|
10
|
+
|
11
|
+
_tl;dr_ Don't mix alpha19 and alpha20.
|
12
|
+
|
13
|
+
### Internal component for distribution has been replaced completely
|
14
|
+
|
15
|
+
alpha20 introduces new class `TaskQueue` and removes `Fetcher`. This changes way to distribute packages -- including internal serf events, job tracking that Distribution API does, etc.
|
16
|
+
So basically there's no compatibility for distribution, between alpha19 and alpha20 and later. Distribute task from alpha20 doesn't effect to alpha19, and vice versa.
|
17
|
+
|
18
|
+
Good new: There's no change in Distribution API.
|
19
|
+
|
20
|
+
### Agent status has changed
|
21
|
+
|
22
|
+
- Due to removal of `Fetcher`, alpha20 removes `.fetcher` object from agent status.
|
23
|
+
- Added `.queues`, represents task queues that managed by `TaskQueue` class.
|
24
|
+
|
25
|
+
|
data/example/config.agent.rb
CHANGED
data/example/deploy.rb
CHANGED
@@ -16,6 +16,28 @@ set :build_to, "#{File.dirname(__FILE__)}/builds"
|
|
16
16
|
# to test it
|
17
17
|
Dir.mkdir build_to unless File.exist?(build_to)
|
18
18
|
|
19
|
+
build("test") do
|
20
|
+
# build something...
|
21
|
+
File.write('built_at', "#{Time.now}\n")
|
22
|
+
end
|
23
|
+
|
24
|
+
prepare 'test' do
|
25
|
+
# run 'bundle', 'install'
|
26
|
+
sleep 5
|
27
|
+
File.write release_path.join('prepared_at'), Time.now
|
28
|
+
end
|
29
|
+
|
30
|
+
release 'test' do
|
31
|
+
# run '/etc/init.d/app', 'reload'
|
32
|
+
i = rand(10)
|
33
|
+
logger.info "SLEEP #{i} sec"
|
34
|
+
sleep i
|
35
|
+
File.write release_path.join('released_at'), Time.now
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
|
19
41
|
#set :bundle_without, [:development, :test]
|
20
42
|
#set :bundle_dir, "#{deploy_to}/shared/bundle"
|
21
43
|
|
@@ -25,10 +47,6 @@ Dir.mkdir build_to unless File.exist?(build_to)
|
|
25
47
|
# run "bundle", "install"
|
26
48
|
#end
|
27
49
|
|
28
|
-
build("test") do
|
29
|
-
File.write('built_at', "#{Time.now}\n")
|
30
|
-
end
|
31
|
-
|
32
50
|
#build("include assets and .bundle") do
|
33
51
|
# exclude_from_package.reject! { |_| _ == 'public/assets/' }
|
34
52
|
# exclude_from_package.reject! { |_| _ == '.bundle/' }
|
@@ -38,21 +56,4 @@ end
|
|
38
56
|
# run "bundle", "exec", "rake", "assets:precompile"
|
39
57
|
#end
|
40
58
|
|
41
|
-
prepare 'test' do
|
42
|
-
# run 'bundle', 'install'
|
43
|
-
logger.info "- prep/deploy_to: #{deploy_to}"
|
44
|
-
logger.info "- prep/release_path: #{release_path}"
|
45
|
-
sleep 5
|
46
|
-
File.write release_path.join('prepared_at'), Time.now
|
47
|
-
end
|
48
|
-
|
49
|
-
release 'test' do
|
50
|
-
logger.info "- prep/deploy_to: #{deploy_to}"
|
51
|
-
logger.info "- prep/release_path: #{release_path}"
|
52
|
-
sl = rand(80)
|
53
|
-
logger.info "!!!!!!!!!!!!!!! sleep #{sl} sec"
|
54
|
-
sleep sl
|
55
|
-
File.write release_path.join('released_at'), Time.now
|
56
|
-
end
|
57
|
-
|
58
59
|
|
@@ -52,8 +52,10 @@ module Mamiya
|
|
52
52
|
raise PrereleaseMissing, "Existing release is not prepared but prerelease doesn't exist"
|
53
53
|
end
|
54
54
|
|
55
|
-
|
56
|
-
|
55
|
+
unless release_path.exist?
|
56
|
+
logger.info "Copying #{prerelease_path} -> #{release_path}"
|
57
|
+
FileUtils.cp_r prerelease_path, release_path
|
58
|
+
end
|
57
59
|
|
58
60
|
logger.info "Switching"
|
59
61
|
switch_step.run!
|
data/lib/mamiya/steps/switch.rb
CHANGED
@@ -5,28 +5,18 @@ module Mamiya
|
|
5
5
|
class Switch < Abstract
|
6
6
|
def run!
|
7
7
|
@exception = nil
|
8
|
-
|
9
|
-
|
10
|
-
script.before_switch(labels)[]
|
11
|
-
|
12
|
-
# TODO: link with relative if available?
|
13
|
-
# TODO: Restore this if FAILED
|
14
|
-
File.unlink script.current_path if script.current_path.symlink?
|
15
|
-
script.current_path.make_symlink(target.realpath)
|
8
|
+
@switched = false
|
16
9
|
|
17
|
-
if
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
logger.info "Releasing..."
|
10
|
+
if current_targets_release?
|
11
|
+
logger.info "Already switched"
|
12
|
+
else
|
13
|
+
switch
|
14
|
+
end
|
23
15
|
|
24
|
-
|
25
|
-
|
26
|
-
Dir.chdir old_pwd if old_pwd
|
27
|
-
end
|
16
|
+
if @switched ? do_release? : force_release?
|
17
|
+
release
|
28
18
|
else
|
29
|
-
logger.warn "Skipping release
|
19
|
+
logger.warn "Skipping release"
|
30
20
|
end
|
31
21
|
|
32
22
|
rescue Exception => e
|
@@ -35,11 +25,34 @@ module Mamiya
|
|
35
25
|
ensure
|
36
26
|
logger.warn "Exception occured, cleaning up..." if @exception
|
37
27
|
|
38
|
-
script.after_switch(labels)[@exception]
|
28
|
+
script.after_switch(labels)[@exception] if @switched
|
39
29
|
|
40
30
|
logger.info "DONE!" unless @exception
|
41
31
|
end
|
42
32
|
|
33
|
+
def switch
|
34
|
+
logger.info "Switching to #{target}"
|
35
|
+
@switched = true
|
36
|
+
script.before_switch(labels)[]
|
37
|
+
|
38
|
+
File.unlink script.current_path if script.current_path.symlink?
|
39
|
+
script.current_path.make_symlink(target.realpath)
|
40
|
+
end
|
41
|
+
|
42
|
+
def release
|
43
|
+
# TODO: link with relative if available?
|
44
|
+
# TODO: Restore this if FAILED
|
45
|
+
|
46
|
+
old_pwd = Dir.pwd
|
47
|
+
Dir.chdir(target)
|
48
|
+
|
49
|
+
logger.info "Releasing..."
|
50
|
+
|
51
|
+
script.release(labels)[@exception]
|
52
|
+
ensure
|
53
|
+
Dir.chdir old_pwd if old_pwd
|
54
|
+
end
|
55
|
+
|
43
56
|
# XXX: dupe with prepare step. modulize?
|
44
57
|
|
45
58
|
# This class see target_dir's script
|
@@ -57,8 +70,20 @@ module Mamiya
|
|
57
70
|
|
58
71
|
private
|
59
72
|
|
73
|
+
def current_targets_release?
|
74
|
+
script.current_path.exist? && script.current_path.realpath == target.realpath
|
75
|
+
end
|
76
|
+
|
60
77
|
def do_release?
|
61
|
-
!
|
78
|
+
force_release? ? true : !no_release?
|
79
|
+
end
|
80
|
+
|
81
|
+
def force_release?
|
82
|
+
!!options[:do_release]
|
83
|
+
end
|
84
|
+
|
85
|
+
def no_release?
|
86
|
+
!!options[:no_release]
|
62
87
|
end
|
63
88
|
|
64
89
|
def target
|
data/lib/mamiya/version.rb
CHANGED
@@ -41,7 +41,6 @@ describe Mamiya::Agent::TaskQueue do
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
|
45
44
|
let(:task_class_a) do
|
46
45
|
Class.new(task_class_root) do
|
47
46
|
def self.identifier
|
@@ -62,6 +61,10 @@ describe Mamiya::Agent::TaskQueue do
|
|
62
61
|
described_class.new(agent, task_classes: [task_class_a, task_class_b])
|
63
62
|
end
|
64
63
|
|
64
|
+
before do
|
65
|
+
allow(Time).to receive(:now).and_return(Time.now)
|
66
|
+
end
|
67
|
+
|
65
68
|
describe "lifecycle (#start!, #stop!)" do
|
66
69
|
it "can start and stop" do
|
67
70
|
expect(queue).not_to be_running
|
@@ -170,7 +173,7 @@ describe Mamiya::Agent::TaskQueue do
|
|
170
173
|
|
171
174
|
100.times { break unless task_class_a.locks.empty?; sleep 0.01 }
|
172
175
|
expect(task_class_a.locks).not_to be_empty
|
173
|
-
expect(queue.status[:a][:working]).to eq('wait' => true, 'id' => 1, 'task' => :a)
|
176
|
+
expect(queue.status[:a][:working]).to eq('wait' => true, 'id' => 1, 'task' => :a, 'start' => Time.now.to_i)
|
174
177
|
|
175
178
|
queue.enqueue(:a, 'id' => 2)
|
176
179
|
100.times { break unless queue.status[:a][:queue].empty?; sleep 0.01 }
|
@@ -236,8 +239,8 @@ describe Mamiya::Agent::TaskQueue do
|
|
236
239
|
expect(task_class_a.locks).not_to be_empty
|
237
240
|
expect(task_class_b.locks).not_to be_empty
|
238
241
|
|
239
|
-
expect(queue.status[:a][:working]).to eq('wait' => true, 'id' => 1, 'task' => :a)
|
240
|
-
expect(queue.status[:b][:working]).to eq('wait' => true, 'id' => 2, 'task' => :b)
|
242
|
+
expect(queue.status[:a][:working]).to eq('wait' => true, 'id' => 1, 'task' => :a, 'start' => Time.now.to_i)
|
243
|
+
expect(queue.status[:b][:working]).to eq('wait' => true, 'id' => 2, 'task' => :b, 'start' => Time.now.to_i)
|
241
244
|
|
242
245
|
queue.enqueue(:a, 'id' => 3)
|
243
246
|
queue.enqueue(:b, 'id' => 4)
|
data/spec/steps/switch_spec.rb
CHANGED
@@ -119,6 +119,42 @@ describe Mamiya::Steps::Switch do
|
|
119
119
|
}.from(nil).to(release_path.realpath)
|
120
120
|
end
|
121
121
|
|
122
|
+
context "when current targets the target" do
|
123
|
+
before do
|
124
|
+
current_path.make_symlink(release_path.realpath)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "doesn't call hooks" do
|
128
|
+
called = false
|
129
|
+
allow(script).to receive(:release).and_return(proc { called = true })
|
130
|
+
allow(script).to receive(:before_switch).and_return(proc { called = true })
|
131
|
+
allow(script).to receive(:after_switch).and_return(proc { called = true })
|
132
|
+
step.run!
|
133
|
+
|
134
|
+
expect(called).to be_false
|
135
|
+
end
|
136
|
+
|
137
|
+
context "with do_release" do
|
138
|
+
let(:options) do
|
139
|
+
{target: release_path, do_release: true}
|
140
|
+
end
|
141
|
+
|
142
|
+
it "calls hooks" do
|
143
|
+
hooks = %i(release)
|
144
|
+
|
145
|
+
flags = []
|
146
|
+
hooks.each do |sym|
|
147
|
+
allow(script).to receive(sym).and_return(proc { flags << sym })
|
148
|
+
end
|
149
|
+
|
150
|
+
expect { step.run! }.
|
151
|
+
to change { flags }.
|
152
|
+
from([]).
|
153
|
+
to(hooks)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
122
158
|
context "when current already exists" do
|
123
159
|
before do
|
124
160
|
current_path.make_symlink('releases/20140515000707')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mamiya
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shota Fukumori (sora_h)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -180,9 +180,7 @@ files:
|
|
180
180
|
- README.md
|
181
181
|
- Rakefile
|
182
182
|
- bin/mamiya
|
183
|
-
- docs/
|
184
|
-
- docs/sequences/deploy.png
|
185
|
-
- docs/sequences/deploy.uml
|
183
|
+
- docs/upgrading.md
|
186
184
|
- example/.gitignore
|
187
185
|
- example/Procfile
|
188
186
|
- example/README.md
|
@@ -289,9 +287,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
289
287
|
version: '0'
|
290
288
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
291
289
|
requirements:
|
292
|
-
- - "
|
290
|
+
- - ">="
|
293
291
|
- !ruby/object:Gem::Version
|
294
|
-
version:
|
292
|
+
version: '0'
|
295
293
|
requirements: []
|
296
294
|
rubyforge_project:
|
297
295
|
rubygems_version: 2.2.2
|
data/docs/cli.md
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
# Commands
|
2
|
-
|
3
|
-
## Global options
|
4
|
-
|
5
|
-
- `-C`, `--config`: path to configuration file (default: `./config.yml`)
|
6
|
-
- config file won't be required if a command don't need it.
|
7
|
-
- `-S`, `--script`: path to script file (default: `./deploy.rb`)
|
8
|
-
- script file won't be required if a command don't need it.
|
9
|
-
- `-a`, `--app`: Specify application name to operate
|
10
|
-
- `-d`, `--debug`: Enable debug mode
|
11
|
-
- `--color`, `--no-color`: Enable or disable colored output. When the stdout is a terminal, it'll be enabled by default.
|
12
|
-
|
13
|
-
## Storage related commands
|
14
|
-
|
15
|
-
### `list-applications` - list application in storage
|
16
|
-
|
17
|
-
```
|
18
|
-
$ mamiya list-applications -C ./config.yml
|
19
|
-
```
|
20
|
-
|
21
|
-
### `list-packages` - list packages for specified app in storage
|
22
|
-
|
23
|
-
```
|
24
|
-
$ mamiya list-packages -C ./config.yml -a myapp
|
25
|
-
```
|
26
|
-
|
27
|
-
- __Requires:__ configuration file, application name
|
28
|
-
- application name will be retrieved from deploy script when not specified.
|
29
|
-
- __Options:__
|
30
|
-
- `-n`, `--name-only`: Show only names (without heading text)
|
31
|
-
|
32
|
-
### `show` - show package information
|
33
|
-
|
34
|
-
```
|
35
|
-
$ mamiya list-packages -C ./config.yml -a myapp PACKAGE_NAME
|
36
|
-
```
|
37
|
-
|
38
|
-
- __Requires:__ configuration file, application name, package name
|
39
|
-
- application name will be retrieved from deploy script when not specified.
|
40
|
-
- __Options:__
|
41
|
-
- `-f`, `--format`: Choose output format from `pp`, `json`, or `yaml`. Default: `pp`.
|
42
|
-
|
43
|
-
## Build, pushing and fetching packages
|
44
|
-
|
45
|
-
### `build` - build package using script
|
46
|
-
|
47
|
-
```
|
48
|
-
$ mamiya build --script ./deploy.rb --source source_dir --destination dest_dir
|
49
|
-
```
|
50
|
-
|
51
|
-
- __Requires:__ application name, source, destination, deploy script
|
52
|
-
- source, description, and app name will be taken from deploy script, if omitted
|
53
|
-
- __Options:__
|
54
|
-
- `-f`, `--source`, `--build-from`: directory for package source.
|
55
|
-
- `-t`, `--destination`, `--build-to`: directory to save built packages.
|
56
|
-
- `-P`, `--skip-prepare-build`: Skip prepare build phase of deploy script.
|
57
|
-
|
58
|
-
### `push` - push built package to the storage
|
59
|
-
|
60
|
-
### `fetch`
|
61
|
-
|
62
|
-
## Package related commands
|
63
|
-
|
64
|
-
### `extract`
|
65
|
-
|
66
|
-
## `client` - API client for `mamiya master`
|
67
|
-
|
68
|
-
### `list-applications`
|
69
|
-
|
70
|
-
### `list-packages`
|
71
|
-
|
72
|
-
### `show-package`
|
73
|
-
|
74
|
-
### `list-agents`
|
75
|
-
|
76
|
-
### `show-agent`
|
77
|
-
|
78
|
-
### `show-distribution`
|
data/docs/sequences/deploy.png
DELETED
Binary file
|
data/docs/sequences/deploy.uml
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
@startuml
|
2
|
-
== Building ==
|
3
|
-
Master --> Master: Build package
|
4
|
-
note right of Master: e.g. assets precompile
|
5
|
-
Master --> Storage: Upload package
|
6
|
-
|
7
|
-
== Distributing ==
|
8
|
-
Master --> Client: Download request
|
9
|
-
activate Master
|
10
|
-
Master --> Master: Wait all clients to have package to deploy
|
11
|
-
|
12
|
-
alt if doesn't have package
|
13
|
-
activate Client
|
14
|
-
Client --> Client: Set status serf tag
|
15
|
-
Client --> Storage: HTTP request
|
16
|
-
Storage --> Client: Response package
|
17
|
-
Client --> Client: Set packages serf tag
|
18
|
-
Client --> Master: Report download finish
|
19
|
-
deactivate Client
|
20
|
-
end
|
21
|
-
|
22
|
-
deactivate Master
|
23
|
-
|
24
|
-
== Preparing ==
|
25
|
-
|
26
|
-
Master --> Client: Request to prepare package
|
27
|
-
activate Master
|
28
|
-
Master --> Master: Wait all clients to have package to deploy
|
29
|
-
activate Client
|
30
|
-
Client --> Client: Set status serf tag
|
31
|
-
Client --> Client: Unpack package
|
32
|
-
Client --> Client: Run prepare phase
|
33
|
-
note left of Client: e.g. bundle install, config files
|
34
|
-
Client --> Client: Set prepared serf tag
|
35
|
-
Client --> Client: Set status serf tag
|
36
|
-
Client --> Master: Report preparation finish
|
37
|
-
deactivate Client
|
38
|
-
deactivate Master
|
39
|
-
|
40
|
-
== Finalize ==
|
41
|
-
|
42
|
-
Master --> Client: Request finalize
|
43
|
-
activate Master
|
44
|
-
Master --> Master: Wait all clients restarted
|
45
|
-
activate Client
|
46
|
-
Client --> Client: Set status serf tag
|
47
|
-
Client --> Client: Run finalize phase
|
48
|
-
note left of Client: e.g. restart web server
|
49
|
-
Client --> Master: Report finalize complete
|
50
|
-
Client --> Client: Set status serf tag
|
51
|
-
Client --> Client: Wait to be reloaded
|
52
|
-
Client --> Client: Set status serf tag
|
53
|
-
Client --> Client: Set deployed serf tag
|
54
|
-
Client --> Master: Report deploy complete
|
55
|
-
deactivate Client
|
56
|
-
deactivate Master
|
57
|
-
|
58
|
-
@enduml
|