jets_gem_layer 1.0.0 → 1.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2ffa9ee29edcc0f6fbf65c9ed6d08d78dc4f2dc643e07e4a048de79755dd99f2
4
- data.tar.gz: 6840363fc62be04e9bb9eef361bcc9b0e5449f2d9e549028d6844539ea4b2da1
3
+ metadata.gz: 92ac2b1c7617c7a72a43baa82194bc05193d65d3bcd7cbceebf7609bec9b463d
4
+ data.tar.gz: 798fd9fe29457d71874ac3a3821383b286122ae29e0bb67a18501a847e0a05a7
5
5
  SHA512:
6
- metadata.gz: 0250221f208eebf1890cf773cda696448e4f2b2bc31101bc8ab35dd47a2111a0fb8057e9f123e2dbdaed59acfb468c82c0a2f10aa654e2a4dd01f66097c7f37f
7
- data.tar.gz: 03bd04e7b73924eeb858bc26822482887303b8402b85033768c37995777428d8bf498c5fd5110626a66016cf30c05c3d344e3f1e1c248a3e9b1338a1bffe7b81
6
+ metadata.gz: 4820f54954f93a71919c7fdb75625539c76ecae6938b2af2e926c179fb6350979ab153891c62c4f7a828cd2dc2a49d51c86aaaa610274484f433f90cf06ecd04
7
+ data.tar.gz: 5d09bad45ce5cc6d4e7714ce7bae33e12e3ab0ff97b53ba127e69188585152c0cad49c5eda2604eaad6b25bb0b5f9a25b009e9c9cbd5f482d46582cbb5af0ae1
data/.gitignore CHANGED
@@ -13,3 +13,4 @@
13
13
 
14
14
  /.idea/
15
15
  tags
16
+ .DS_Store
data/.rubocop.yml CHANGED
@@ -1,3 +1,39 @@
1
+ require: rubocop-rspec
1
2
  inherit_from: .rubocop_todo.yml
2
3
  AllCops:
3
- NewCops: enable
4
+ NewCops: enable
5
+
6
+ RSpec/MultipleExpectations:
7
+ Enabled: false
8
+
9
+ RSpec/NestedGroups:
10
+ Max: 4
11
+
12
+ Lint/MixedRegexpCaptureTypes:
13
+ Exclude:
14
+ - 'lib/jets_gem_layer/build_env/build_layer.rb'
15
+
16
+ Metrics/AbcSize:
17
+ Exclude:
18
+ - 'lib/jets_gem_layer/build_env/build_layer.rb'
19
+
20
+ Metrics/CyclomaticComplexity:
21
+ Exclude:
22
+ - 'lib/jets_gem_layer/build_env/build_layer.rb'
23
+
24
+ Metrics/MethodLength:
25
+ Exclude:
26
+ - 'lib/jets_gem_layer/build_env/build_layer.rb'
27
+
28
+ Metrics/PerceivedComplexity:
29
+ Exclude:
30
+ - 'lib/jets_gem_layer/build_env/build_layer.rb'
31
+
32
+ Metrics/ClassLength:
33
+ Enabled: false
34
+
35
+ RSpec/ExampleLength:
36
+ Max: 10
37
+
38
+ RSpec/MultipleMemoizedHelpers:
39
+ Max: 10
data/.rubocop_todo.yml CHANGED
@@ -6,31 +6,3 @@
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
- # Offense count: 1
10
- Lint/MixedRegexpCaptureTypes:
11
- Exclude:
12
- - 'lib/jets_gem_layer/build_env/build_layer.rb'
13
-
14
- Metrics/AbcSize:
15
- Exclude:
16
- - 'lib/jets_gem_layer/build_env/build_layer.rb'
17
-
18
- Metrics/CyclomaticComplexity:
19
- Exclude:
20
- - 'lib/jets_gem_layer/build_env/build_layer.rb'
21
-
22
- Metrics/MethodLength:
23
- Exclude:
24
- - 'lib/jets_gem_layer/build_env/build_layer.rb'
25
-
26
- Metrics/PerceivedComplexity:
27
- Exclude:
28
- - 'lib/jets_gem_layer/build_env/build_layer.rb'
29
-
30
- # Offense count: 2
31
- # Configuration parameters: AllowedConstants.
32
- Style/Documentation:
33
- Enabled: false
34
-
35
- Metrics/ClassLength:
36
- Enabled: false
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-3.2.2
data/Gemfile CHANGED
@@ -2,11 +2,14 @@
2
2
 
