shipitron 1.1.0 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +1 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +1 -0
  5. data/Dockerfile +28 -5
  6. data/Dockerfile.release +28 -5
  7. data/Gemfile +1 -0
  8. data/README.md +48 -9
  9. data/build_dev.sh +1 -1
  10. data/docker-compose.yml +24 -0
  11. data/lib/shipitron/cli.rb +10 -4
  12. data/lib/shipitron/client.rb +9 -0
  13. data/lib/shipitron/client/bootstrap_application.rb +1 -0
  14. data/lib/shipitron/client/create_ecs_services.rb +7 -7
  15. data/lib/shipitron/client/deploy_application.rb +1 -0
  16. data/lib/shipitron/client/ensure_deploy_not_running.rb +2 -1
  17. data/lib/shipitron/client/fetch_clusters.rb +1 -0
  18. data/lib/shipitron/client/force_deploy.rb +1 -0
  19. data/lib/shipitron/client/load_application_config.rb +4 -0
  20. data/lib/shipitron/client/load_templates.rb +1 -0
  21. data/lib/shipitron/client/register_ecs_task_definitions.rb +5 -5
  22. data/lib/shipitron/client/run_ecs_tasks.rb +14 -1
  23. data/lib/shipitron/docker_image.rb +4 -1
  24. data/lib/shipitron/find_docker_volume_name.rb +68 -0
  25. data/lib/shipitron/git_info.rb +57 -0
  26. data/lib/shipitron/mustache_yaml_parser.rb +12 -8
  27. data/lib/shipitron/s3_copy.rb +46 -0
  28. data/lib/shipitron/server/deploy_application.rb +3 -0
  29. data/lib/shipitron/server/docker/build_image.rb +4 -1
  30. data/lib/shipitron/server/docker/configure.rb +46 -10
  31. data/lib/shipitron/server/docker/push_image.rb +3 -0
  32. data/lib/shipitron/server/docker/run_build_script.rb +17 -10
  33. data/lib/shipitron/server/download_build_cache.rb +17 -4
  34. data/lib/shipitron/server/git/clone_local_copy.rb +3 -4
  35. data/lib/shipitron/server/git/update_cache.rb +1 -0
  36. data/lib/shipitron/server/run_post_build.rb +40 -1
  37. data/lib/shipitron/server/transform_cli_args.rb +6 -0
  38. data/lib/shipitron/server/update_ecs_task_definitions.rb +2 -1
  39. data/lib/shipitron/server/upload_build_cache.rb +14 -8
  40. data/lib/shipitron/version.rb +1 -1
  41. data/scripts/docker-entrypoint.sh +9 -0
  42. data/shipitron.gemspec +8 -6
  43. metadata +53 -20
@@ -1,5 +1,6 @@
1
1
  require 'shipitron'
2
2
  require 'shipitron/fetch_bucket'
3
+ require 'shipitron/s3_copy'
3
4
 
4
5
  module Shipitron
5
6
  module Server
@@ -8,20 +9,28 @@ module Shipitron
8
9
 
9
10
  required :application
10
11
  required :s3_cache_bucket
12
+ required :build_cache_location
13
+ required :region
11
14
 
12
15
  def call
13
16
  Logger.info "Downloading build cache from bucket #{s3_cache_bucket}"
14
17
 
15
- s3_file = bucket.files.get("#{application}.build-cache.tar.gz")
18
+ s3_file = bucket.files.head("#{application}.build-cache.archive")
16
19
  if s3_file.nil?
17
20
  Logger.warn 'Build cache not found.'
18
21
  return
19
22
  end
20
23
 
21
- build_cache = Pathname.new("/home/shipitron/#{application}/tmp/build-cache.tar.gz")
24
+ build_cache = Pathname.new("/home/shipitron/#{application}/#{build_cache_location}")
22
25
  build_cache.parent.mkpath
23
- build_cache.open('wb') do |local_file|
24
- local_file.write(s3_file.body)
26
+
27
+ result = S3Copy.call(
28
+ source: "s3://#{s3_cache_bucket}/#{application}.build-cache.archive",
29
+ destination: build_cache.to_s,
30
+ region: context.region
31
+ )
32
+ if result.failure?
33
+ fail_with_error!(message: 'Failed to download build cache!')
25
34
  end
26
35
 
27
36
  Logger.info 'Download complete.'
@@ -36,6 +45,10 @@ module Shipitron
36
45
  context.s3_cache_bucket
37
46
  end
38
47
 
48
+ def build_cache_location
49
+ context.build_cache_location
50
+ end
51
+
39
52
  def bucket
40
53
  @bucket ||= FetchBucket.call!(name: s3_cache_bucket).bucket
