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.
@@ -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,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ # add the build->push process onto the end of the deploy:published stack
4
+ after 'deploy:published', 'docker:swarm:capdeploy_hook'
@@ -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
@@ -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: []