3
3
  source 'https://rubygems.org'
4
4
 
5
- # Specify your gem's dependencies in s3_gem_host.gemspec
6
- gemspec
5
+ gem 'jets', '~> 5.0'
6
+ gem 'rake'
7
7
 
8
8
  group :development, :test do
9
+ gem 'mysql2', require: false # only included to test building a layer with a named dependency (mysql-devel)
9
10
  gem 'rspec'
10
11
  gem 'rubocop', require: false
11
12
  gem 'rubocop-rspec', require: false
13
+ gem 'rubyzip'
14
+ gem 'simplecov', require: false
12
15
  end
data/Gemfile.lock CHANGED
@@ -1,10 +1,3 @@
1
- PATH
2
- remote: .
3
- specs:
4
- jets_gem_layer (0.1)
5
- jets (~> 5.0)
6
- rake
7
-
8
1
  GEM
9
2
  remote: https://rubygems.org/
10
3
  specs:
@@ -61,7 +54,7 @@ GEM
61
54
  rainbow
62
55
  thor
63
56
  zeitwerk
64
- aws-partitions (1.875.0)
57
+ aws-partitions (1.877.0)
65
58
  aws-sdk-apigateway (1.90.0)
66
59
  aws-sdk-core (~> 3, >= 3.188.0)
67
60
  aws-sigv4 (~> 1.1)
@@ -120,6 +113,7 @@ GEM
120
113
  crass (1.0.6)
121
114
  date (3.3.4)
122
115
  diff-lcs (1.5.0)
116
+ docile (1.4.0)
123
117
  dotenv (2.8.1)
124
118
  dsl_evaluator (0.3.1)
125
119
  activesupport
@@ -197,6 +191,7 @@ GEM
197
191
  method_source (1.0.0)
198
192
  mini_mime (1.1.5)
199
193
  minitest (5.20.0)
194
+ mysql2 (0.5.5)
200
195
  net-imap (0.4.9)
201
196
  date
202
197
  net-protocol
@@ -261,15 +256,22 @@ GEM
261
256
  unicode-display_width (>= 2.4.0, < 3.0)
262
257
  rubocop-ast (1.30.0)
263
258
  parser (>= 3.2.1.0)
264
- rubocop-capybara (2.19.0)
259
+ rubocop-capybara (2.20.0)
265
260
  rubocop (~> 1.41)
266
- rubocop-factory_bot (2.24.0)
261
+ rubocop-factory_bot (2.25.0)
267
262
  rubocop (~> 1.33)
268
- rubocop-rspec (2.25.0)
263
+ rubocop-rspec (2.26.0)
269
264
  rubocop (~> 1.40)
270
265
  rubocop-capybara (~> 2.17)
271
266
  rubocop-factory_bot (~> 2.22)
272
267
  ruby-progressbar (1.13.0)
268
+ rubyzip (2.3.2)
269
+ simplecov (0.22.0)
270
+ docile (~> 1.1)
271
+ simplecov-html (~> 0.11)
272
+ simplecov_json_formatter (~> 0.1)
273
+ simplecov-html (0.12.3)
274
+ simplecov_json_formatter (0.1.4)
273
275
  text-table (1.2.4)
274
276
  thor (1.3.0)
275
277
  timeout (0.4.1)
@@ -282,10 +284,14 @@ PLATFORMS
282
284
  arm64-darwin-23
283
285
 
284
286
  DEPENDENCIES
285
- jets_gem_layer!
287
+ jets (~> 5.0)
288
+ mysql2
289
+ rake
286
290
  rspec
287
291
  rubocop
288
292
  rubocop-rspec
293
+ rubyzip
294
+ simplecov
289
295
 
290
296
  BUNDLED WITH
291
297
  2.5.3
data/README.md CHANGED
@@ -55,12 +55,12 @@ JetsGemLayer.load_tasks
55
55
  3. After running `bundle install`, run `rake -T` and you should see this Gem's tasks available for use.