41
54
  end
@@ -1,5 +1,6 @@
1
1
  require 'shipitron'
2
2
  require 'shellwords'
3
+ require 'shipitron/git_info'
3
4
 
4
5
  module Shipitron
5
6
  module Server
@@ -22,10 +23,8 @@ module Shipitron
22
23
  end
23
24
 
24
25
  Logger.info 'Using this git commit:'
25
- FileUtils.cd("/home/shipitron/#{application}") do
26
- context.git_sha = `git rev-parse --short=12 HEAD`.chomp
27
- Logger.info `git --no-pager log --format='%aN (%h): %s' -n 1`.chomp
28
- end
26
+ context.git_info = GitInfo.from_path(path: "/home/shipitron/#{application}")
27
+ Logger.info context.git_info.one_liner
29
28
  end
30
29
 
31
30
  private
@@ -25,6 +25,7 @@ module Shipitron
25
25
  else
26
26
  Logger.info 'Fetching new git commits'
27
27
  FileUtils.cd('/home/shipitron/git-cache') do
28
+ `git gc --auto`
28
29
  `git fetch -f #{Shellwords.escape repository_url} #{Shellwords.escape repository_branch}:#{Shellwords.escape repository_branch}`
29
30
  end
30
31
  end
@@ -9,6 +9,7 @@ module Shipitron
9
9
 
10
10
  required :region
11
11
  required :clusters
12
+ required :git_info
12
13
  optional :post_builds
13
14
 
14
15
  def call
@@ -26,7 +27,41 @@ module Shipitron
26
27
  container_overrides: [
27
28
  {
28
29
  name: post_build.container_name,
29
- command: post_build.command_ary
30
+ command: post_build.command_ary,
31
+ environment: [
32
+ {
33
+ name: "GIT_SHA",
34
+ value: git_info.sha
35
+ },
36
+ {
37
+ name: "GIT_SHORT_SHA",
38
+ value: git_info.short_sha
39
+ },
40
+ {
41
+ name: "GIT_EMAIL",
42
+ value: git_info.email
43
+ },
44
+ {
45
+ name: "GIT_NAME",
46
+ value: git_info.name
47
+ },
48
+ {
49
+ name: "GIT_MESSAGE",
50
+ value: git_info.summary
51
+ },
52
+ {
53
+ name: "GIT_TIMESTAMP",
54
+ value: git_info.timestamp
55
+ },
56
+ {
57
+ name: "GIT_BRANCH",
58
+ value: git_info.branch
59
+ },
60
+ {
61
+ name: "GIT_TAG",
62
+ value: git_info.tag
63
+ }
64
+ ]
30
65
  }
31
66
  ]
32
67
  },
@@ -75,6 +110,10 @@ module Shipitron
75
110
  def clusters
76
111
  context.clusters
77
112
  end
113
+
114
+ def git_info
115
+ context.git_info
116
+ end
78
117
  end
79
118
  end
80
119
  end
@@ -12,7 +12,9 @@ module Shipitron
12
12
  required :application
13
13
  required :repository_url
14
14
  optional :repository_branch
15
+ optional :registry
15
16
  required :s3_cache_bucket
17
+ required :build_cache_location
16
18
  required :image_name
17
19
  required :named_tag
18
20
  required :region
@@ -22,6 +24,7 @@ module Shipitron
22
24
  optional :ecs_services
23
25
  optional :ecs_service_templates
24
26
  optional :build_script
27
+ optional :skip_push, default: false
25
28
  optional :post_builds
26
29
 
27
30
  before do
@@ -36,12 +39,15 @@ module Shipitron
36
39
  application
37
40
  repository_url
38
41
  repository_branch
42
+ registry
39
43
  s3_cache_bucket
44
+ build_cache_location
40
45
  named_tag
41
46
  region
42
47
  clusters
43
48
  ecs_services
44
49
  build_script
50
+ skip_push
45
51
  ].each_with_object(cli_args) { |k, args| args[k] = context[k] }
46
52
 
47
53
  cli_args.docker_image = DockerImage.new(name: context.image_name)
@@ -14,11 +14,12 @@ module Shipitron
14
14
  required :docker_image
15
15
  required :ecs_task_defs
16
16
  optional :ecs_task_def_templates
17
+ optional :registry
17
18
 
18
19
  before do
19
20
  context.ecs_task_def_templates ||= []
20
21
  context.templates = context.ecs_task_def_templates
21
- context.template_context = { tag: docker_image.tag }
22
+ context.template_context = { tag: docker_image.tag, registry: context.registry }
22
23
  end
23
24
 
