capistrano_dockerbuild 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.rubocop.yml +56 -0
- data/Gemfile +11 -0
- data/LICENSE.txt +21 -0
- data/README-deploy-compose.md +45 -0
- data/README-deploy-swarm.md +30 -0
- data/README.md +122 -0
- data/Rakefile +8 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/capistrano-docker-build.gemspec +39 -0
- data/examples/.keep +0 -0
- data/lib/capistrano/dockerbuild/hooks.rb +3 -0
- data/lib/capistrano/dockerbuild/tasks.rb +3 -0
- data/lib/capistrano/dockerbuild.rb +8 -0
- data/lib/capistrano/dockercompose/hooks.rb +3 -0
- data/lib/capistrano/dockercompose/tasks.rb +3 -0
- data/lib/capistrano/dockercompose.rb +5 -0
- data/lib/capistrano/dockerswarm/hooks.rb +3 -0
- data/lib/capistrano/dockerswarm/tasks.rb +3 -0
- data/lib/capistrano/dockerswarm.rb +5 -0
- data/lib/capistrano/dsl/paths.rb +21 -0
- data/lib/capistrano/tasks/dockerbuild.rake +257 -0
- data/lib/capistrano/tasks/dockerbuild_hooks.rake +7 -0
- data/lib/capistrano/tasks/dockercompose.rake +278 -0
- data/lib/capistrano/tasks/dockercompose_hooks.rake +4 -0
- data/lib/capistrano/tasks/dockerswarm.rake +268 -0
- data/lib/capistrano/tasks/dockerswarm_hooks.rake +4 -0
- data/lib/capistrano-dockerbuild.rb +1 -0
- data/spec/capistrano/docker/build_spec.rb +13 -0
- data/spec/spec_helper.rb +13 -0
- metadata +121 -0
@@ -0,0 +1,268 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'byebug'
|
4
|
+
require 'tempfile'
|
5
|
+
|
6
|
+
namespace :docker do
|
7
|
+
namespace :swarm do
|
8
|
+
|
9
|
+
def docker_cmd
|
10
|
+
fetch(:docker_swarm_docker_cmd) { fetch(:docker_cmd, 'docker') }
|
11
|
+
end
|
12
|
+
|
13
|
+
def docker_stack_name
|
14
|
+
(fetch(:docker_stack_name) { fetch(:application) }) || raise('unable to discern docker_stack_name name; specify :application or :docker_stack_name')
|
15
|
+
end
|
16
|
+
|
17
|
+
def docker_stack_deploy_opts
|
18
|
+
fetch(:docker_stack_deploy_opts, '--prune')
|
19
|
+
end
|
20
|
+
|
21
|
+
# Relative path to the docker-compose.yml for deployments
|
22
|
+
def docker_compose_file
|
23
|
+
fetch(:docker_compose_file, 'docker-compose.yml')
|
24
|
+
end
|
25
|
+
|
26
|
+
# Path for docker-compose remote deployments
|
27
|
+
def docker_compose_path
|
28
|
+
fetch(:docker_compose_path) { build_path }
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
task :check_docker_swarm_root do
|
33
|
+
on roles(:docker_swarm) do |remote|
|
34
|
+
# info "ON HOST #{remote}"
|
35
|
+
# info "checking docker_compose_path: #{docker_compose_path}"
|
36
|
+
# should really fix this to preserve typical capistrano dir-tree, but meh for now...
|
37
|
+
unless test("[ -d #{docker_compose_path} ]")
|
38
|
+
warn "docker_compose_path does not exist on host (#{remote}): #{docker_compose_path}"
|
39
|
+
warn "creating docker_compose_path on host (#{remote}): #{docker_compose_path}"
|
40
|
+
warn 'this can break future `cap stage deploy` execution on build hosts'
|
41
|
+
execute :mkdir, '-p', docker_compose_path
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
task :local_source_warning do
|
47
|
+
run_locally do
|
48
|
+
warn 'Using docker-compose files directly from local workspace... (typically undesirable)'
|
49
|
+
warn '>> assign :docker_build role to enable remote builds'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
desc 'copies a new docker_compose_file from the docker_build role to each docker_compose role'
|
55
|
+
task :upload do
|
56
|
+
if roles(:docker_swarm).empty?
|
57
|
+
invoke 'docker:swarm:upload_local'
|
58
|
+
else
|
59
|
+
invoke 'docker:swarm:upload_remote'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# copies a new docker-compose.yml file up to each docker_swarm host
|
64
|
+
task :upload_local do
|
65
|
+
run_locally do
|
66
|
+
info 'Nothing to do here, docker swarm will run locally...'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# copies a new docker-compose.yml file up to each docker_swarm host
|
71
|
+
task :upload_remote => :check_docker_swarm_root do
|
72
|
+
run_locally do
|
73
|
+
info 'Copying docker_compose_file to docker_swarm hosts...'
|
74
|
+
end
|
75
|
+
tmp_file = Tempfile.new('upload_remote')
|
76
|
+
tmp_file_path = tmp_file.path
|
77
|
+
tmp_file.close(false)
|
78
|
+
begin
|
79
|
+
docker_build_role = roles(:docker_build).first
|
80
|
+
upload_roles = roles(:docker_swarm) - [docker_build_role]
|
81
|
+
unless upload_roles.empty?
|
82
|
+
if docker_build_role
|
83
|
+
on docker_build_role do |build_remote|
|
84
|
+
info "fetching #{build_remote}:#{docker_compose_path.join(docker_compose_file)}"
|
85
|
+
download! docker_compose_path.join(docker_compose_file), tmp_file_path
|
86
|
+
end
|
87
|
+
else
|
88
|
+
invoke 'docker:swarm:local_source_warning'
|
89
|
+
run_locally do
|
90
|
+
warn "fetching #{docker_compose_file}"
|
91
|
+
download! docker_compose_file, tmp_file_path
|
92
|
+
end
|
93
|
+
end
|
94
|
+
on upload_roles do |upload_role|
|
95
|
+
info "uploading to #{upload_role}:#{docker_compose_path.join(docker_compose_file)}"
|
96
|
+
upload! tmp_file_path, docker_compose_path.join(docker_compose_file)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
ensure
|
100
|
+
File.unlink(tmp_file_path)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
desc 'List the tasks in the stack'
|
106
|
+
task :ps do
|
107
|
+
if roles(:docker_swarm).empty?
|
108
|
+
invoke 'docker:swarm:ps_local'
|
109
|
+
else
|
110
|
+
invoke 'docker:swarm:ps_remote'
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
task :ps_local do
|
115
|
+
current_build_dir = pwd
|
116
|
+
run_locally do
|
117
|
+
info "Current Working Directory: #{current_build_dir}"
|
118
|
+
execute docker_cmd,
|
119
|
+
:stack,
|
120
|
+
:ps,
|
121
|
+
docker_stack_name
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
task :ps_remote do
|
126
|
+
on roles(:docker_swarm) do |buildremote|
|
127
|
+
info "ON HOST #{buildremote}"
|
128
|
+
within build_path do
|
129
|
+
execute docker_cmd,
|
130
|
+
:stack,
|
131
|
+
:ps,
|
132
|
+
docker_stack_name
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
desc 'List the services in the stack'
|
139
|
+
task :status do
|
140
|
+
if roles(:docker_swarm).empty?
|
141
|
+
invoke 'docker:swarm:status_local'
|
142
|
+
else
|
143
|
+
invoke 'docker:swarm:status_remote'
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
task :status_local do
|
148
|
+
current_build_dir = pwd
|
149
|
+
run_locally do
|
150
|
+
info "Current Working Directory: #{current_build_dir}"
|
151
|
+
execute docker_cmd,
|
152
|
+
:stack,
|
153
|
+
:services,
|
154
|
+
docker_stack_name
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
task :status_remote do
|
159
|
+
on roles(:docker_swarm) do |buildremote|
|
160
|
+
info "ON HOST #{buildremote}"
|
161
|
+
within build_path do
|
162
|
+
execute docker_cmd,
|
163
|
+
:stack,
|
164
|
+
:services,
|
165
|
+
docker_stack_name
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
|
171
|
+
|
172
|
+
desc 'starts/updates services'
|
173
|
+
task :up do
|
174
|
+
if roles(:docker_swarm).empty?
|
175
|
+
invoke 'docker:swarm:up_local'
|
176
|
+
else
|
177
|
+
invoke 'docker:swarm:up_remote'
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
task :up_local do
|
182
|
+
current_build_dir = pwd
|
183
|
+
run_locally do
|
184
|
+
info "Current Working Directory: #{current_build_dir}"
|
185
|
+
execute docker_cmd,
|
186
|
+
:stack,
|
187
|
+
:deploy,
|
188
|
+
docker_stack_deploy_opts,
|
189
|
+
"--compose-file=#{docker_compose_file}",
|
190
|
+
docker_stack_name
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
task :up_remote do
|
195
|
+
on roles(:docker_swarm) do |buildremote|
|
196
|
+
info "ON HOST #{buildremote}"
|
197
|
+
within build_path do
|
198
|
+
execute docker_cmd,
|
199
|
+
:stack,
|
200
|
+
:deploy,
|
201
|
+
docker_stack_deploy_opts,
|
202
|
+
"--compose-file=#{docker_compose_file}",
|
203
|
+
docker_stack_name
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
|
209
|
+
|
210
|
+
|
211
|
+
|
212
|
+
desc 'stop and clean up all services'
|
213
|
+
task :down do
|
214
|
+
if roles(:docker_swarm).empty?
|
215
|
+
invoke 'docker:swarm:down_local'
|
216
|
+
else
|
217
|
+
invoke 'docker:swarm:down_remote'
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
task :down_local do
|
222
|
+
current_build_dir = pwd
|
223
|
+
run_locally do
|
224
|
+
info "Current Working Directory: #{current_build_dir}"
|
225
|
+
execute docker_cmd,
|
226
|
+
:stack,
|
227
|
+
:rm,
|
228
|
+
docker_stack_name
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
task :down_remote do
|
233
|
+
on roles(:docker_swarm) do |buildremote|
|
234
|
+
info "ON HOST #{buildremote}"
|
235
|
+
within build_path do
|
236
|
+
execute docker_cmd,
|
237
|
+
:stack,
|
238
|
+
:rm,
|
239
|
+
docker_stack_name
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
|
245
|
+
|
246
|
+
|
247
|
+
|
248
|
+
|
249
|
+
|
250
|
+
|
251
|
+
desc 'Update all docker_swarm roles'
|
252
|
+
task :update do
|
253
|
+
invoke 'docker:swarm:upload'
|
254
|
+
invoke 'docker:swarm:up'
|
255
|
+
end
|
256
|
+
|
257
|
+
desc '(alias for docker:swarm:update)'
|
258
|
+
task :deploy => :update
|
259
|
+
|
260
|
+
# Default `cap env deploy` flow hook
|
261
|
+
task :capdeploy_hook do
|
262
|
+
if fetch(:dockerswarm_deployhook, true)
|
263
|
+
invoke 'docker:swarm:update'
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
end # namespace :swarm do
|
268
|
+
end # namespace :docker do
|
@@ -0,0 +1 @@
|
|
1
|
+
# an empty .rb file for bundler to auto-require
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Capistrano::Docker::Build do
|
6
|
+
it 'has a version number' do
|
7
|
+
expect(Capistrano::Docker::Build::VERSION).not_to be nil
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'does something useful' do
|
11
|
+
expect(false).to eq(true)
|
12
|
+
end
|
13
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'capistrano/docker/build'
|
5
|
+
|
6
|
+
RSpec.configure do |config|
|
7
|
+
# Enable flags like --only-failures and --next-failure
|
8
|
+
config.example_status_persistence_file_path = '.rspec_status'
|
9
|
+
|
10
|
+
config.expect_with :rspec do |c|
|
11
|
+
c.syntax = :expect
|
12
|
+
end
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capistrano_dockerbuild
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Eric Shorkey
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-07-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: capistrano
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.11'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.11'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.14'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.14'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '12.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '12.0'
|
55
|
+
description: Build, push and deploy your Docker container images as part of your Capistrano
|
56
|
+
workflow. Pretty simple.
|
57
|
+
email:
|
58
|
+
- eric.shorkey@gmail.com
|
59
|
+
executables:
|
60
|
+
- console
|
61
|
+
- setup
|
62
|
+
extensions: []
|
63
|
+
extra_rdoc_files: []
|
64
|
+
files:
|
65
|
+
- ".gitignore"
|
66
|
+
- ".rspec"
|
67
|
+
- ".rubocop.yml"
|
68
|
+
- Gemfile
|
69
|
+
- LICENSE.txt
|
70
|
+
- README-deploy-compose.md
|
71
|
+
- README-deploy-swarm.md
|
72
|
+
- README.md
|
73
|
+
- Rakefile
|
74
|
+
- bin/console
|
75
|
+
- bin/setup
|
76
|
+
- capistrano-docker-build.gemspec
|
77
|
+
- examples/.keep
|
78
|
+
- lib/capistrano-dockerbuild.rb
|
79
|
+
- lib/capistrano/dockerbuild.rb
|
80
|
+
- lib/capistrano/dockerbuild/hooks.rb
|
81
|
+
- lib/capistrano/dockerbuild/tasks.rb
|
82
|
+
- lib/capistrano/dockercompose.rb
|
83
|
+
- lib/capistrano/dockercompose/hooks.rb
|
84
|
+
- lib/capistrano/dockercompose/tasks.rb
|
85
|
+
- lib/capistrano/dockerswarm.rb
|
86
|
+
- lib/capistrano/dockerswarm/hooks.rb
|
87
|
+
- lib/capistrano/dockerswarm/tasks.rb
|
88
|
+
- lib/capistrano/dsl/paths.rb
|
89
|
+
- lib/capistrano/tasks/dockerbuild.rake
|
90
|
+
- lib/capistrano/tasks/dockerbuild_hooks.rake
|
91
|
+
- lib/capistrano/tasks/dockercompose.rake
|
92
|
+
- lib/capistrano/tasks/dockercompose_hooks.rake
|
93
|
+
- lib/capistrano/tasks/dockerswarm.rake
|
94
|
+
- lib/capistrano/tasks/dockerswarm_hooks.rake
|
95
|
+
- spec/capistrano/docker/build_spec.rb
|
96
|
+
- spec/spec_helper.rb
|
97
|
+
homepage: https://github.com/eshork/capistrano_dockerbuild
|
98
|
+
licenses:
|
99
|
+
- MIT
|
100
|
+
metadata: {}
|
101
|
+
post_install_message:
|
102
|
+
rdoc_options: []
|
103
|
+
require_paths:
|
104
|
+
- lib
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
requirements: []
|
116
|
+
rubyforge_project:
|
117
|
+
rubygems_version: 2.6.8
|
118
|
+
signing_key:
|
119
|
+
specification_version: 4
|
120
|
+
summary: docker build/push plugin for Capistrano
|
121
|
+
test_files: []
|