56
56
  ```
57
57
  ➜ rake -T
58
- rake gem_layer:build_and_publish # Build, publish, and clean (will be a no-op if already published)
59
- rake gem_layer:build # Build the gem layer zip file
60
- rake gem_layer:publish # Publish the built gem laye zip to AWS
61
- rake gem_layer:clean # Clean up the gem's tmp files
62
- rake gem_layer:cleanup_published # Deletes all prior versions of the lamda layer from AWS
63
- rake gem_layer:delete_all_published # Deletes all versions of the lamda layer from AWS
58
+ rake gem_layer:build_and_publish # Build and publish a gem layer version, if necessary
59
+ rake gem_layer:build # Build a gem layer zip file
60
+ rake gem_layer:publish # Publish the already built layer zip file
61
+ rake gem_layer:clean # Clean jets_gem_layer tmp files
62
+ rake gem_layer:cleanup_published # Delete old layer versions from AWS (for use after deployment)
63
+ rake gem_layer:delete_all_published # Delete all published versions of the gem layer from AWS
64
64
  ```
65
65
 
66
66
  ## Configuration
@@ -75,11 +75,11 @@ Dependencies will be installed within the build container and copied into the pu
75
75
 
76
76
  ## Deployment
77
77
  Within your project directory (example for development environment) or through your CI/CD platform:
78
- 1. `JETS_ENV=development JETS_AGREE=no rake gem_layer:build_and_publish`
78
+ 1. `JETS_ENV=development rake gem_layer:build_and_publish`
79
79
  * If needed, builds and publishes a new gem layer version based on the current Jets namespace, Gemfile.lock and Gemfile
80
80
  2. `JETS_ENV=development JETS_AGREE=no jets deploy`
81
81
  * Deploy your application
82
- 3. `JETS_ENV=development JETS_AGREE=no rake gem_layer:cleanup_published`
82
+ 3. `JETS_ENV=development rake gem_layer:cleanup_published`
83
83
  * After a successful deploy, you may run this to cleanup the old gem layer version(s) no longer in use
84
84
 
85
85
  ## Acknowledgements
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rspec/core/rake_task'
4
+ require 'bundler/gem_tasks'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec
@@ -6,6 +6,8 @@ require 'English'
6
6
  require 'open3'
7
7
  require 'fileutils'
8
8
 
9
+ # This script runs in the public.ecr.aws/sam/build-ruby docker container
10
+ # to build native gems and libs which end up in the layer zip file
9
11
  def main
10
12
  warn('Installing yum package manager...')
11
13
  unless system('yum', 'install', '-y', 'yum-utils')
@@ -1,23 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JetsGemLayer
4
+ # All methods that run in the app environment, including rake tasks
4
5
  class TaskHelper
5
6
  include Rake::DSL
6
7
  include Jets::AwsServices
7
8
 
8
9
  # Files used to generate the gem layer
9
10
  INPUT_FILES = Rake::FileList.new(
10
- ['Gemfile', 'Gemfile.lock'].collect { |f| File.join(Jets.root, f) }
11
+ %w[Gemfile Gemfile.lock].map { |f| File.join(Jets.root, f) }
11
12
  )
12
- LOCAL_TMP_DIR = 'tmp/jets_gem_layer'
13
- OUTPUT_DIR = File.expand_path(File.join(Jets.root, "#{LOCAL_TMP_DIR}/"))
13
+ OUTPUT_DIR = File.expand_path(File.join(Jets.root, 'tmp/jets_gem_layer/'))
14
+
15
+ def self.instance
16
+ @instance ||= new
17
+ end
14
18
 
15
19
  def self.install
16
- new.install
20
+ return if @installed
21
+
22
+ instance.install
23
+ @installed = true
17
24
  end
18
25
 
19
26
  def self.arn
20
- @arn ||= new.arn
27
+ instance.arn
21
28
  end
22
29
 
23
30
  def arn
@@ -34,13 +41,14 @@ module JetsGemLayer
34
41
 
35
42
  def install
36
43
  namespace :gem_layer do
37
- install_build_and_publish
44
+ install_clean
38
45
  install_build
39
46
  install_publish
40
- install_clean
47
+ install_build_and_publish
41
48
  install_cleanup_published
42
49
  install_delete_all_published
43
50
  end
51
+ true
44
52
  end
45
53
 
46
54
  def install_build_and_publish