24
25
  organize [
@@ -8,21 +8,27 @@ module Shipitron
8
8
 
9
9
  required :application
10
10
  required :s3_cache_bucket
11
+ required :build_cache_location
12
+ required :region
11
13
 
12
14
  def call
13
15
  Logger.info "Uploading build cache to bucket #{s3_cache_bucket}"
14
16
 
15
- build_cache = Pathname.new("/home/shipitron/#{application}/tmp/build-cache.tar.gz")
17
+ build_cache = Pathname.new("/home/shipitron/#{application}/#{build_cache_location}")
16
18
  unless build_cache.exist?
17
19
  Logger.warn 'Build cache not found.'
18
20
  return
19
21
  end
20
22
 
21
- build_cache.open('rb') do |local_file|
22
- bucket.files.create(
23
- key: "#{application}.build-cache.tar.gz",
24
- body: local_file.read
25
- )
23
+ result = S3Copy.call(
24
+ source: build_cache.to_s,
25
+ destination: "s3://#{s3_cache_bucket}/#{application}.build-cache.archive",
26
+ region: context.region
27
+ )
28
+ if result.failure?
29
+ Logger.warn 'Failed to upload build cache!'
30
+ else
31
+ Logger.info 'Upload complete.'
26
32
  end
27
33
  end
28
34
 
@@ -35,8 +41,8 @@ module Shipitron
35
41
  context.s3_cache_bucket
36
42
  end
37
43
 
38
- def bucket
39
- @bucket ||= FetchBucket.call!(name: s3_cache_bucket).bucket
44
+ def build_cache_location
45
+ context.build_cache_location
40
46
  end
41
47
  end
42
48
  end
@@ -1,3 +1,3 @@
1
1
  module Shipitron
2
- VERSION = '1.1.0'
2
+ VERSION = '1.3.2'
3
3
  end
@@ -1,6 +1,15 @@
1
1
  #!/bin/sh
2
2
  set -e
3
3
 
4
+ chown_dir() {
5
+ dir=$1
6
+ if [ "$(stat -c %u ${dir})" = '0' ]; then
7
+ chown -R shipitron:shipitron $dir
8
+ fi
9
+ }
10
+
11
+ chown_dir /home/shipitron
12
+
4
13
  if [ -n "$USE_BUNDLE_EXEC" ]; then
5
14
  BINARY="bundle exec shipitron"
6
15
  else
data/shipitron.gemspec CHANGED
@@ -17,21 +17,23 @@ Gem::Specification.new do |spec|
17
17
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.add_runtime_dependency 'thor', '~> 0.20'
20
+ spec.add_runtime_dependency 'thor', '~> 1.0'
21
21
  spec.add_runtime_dependency 'aws-sdk-ecs', '~> 1.8'
22
- spec.add_runtime_dependency 'hashie', '~> 3.5'
23
- spec.add_runtime_dependency 'metaractor', '~> 0.5'
22
+ spec.add_runtime_dependency 'hashie', '~> 4.1'
23
+ spec.add_runtime_dependency 'metaractor', '~> 3.0'
24
24
  spec.add_runtime_dependency 'diplomat', '~> 2.0'
25
- spec.add_runtime_dependency 'fog-aws', '~> 2.0'
25
+ spec.add_runtime_dependency 'fog-aws', '~> 3.6'
26
26
  spec.add_runtime_dependency 'mime-types', '~> 3.1'
27
27
  spec.add_runtime_dependency 'minitar', '~> 0.6'
28
28
  spec.add_runtime_dependency 'mustache', '~> 1.0'
29
29
  spec.add_runtime_dependency 'tty-command', '~> 0.7'
30
30
  spec.add_runtime_dependency 'tty-table', '~> 0.9'
31
31
  spec.add_runtime_dependency 'pastel', '~> 0.7'
32
+ spec.add_runtime_dependency 'excon', '~> 0.76'
33
+ spec.add_runtime_dependency 'rugged', '~> 1.0'
32
34
 
33
- spec.add_development_dependency "bundler", "~> 1.16"
34
- spec.add_development_dependency "rake", "~> 12.3"
35
+ spec.add_development_dependency "bundler", "~> 2.1"
36
+ spec.add_development_dependency "rake", "~> 13.0"
35
37
  spec.add_development_dependency "pry-byebug", "~> 3.5"
36
38
  spec.add_development_dependency "rspec", "~> 3.7"
37
39
  spec.add_development_dependency "fivemat", "~> 1.3"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shipitron
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Schlesinger
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-07-03 00:00:00.000000000 Z
11
+ date: 2021-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.20'
19
+ version: '1.0'
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.20'
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: aws-sdk-ecs
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,28 +44,28 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.5'
47
+ version: '4.1'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.5'
54
+ version: '4.1'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: metaractor
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.5'
61
+ version: '3.0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.5'
68
+ version: '3.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: diplomat
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '2.0'
89
+ version: '3.6'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '2.0'
96
+ version: '3.6'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: mime-types
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -178,34 +178,62 @@ dependencies:
178
178
  - - "~>"
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0.7'
181
+ - !ruby/object:Gem::Dependency
182
+ name: excon
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '0.76'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '0.76'
195
+ - !ruby/object:Gem::Dependency
196
+ name: rugged
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '1.0'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '1.0'
181
209
  - !ruby/object:Gem::Dependency
182
210
  name: bundler
183
211
  requirement: !ruby/object:Gem::Requirement
184
212
  requirements:
185
213
  - - "~>"
186
214
  - !ruby/object:Gem::Version
187
- version: '1.16'
215
+ version: '2.1'
188
216
  type: :development
189
217
  prerelease: false
190
218
  version_requirements: !ruby/object:Gem::Requirement
191
219
  requirements:
192
220
  - - "~>"
193
221
  - !ruby/object:Gem::Version
194
- version: '1.16'
222
+ version: '2.1'
195
223
  - !ruby/object:Gem::Dependency
196
224
  name: rake
197
225
  requirement: !ruby/object:Gem::Requirement
198
226
  requirements:
199
227
  - - "~>"
200
228
  - !ruby/object:Gem::Version
201
- version: '12.3'
229
+ version: '13.0'
202
230
  type: :development
203
231
  prerelease: false
204
232
  version_requirements: !ruby/object:Gem::Requirement
205
233
  requirements:
206
234
  - - "~>"
207
235
  - !ruby/object:Gem::Version
208
- version: '12.3'
236
+ version: '13.0'
209
237
  - !ruby/object:Gem::Dependency
210
238
  name: pry-byebug
211
239
  requirement: !ruby/object:Gem::Requirement
@@ -262,7 +290,7 @@ dependencies:
262
290
  - - "~>"
263
291
  - !ruby/object:Gem::Version
264
292
  version: '0.4'
265
- description:
293
+ description:
266
294
  email:
267
295
  - ryan@outstand.com
268
296
  executables:
@@ -271,6 +299,7 @@ extensions: []
271
299
  extra_rdoc_files: []
272
300
  files:
273
301
  - ".dockerignore"
302
+ - ".gitattributes"
274
303
  - ".gitignore"
275
304
  - ".rspec"
276
305
  - Dockerfile
@@ -280,9 +309,11 @@ files:
280
309
  - README.md
281
310
  - Rakefile
282
311
  - build_dev.sh
312
+ - docker-compose.yml
283
313
  - exe/shipitron
284
314
  - lib/shipitron.rb
285
315
  - lib/shipitron/cli.rb
316
+ - lib/shipitron/client.rb
286
317
  - lib/shipitron/client/bootstrap_application.rb
287
318
  - lib/shipitron/client/create_ecs_services.rb
288
319
  - lib/shipitron/client/deploy_application.rb
@@ -299,10 +330,13 @@ files:
299
330
  - lib/shipitron/ecs_client.rb
300
331
  - lib/shipitron/ecs_task_def.rb
301
332
  - lib/shipitron/fetch_bucket.rb
333
+ - lib/shipitron/find_docker_volume_name.rb
334
+ - lib/shipitron/git_info.rb
302
335
  - lib/shipitron/logger.rb
303
336
  - lib/shipitron/mustache_yaml_parser.rb
304
337
  - lib/shipitron/parse_templates.rb
305
338
  - lib/shipitron/post_build.rb
339
+ - lib/shipitron/s3_copy.rb
306
340
  - lib/shipitron/server/deploy_application.rb
307
341
  - lib/shipitron/server/docker/build_image.rb
308
342
  - lib/shipitron/server/docker/configure.rb
@@ -331,7 +365,7 @@ files:
331
365
  homepage: https://github.com/outstand/shipitron
332
366
  licenses: []
333
367
  metadata: {}
334
- post_install_message:
368
+ post_install_message:
335
369
  rdoc_options: []
336
370
  require_paths:
337
371
  - lib
@@ -346,9 +380,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
346
380
  - !ruby/object:Gem::Version
347
381
  version: '0'
348
382
  requirements: []
349
- rubyforge_project:
350
- rubygems_version: 2.7.6
351
- signing_key:
383
+ rubygems_version: 3.1.4
384
+ signing_key:
352
385
  specification_version: 4
353
386
  summary: A deployment tool for use with Docker and ECS.
354
387
  test_files: []