@@ -48,18 +56,16 @@ module JetsGemLayer
48
56
  task :build_and_publish do
49
57
  if published?
50
58
  puts "#{layer_name} already published for #{layer_version_description}. Not doing anything!"
51
- break
59
+ next
52
60
  end
53
61
  Rake::Task['gem_layer:build'].invoke
54
62
  Rake::Task['gem_layer:publish'].invoke
55
- Rake::Task['gem_layer:clean'].invoke
56
63
  end
57
64
  end
58
65
 
59
66
  def install_build
60
67
  desc 'Build a gem layer zip file'
61
- task :build do
62
- Rake::Task['gem_layer:clean'].invoke
68
+ task build: :clean do
63
69
  build_layer
64
70
  zip_layer
65
71
  end
@@ -75,7 +81,7 @@ module JetsGemLayer
75
81
  def install_clean
76
82
  desc 'Clean jets_gem_layer tmp files'
77
83
  task :clean do
78
- FileUtils.rm_r(working_dir) if File.exist?(working_dir)
84
+ clean_working_dir
79
85
  end
80
86
  end
81
87
 
@@ -96,18 +102,8 @@ module JetsGemLayer
96
102
  def build_layer
97
103
  FileUtils.mkdir_p(inputs_dir)
98
104
  FileUtils.cp(INPUT_FILES.existing, inputs_dir)
99
- system(*docker_run_cmd) or raise
100
- end
101
-
102
- def zip_layer
103
- pwd = Dir.pwd
104
- begin
105
- Dir.chdir(outputs_dir)
106
- system(*%W[zip -r #{File.join(working_dir, "#{layer_name}.zip")} lib ruby], out: File::NULL) or raise
107
- puts 'Layer zipped successfully!'
108
- ensure
109
- Dir.chdir(pwd)
110
- end
105
+ system(*docker_run_cmd) or raise $CHILD_STATUS.to_s
106
+ zip_layer
111
107
  end
112
108
 
113
109
  def publish_layer
@@ -119,6 +115,57 @@ module JetsGemLayer
119
115
  puts "#{layer_name} published for #{layer_version_description}!"
120
116
  end
121
117
 
118
+ def clean_working_dir
119
+ FileUtils.rm_rf(working_dir)
120
+ end
121
+
122
+ def cleanup_published
123
+ all_layer_versions.each_with_index do |layer_version, i|
124
+ next if i.zero? # skips the current version
125
+
126
+ aws_lambda.delete_layer_version(layer_name:, version_number: layer_version.version)
127
+ puts "Deleted #{layer_version.layer_version_arn}"
128
+ end
129
+ puts 'Deleted all prior versions!'
130
+ end
131
+
132
+ def delete_all_published
133
+ all_layer_versions.each do |layer_version|
134
+ aws_lambda.delete_layer_version(layer_name:, version_number: layer_version.version)
135
+ puts "Deleted #{layer_version.layer_version_arn}"
136
+ end
137
+ puts 'Deleted all published versions!'
138
+ end
139
+
140
+ # paginate through all layer versions to get them all (but it's unlikely there will be more than 1 page)
141
+ def all_layer_versions
142
+ all_versions = []
143
+ marker = nil
144
+ loop do
145
+ page = aws_lambda.list_layer_versions(layer_name:, max_items: 50, marker:)
146
+ all_versions.concat page.layer_versions
147
+ marker = page.next_marker
148
+ break if marker.nil?
149
+ end
150
+ all_versions
151
+ end
152
+
153
+ def published_layer_version
154
+ @published_layer_version ||= aws_lambda.list_layer_versions(layer_name:, max_items: 1).layer_versions.first
155
+ end
156
+
157
+ def published?
158
+ published_layer_version&.description == layer_version_description
159
+ end
160
+
161
+ def published_arn
162
+ return nil unless published?
163
+
164
+ published_layer_version.layer_version_arn
165
+ rescue StandardError
166
+ 'error-fetching-gem-layer-arn'
167
+ end
168
+
122
169
  private
123
170
 
124
171
  def input_hash
@@ -170,61 +217,24 @@ module JetsGemLayer
170
217
  -v #{outputs_dir}:/tmp/outputs
171
218
  -v #{File.expand_path("#{__dir__}/build_env")}:/var/task]
172
219
 
173
- ENV.fetch('GEM_LAYER_ENV').split(',').each { |env| cmd.push "-e#{env}" } if ENV['GEM_LAYER_ENV']
220
+ ENV.fetch('GEM_LAYER_ENV').split(',').each { |env| cmd.push "-e#{env}" } if ENV.key?('GEM_LAYER_ENV')
174
221
 
175
- if ENV['GEM_LAYER_PACKAGE_DEPENDENCIES']
222
+ if ENV.key?('GEM_LAYER_PACKAGE_DEPENDENCIES')
176
223
  cmd.push "-eGEM_LAYER_PACKAGE_DEPENDENCIES=#{ENV.fetch('GEM_LAYER_PACKAGE_DEPENDENCIES')}"
177
224
  end
178
225
 
179
226
  cmd.push(*%W[public.ecr.aws/sam/build-ruby#{docker_tag} ruby build_layer.rb])
180
227
  end
181
228
 
182
- def published_arn
183
- return nil unless published?
184
-
185
- published_layer_version.layer_version_arn
186
- rescue StandardError
187
- Jets.logger.error('Could not resolve lambda layer arn')
188
- 'error-fetching-gem-layer-arn'
189
- end
190
-
191
- def published?
192
- published_layer_version&.description == layer_version_description
193
- end
194
-
195
- def published_layer_version
196
- @published_layer_version ||= aws_lambda.list_layer_versions(layer_name:, max_items: 1).layer_versions.first
197
- end
198
-
199
- # paginate through all layer versions to get them all (but it's unlikely there will be more than 1 page)
200
- def all_layer_versions
201
- all_versions = []
202
- marker = nil
203
- loop do
204
- page = aws_lambda.list_layer_versions(layer_name:, max_items: 50, marker:)
205
- all_versions.concat page.layer_versions
206
- marker = page.next_marker
207
- break if marker.nil?
208
- end
209
- all_versions
210
- end
211
-
212
- def cleanup_published
213
- all_layer_versions.each_with_index do |layer_version, i|
214
- next if i.zero? # skips the current version
215
-
216
- aws_lambda.delete_layer_version(layer_name:, version_number: layer_version.version)
217
- puts "Deleted #{layer_version.layer_version_arn}"
218
- end
219
- puts 'Deleted all prior versions!'
220
- end
221
-
222
- def delete_all_published
223
- all_layer_versions.each do |layer_version|
224
- aws_lambda.delete_layer_version(layer_name:, version_number: layer_version.version)
225
- puts "Deleted #{layer_version.layer_version_arn}"
229
+ def zip_layer
230
+ pwd = Dir.pwd
231
+ begin
232
+ Dir.chdir(outputs_dir)
233
+ system(*%W[zip -r #{File.join(working_dir, "#{layer_name}.zip")} lib ruby], out: File::NULL) or raise
234
+ puts 'Layer zipped successfully!'
235
+ ensure
236
+ Dir.chdir(pwd)
226
237
  end
227
- puts 'Deleted all published versions!'
228
238
  end
229
239
  end
230
240
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JetsGemLayer
4
- VERSION = '1.0.0'
4
+ VERSION = '1.0.1'
5
5
  end
@@ -5,8 +5,10 @@ require 'digest'
5
5
  require 'fileutils'
6
6
  require 'rake'
7
7
 
8
+ require 'jets_gem_layer/version'
8
9
  require 'jets_gem_layer/task_helper'
9
10
 
11
+ # Base module with helper methods
10
12
  module JetsGemLayer
11
13
  def self.load_tasks
12
14
  JetsGemLayer::TaskHelper.install
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jets_gem_layer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - DocGo Engineering
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-30 00:00:00.000000000 Z
11
+ date: 2024-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jets
@@ -49,10 +49,12 @@ files:
49
49
  - ".gitignore"
50
50
  - ".rubocop.yml"
51
51
  - ".rubocop_todo.yml"
52
+ - ".ruby-version"
52
53
  - Gemfile
53
54
  - Gemfile.lock
54
55
  - LICENSE.txt
55
56
  - README.md
57
+ - Rakefile
56
58
  - jets_gem_layer.gemspec
57
59
  - lib/jets_gem_layer.rb
58
60
  - lib/jets_gem_layer/build_env/build_layer.rb