s3arch 0.1.2 → 0.1.4
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 +4 -4
- data/README.md +19 -4
- data/lib/s3arch/version.rb +1 -1
- data/lib/tasks/s3arch.rake +179 -0
- metadata +3 -31
- checksums.yaml.gz.sig +0 -0
- data/certs/stowzilla.pem +0 -26
- data/lib/tasks/lambda_layer.rake +0 -134
- data.tar.gz.sig +0 -2
- metadata.gz.sig +0 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1e94c87e16c5a1c133e8b155aa86f7993fda2e29c1f25b1039d4344eb28c5e8f
|
|
4
|
+
data.tar.gz: fa25590c4becae78ca1a79c6a76bc5e884819c472bafcca5e996a2439d70112a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: eb5464878dad0a59d3dfc2b0f23737eb99a88fa1c15889557a3c9d41eef9686b6614d3e647ad463143bbe6f3a388b7516d67515ec7b90044b2332d634b49e6a7
|
|
7
|
+
data.tar.gz: d504be859a8a49b19be69c5fd354e9823b48bf67ce6bee7753b69e3ef6f88763323e6582ba7ed7ae227a0c6b8f20ec09903efcbac294cf7227e21fd7638030bc
|
data/README.md
CHANGED
|
@@ -145,16 +145,16 @@ S3arch requires the `sqlite3` native extension at runtime. A Rake task is includ
|
|
|
145
145
|
|
|
146
146
|
```bash
|
|
147
147
|
# Build the layer zip (outputs to pkg/sqlite-layer.zip)
|
|
148
|
-
rake
|
|
148
|
+
rake s3arch:layer:build
|
|
149
149
|
|
|
150
150
|
# Build and publish in one step
|
|
151
|
-
rake
|
|
151
|
+
rake s3arch:layer:publish PROFILE=devzilla
|
|
152
152
|
|
|
153
153
|
# Customize the build
|
|
154
|
-
rake
|
|
154
|
+
rake s3arch:layer:build RUBY_VERSION=3.4 ARCHITECTURE=x86_64
|
|
155
155
|
|
|
156
156
|
# Publish to a specific region/account
|
|
157
|
-
rake
|
|
157
|
+
rake s3arch:layer:publish PROFILE=production REGION=us-west-2 LAYER_NAME=stowzilla-sqlite3-ruby
|
|
158
158
|
```
|
|
159
159
|
|
|
160
160
|
| Environment Variable | Default | Description |
|
|
@@ -169,6 +169,21 @@ rake lambda:publish_layer PROFILE=production REGION=us-west-2 LAYER_NAME=stowzil
|
|
|
169
169
|
|
|
170
170
|
Requires Docker to be running (uses the official AWS SAM build images).
|
|
171
171
|
|
|
172
|
+
## Rake Tasks
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
rake s3arch:layer:build # Build the Lambda layer zip
|
|
176
|
+
rake s3arch:layer:publish # Build and publish to AWS
|
|
177
|
+
rake s3arch:rebuild # Rebuild index for an owner (OWNER_ID=xxx)
|
|
178
|
+
rake s3arch:info # Show config and version info
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
To make these tasks available in your app, add to your Rakefile:
|
|
182
|
+
|
|
183
|
+
```ruby
|
|
184
|
+
require 's3arch/tasks'
|
|
185
|
+
```
|
|
186
|
+
|
|
172
187
|
## Requirements
|
|
173
188
|
|
|
174
189
|
- Ruby >= 3.2
|
data/lib/s3arch/version.rb
CHANGED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../s3arch/version'
|
|
4
|
+
|
|
5
|
+
module S3archLayerBuilder
|
|
6
|
+
module_function
|
|
7
|
+
|
|
8
|
+
def build_layer(ruby_version:, architecture:, output_file:, s3arch_version:)
|
|
9
|
+
require 'tmpdir'
|
|
10
|
+
require 'fileutils'
|
|
11
|
+
|
|
12
|
+
FileUtils.mkdir_p(File.dirname(output_file))
|
|
13
|
+
|
|
14
|
+
puts "🔨 Building Lambda layer (Ruby #{ruby_version} / #{architecture}, s3arch #{s3arch_version})..."
|
|
15
|
+
|
|
16
|
+
tmpdir = Dir.mktmpdir('s3arch-layer')
|
|
17
|
+
begin
|
|
18
|
+
write_gemfile(tmpdir, s3arch_version)
|
|
19
|
+
run_docker_build(tmpdir, ruby_version, architecture)
|
|
20
|
+
strip_layer("#{tmpdir}/layer")
|
|
21
|
+
verify_layer("#{tmpdir}/layer")
|
|
22
|
+
create_zip("#{tmpdir}/layer", output_file)
|
|
23
|
+
ensure
|
|
24
|
+
system('sudo', 'rm', '-rf', tmpdir) || FileUtils.rm_rf(tmpdir)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def write_gemfile(tmpdir, s3arch_version)
|
|
29
|
+
File.write("#{tmpdir}/Gemfile", <<~GEMFILE)
|
|
30
|
+
source 'https://rubygems.org'
|
|
31
|
+
gem 's3arch', '#{s3arch_version}'
|
|
32
|
+
GEMFILE
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def run_docker_build(tmpdir, ruby_version, architecture)
|
|
36
|
+
docker_image = "public.ecr.aws/sam/build-ruby#{ruby_version}:latest-#{architecture}"
|
|
37
|
+
platform = architecture == 'x86_64' ? 'linux/amd64' : 'linux/arm64'
|
|
38
|
+
|
|
39
|
+
build_script = docker_build_script(ruby_version)
|
|
40
|
+
|
|
41
|
+
docker_cmd = [
|
|
42
|
+
'docker', 'run', '--rm',
|
|
43
|
+
'--platform', platform,
|
|
44
|
+
'-v', "#{tmpdir}:/build",
|
|
45
|
+
'-w', '/build',
|
|
46
|
+
docker_image,
|
|
47
|
+
'/bin/bash', '-c', build_script
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
puts "🐳 Building in Docker (#{docker_image})..."
|
|
51
|
+
abort '❌ Docker build failed' unless system(*docker_cmd)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def docker_build_script(ruby_version)
|
|
55
|
+
<<~BASH
|
|
56
|
+
yum install -y sqlite-devel 2>/dev/null || dnf install -y sqlite-devel 2>/dev/null
|
|
57
|
+
bundle config set --local path /build/layer/ruby/gems/#{ruby_version}.0
|
|
58
|
+
bundle config set --local without "development test"
|
|
59
|
+
bundle config set --local deployment false
|
|
60
|
+
bundle install
|
|
61
|
+
NESTED="/build/layer/ruby/gems/#{ruby_version}.0/ruby/#{ruby_version}.0"
|
|
62
|
+
if [ -d "$NESTED" ]; then
|
|
63
|
+
mkdir -p /build/layer-final/ruby/gems/#{ruby_version}.0
|
|
64
|
+
cp -a "$NESTED"/* /build/layer-final/ruby/gems/#{ruby_version}.0/
|
|
65
|
+
rm -rf /build/layer
|
|
66
|
+
mv /build/layer-final /build/layer
|
|
67
|
+
fi
|
|
68
|
+
BASH
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def strip_layer(layer_dir)
|
|
72
|
+
puts '🧹 Stripping layer...'
|
|
73
|
+
|
|
74
|
+
Dir.glob("#{layer_dir}/ruby/gems/*/gems/*/").each do |gem_dir|
|
|
75
|
+
%w[spec test tests doc docs examples benchmarks].each do |fat_dir|
|
|
76
|
+
FileUtils.rm_rf("#{gem_dir}#{fat_dir}")
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
junk_patterns = %w[
|
|
81
|
+
*.md *.rdoc *.txt *.c *.h *.o Makefile *.log
|
|
82
|
+
CHANGELOG* HISTORY* LICENSE* README* .gitignore Rakefile
|
|
83
|
+
]
|
|
84
|
+
junk_patterns.each do |pattern|
|
|
85
|
+
Dir.glob("#{layer_dir}/**/#{pattern}").each { |f| FileUtils.rm_f(f) }
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
Dir.glob("#{layer_dir}/**/*.so").each do |so|
|
|
89
|
+
system('strip', '--strip-debug', so, err: File::NULL)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def verify_layer(layer_dir)
|
|
94
|
+
sqlite_so = Dir.glob("#{layer_dir}/**/sqlite3_native.so") +
|
|
95
|
+
Dir.glob("#{layer_dir}/**/sqlite3.so")
|
|
96
|
+
abort '❌ sqlite3 native extension NOT found in layer' if sqlite_so.empty?
|
|
97
|
+
puts '✅ sqlite3 native extension included'
|
|
98
|
+
|
|
99
|
+
s3arch_lib = Dir.glob("#{layer_dir}/**/gems/s3arch-*/lib/s3arch.rb")
|
|
100
|
+
abort '❌ s3arch gem NOT found in layer' if s3arch_lib.empty?
|
|
101
|
+
puts '✅ s3arch gem included'
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def create_zip(layer_dir, output_file)
|
|
105
|
+
FileUtils.rm_f(output_file)
|
|
106
|
+
abort '❌ Failed to create zip' unless system('zip', '-qr', output_file, 'ruby/', chdir: layer_dir)
|
|
107
|
+
|
|
108
|
+
size = `du -h #{output_file}`.split("\t").first
|
|
109
|
+
puts "✅ Layer built: #{output_file} (#{size})"
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
namespace :s3arch do
|
|
114
|
+
namespace :layer do
|
|
115
|
+
desc 'Build the Lambda layer zip (defaults: RUBY_VERSION=3.4, ARCHITECTURE=x86_64)'
|
|
116
|
+
task :build do
|
|
117
|
+
ruby_version = ENV.fetch('RUBY_VERSION', '3.4')
|
|
118
|
+
architecture = ENV.fetch('ARCHITECTURE', 'x86_64')
|
|
119
|
+
output_file = File.expand_path(ENV.fetch('OUTPUT', 'pkg/sqlite-layer.zip'))
|
|
120
|
+
s3arch_version = ENV.fetch('S3ARCH_VERSION', "~> #{S3arch::VERSION.sub(/\.\d+$/, '.0')}")
|
|
121
|
+
|
|
122
|
+
S3archLayerBuilder.build_layer(
|
|
123
|
+
ruby_version: ruby_version,
|
|
124
|
+
architecture: architecture,
|
|
125
|
+
output_file: output_file,
|
|
126
|
+
s3arch_version: s3arch_version
|
|
127
|
+
)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
desc 'Build and publish the Lambda layer (set AWS_PROFILE, LAYER_NAME=stowzilla-sqlite3-ruby)'
|
|
131
|
+
task publish: :build do
|
|
132
|
+
layer_name = ENV.fetch('LAYER_NAME', 'stowzilla-sqlite3-ruby')
|
|
133
|
+
ruby_version = ENV.fetch('RUBY_VERSION', '3.4')
|
|
134
|
+
architecture = ENV.fetch('ARCHITECTURE', 'x86_64')
|
|
135
|
+
output_file = File.expand_path(ENV.fetch('OUTPUT', 'pkg/sqlite-layer.zip'))
|
|
136
|
+
|
|
137
|
+
abort "❌ Layer zip not found at #{output_file}" unless File.exist?(output_file)
|
|
138
|
+
|
|
139
|
+
cmd = %w[aws lambda publish-layer-version]
|
|
140
|
+
cmd += ['--layer-name', layer_name]
|
|
141
|
+
cmd += ['--zip-file', "fileb://#{output_file}"]
|
|
142
|
+
cmd += ['--compatible-runtimes', "ruby#{ruby_version}"]
|
|
143
|
+
cmd += ['--compatible-architectures', architecture]
|
|
144
|
+
|
|
145
|
+
puts "📤 Publishing layer '#{layer_name}'..."
|
|
146
|
+
puts " #{cmd.join(' ')}"
|
|
147
|
+
|
|
148
|
+
abort '❌ Failed to publish layer' unless system(*cmd)
|
|
149
|
+
|
|
150
|
+
puts '✅ Layer published successfully'
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
desc 'Rebuild the search index for a given owner: rake s3arch:rebuild[owner-123]'
|
|
155
|
+
task :rebuild, [:owner_id] do |_t, args|
|
|
156
|
+
require 's3arch'
|
|
157
|
+
|
|
158
|
+
owner_id = args.owner_id || ENV.fetch('OWNER_ID', nil)
|
|
159
|
+
abort '❌ Usage: rake s3arch:rebuild[OWNER_ID]' unless owner_id
|
|
160
|
+
|
|
161
|
+
S3arch.configure(&:from_env!)
|
|
162
|
+
|
|
163
|
+
puts "🔄 Rebuilding index for #{owner_id}..."
|
|
164
|
+
S3arch::Indexer.new.rebuild(owner_id)
|
|
165
|
+
puts '✅ Done'
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
desc 'Show current s3arch configuration and version info'
|
|
169
|
+
task :info do
|
|
170
|
+
require 's3arch'
|
|
171
|
+
|
|
172
|
+
puts "s3arch #{S3arch::VERSION}"
|
|
173
|
+
puts ''
|
|
174
|
+
puts 'Environment:'
|
|
175
|
+
%w[S3ARCH_SOURCE_TABLE S3ARCH_SOURCE_INDEX S3ARCH_INDEX_BUCKET S3ARCH_VERSION_TABLE].each do |var|
|
|
176
|
+
puts " #{var}=#{ENV.fetch(var, '(not set)')}"
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
metadata
CHANGED
|
@@ -1,39 +1,12 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: s3arch
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Adam Dalton
|
|
8
8
|
bindir: bin
|
|
9
|
-
cert_chain:
|
|
10
|
-
- |
|
|
11
|
-
-----BEGIN CERTIFICATE-----
|
|
12
|
-
MIIEdDCCAtygAwIBAgIBATANBgkqhkiG9w0BAQsFADBAMQ4wDAYDVQQDDAVhZ2Vu
|
|
13
|
-
dDEZMBcGCgmSJomT8ixkARkWCXN0b3d6aWxsYTETMBEGCgmSJomT8ixkARkWA2Nv
|
|
14
|
-
bTAeFw0yNjA2MDgxOTExNTlaFw0yNzA2MDgxOTExNTlaMEAxDjAMBgNVBAMMBWFn
|
|
15
|
-
ZW50MRkwFwYKCZImiZPyLGQBGRYJc3Rvd3ppbGxhMRMwEQYKCZImiZPyLGQBGRYD
|
|
16
|
-
Y29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAupBquKI/4WvXOgND
|
|
17
|
-
pXyqH2GllZs1wG4TWWdn/DoMg45UoCwD+AWEuGrIdInBCpPN8vEJNJWPoM/RrU+b
|
|
18
|
-
xRBZT4uUk00bnZRW2SYh5GJSqBoBR+rWc2DGkXyGfdRU2sQvkB0+is6ChgQ61WMM
|
|
19
|
-
33LE9+loBlVsZ6EVtrc18Uh2OW0mJpe0hN2nmBrxZqqOZigxC4DKRMFHvpRkxSb6
|
|
20
|
-
mD4kit1AcwX9NEWJsXxrPaetL/SB/VbXaEZX93XAvp6USaXvCWt4slkDS2mIvqtn
|
|
21
|
-
9DtGC43LFC7SDGbnsG9PVenQgVCi8UWFPUAab0PqZSlmi3Qlbhw8qTGPp5Cbv4vz
|
|
22
|
-
qjC2UGPOQigA/7lbbGRhCohMrjOVHMAQwkcgiIqtolUoYlnvPMIy+m3pdvgDv/PH
|
|
23
|
-
bsZGvXQ7i0458xsmp1vaKthZocVAR+GboHbuIiYPUnO45ccXUQ00x6365tTe7mZi
|
|
24
|
-
NvmUYdAGbQmVvFqyxF7IYA6sF74L2Lstu0knSfss557bAe1HAgMBAAGjeTB3MAkG
|
|
25
|
-
A1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBSnxTL/lNBCeLqpeVIX6AUY
|
|
26
|
-
kel4zjAeBgNVHREEFzAVgRNhZ2VudEBzdG93emlsbGEuY29tMB4GA1UdEgQXMBWB
|
|
27
|
-
E2FnZW50QHN0b3d6aWxsYS5jb20wDQYJKoZIhvcNAQELBQADggGBACm9Fjit/UCv
|
|
28
|
-
FxlKqeiCTIG94cIx+QrWAOJSx9knKydwUec1u04D/DbfZjTn3C2Bj227QgxeUn+6
|
|
29
|
-
if3e2v7zAk1896hLmGYzML0+nxQPb0vmtdLR7HETUlSKTVabcv1fbwLyjsuGrBvk
|
|
30
|
-
y51vOEzUEZ508a9yepLYqrQu1kOju4d57c9oA5l3H0mMKWz7av9tFj0B+STvuaWk
|
|
31
|
-
HRYDWc5HgOEVTyV+w0uFt2Kw4OCb8C42uSvC5RfYYtw78MSP+5Ru+LXJ7XOtmuN0
|
|
32
|
-
E6GVmofQ17ig9O3rgfFbMendSInrRmvPIGswvM1yivq9NOllFbdck2OJKPx6FCJF
|
|
33
|
-
7SJIkXQfc9P4B5iASIV1d1FsE0YX+g3jHXPJK/4mGL5bAyBKzpMfQB/mg6vQBzkh
|
|
34
|
-
aOKPwcreFj7TznBl89R5tNS9wZQfPVR98zgPyocddWhK18eQNMSBUnv4eeJ8PPbk
|
|
35
|
-
DovL+G8ajHDZ9fjH/+GVYHEMuiVdLarXrKJpHC1VfGTTUAp4NSEpUQ==
|
|
36
|
-
-----END CERTIFICATE-----
|
|
9
|
+
cert_chain: []
|
|
37
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
38
11
|
dependencies:
|
|
39
12
|
- !ruby/object:Gem::Dependency
|
|
@@ -117,7 +90,6 @@ files:
|
|
|
117
90
|
- CHANGELOG.md
|
|
118
91
|
- LICENSE.txt
|
|
119
92
|
- README.md
|
|
120
|
-
- certs/stowzilla.pem
|
|
121
93
|
- infrastructure/routes.tf.rb
|
|
122
94
|
- infrastructure/schema.tf.rb
|
|
123
95
|
- lambda/controllers/s3arch_controller.rb
|
|
@@ -134,7 +106,7 @@ files:
|
|
|
134
106
|
- lib/s3arch/tokenizer.rb
|
|
135
107
|
- lib/s3arch/version.rb
|
|
136
108
|
- lib/s3arch/web.rb
|
|
137
|
-
- lib/tasks/
|
|
109
|
+
- lib/tasks/s3arch.rake
|
|
138
110
|
homepage: https://github.com/stowzilla/s3arch
|
|
139
111
|
licenses:
|
|
140
112
|
- MIT
|
checksums.yaml.gz.sig
DELETED
|
Binary file
|
data/certs/stowzilla.pem
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
-----BEGIN CERTIFICATE-----
|
|
2
|
-
MIIEdDCCAtygAwIBAgIBATANBgkqhkiG9w0BAQsFADBAMQ4wDAYDVQQDDAVhZ2Vu
|
|
3
|
-
dDEZMBcGCgmSJomT8ixkARkWCXN0b3d6aWxsYTETMBEGCgmSJomT8ixkARkWA2Nv
|
|
4
|
-
bTAeFw0yNjA2MDgxOTExNTlaFw0yNzA2MDgxOTExNTlaMEAxDjAMBgNVBAMMBWFn
|
|
5
|
-
ZW50MRkwFwYKCZImiZPyLGQBGRYJc3Rvd3ppbGxhMRMwEQYKCZImiZPyLGQBGRYD
|
|
6
|
-
Y29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAupBquKI/4WvXOgND
|
|
7
|
-
pXyqH2GllZs1wG4TWWdn/DoMg45UoCwD+AWEuGrIdInBCpPN8vEJNJWPoM/RrU+b
|
|
8
|
-
xRBZT4uUk00bnZRW2SYh5GJSqBoBR+rWc2DGkXyGfdRU2sQvkB0+is6ChgQ61WMM
|
|
9
|
-
33LE9+loBlVsZ6EVtrc18Uh2OW0mJpe0hN2nmBrxZqqOZigxC4DKRMFHvpRkxSb6
|
|
10
|
-
mD4kit1AcwX9NEWJsXxrPaetL/SB/VbXaEZX93XAvp6USaXvCWt4slkDS2mIvqtn
|
|
11
|
-
9DtGC43LFC7SDGbnsG9PVenQgVCi8UWFPUAab0PqZSlmi3Qlbhw8qTGPp5Cbv4vz
|
|
12
|
-
qjC2UGPOQigA/7lbbGRhCohMrjOVHMAQwkcgiIqtolUoYlnvPMIy+m3pdvgDv/PH
|
|
13
|
-
bsZGvXQ7i0458xsmp1vaKthZocVAR+GboHbuIiYPUnO45ccXUQ00x6365tTe7mZi
|
|
14
|
-
NvmUYdAGbQmVvFqyxF7IYA6sF74L2Lstu0knSfss557bAe1HAgMBAAGjeTB3MAkG
|
|
15
|
-
A1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBSnxTL/lNBCeLqpeVIX6AUY
|
|
16
|
-
kel4zjAeBgNVHREEFzAVgRNhZ2VudEBzdG93emlsbGEuY29tMB4GA1UdEgQXMBWB
|
|
17
|
-
E2FnZW50QHN0b3d6aWxsYS5jb20wDQYJKoZIhvcNAQELBQADggGBACm9Fjit/UCv
|
|
18
|
-
FxlKqeiCTIG94cIx+QrWAOJSx9knKydwUec1u04D/DbfZjTn3C2Bj227QgxeUn+6
|
|
19
|
-
if3e2v7zAk1896hLmGYzML0+nxQPb0vmtdLR7HETUlSKTVabcv1fbwLyjsuGrBvk
|
|
20
|
-
y51vOEzUEZ508a9yepLYqrQu1kOju4d57c9oA5l3H0mMKWz7av9tFj0B+STvuaWk
|
|
21
|
-
HRYDWc5HgOEVTyV+w0uFt2Kw4OCb8C42uSvC5RfYYtw78MSP+5Ru+LXJ7XOtmuN0
|
|
22
|
-
E6GVmofQ17ig9O3rgfFbMendSInrRmvPIGswvM1yivq9NOllFbdck2OJKPx6FCJF
|
|
23
|
-
7SJIkXQfc9P4B5iASIV1d1FsE0YX+g3jHXPJK/4mGL5bAyBKzpMfQB/mg6vQBzkh
|
|
24
|
-
aOKPwcreFj7TznBl89R5tNS9wZQfPVR98zgPyocddWhK18eQNMSBUnv4eeJ8PPbk
|
|
25
|
-
DovL+G8ajHDZ9fjH/+GVYHEMuiVdLarXrKJpHC1VfGTTUAp4NSEpUQ==
|
|
26
|
-
-----END CERTIFICATE-----
|
data/lib/tasks/lambda_layer.rake
DELETED
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative '../s3arch/version'
|
|
4
|
-
|
|
5
|
-
namespace :lambda do
|
|
6
|
-
desc 'Build the Lambda layer zip (sqlite3 + s3arch) for deployment'
|
|
7
|
-
task :build_layer do
|
|
8
|
-
require 'tmpdir'
|
|
9
|
-
require 'fileutils'
|
|
10
|
-
|
|
11
|
-
ruby_version = ENV.fetch('RUBY_VERSION', '3.4')
|
|
12
|
-
architecture = ENV.fetch('ARCHITECTURE', 'x86_64')
|
|
13
|
-
output_file = File.expand_path(ENV.fetch('OUTPUT', 'pkg/sqlite-layer.zip'))
|
|
14
|
-
s3arch_version = ENV.fetch('S3ARCH_VERSION', "~> #{S3arch::VERSION.sub(/\.\d+$/, '.0')}")
|
|
15
|
-
|
|
16
|
-
FileUtils.mkdir_p(File.dirname(output_file))
|
|
17
|
-
|
|
18
|
-
puts "🔨 Building Lambda layer (Ruby #{ruby_version} / #{architecture}, s3arch #{s3arch_version})..."
|
|
19
|
-
|
|
20
|
-
tmpdir = Dir.mktmpdir('s3arch-layer')
|
|
21
|
-
begin
|
|
22
|
-
# Write a minimal Gemfile for the layer
|
|
23
|
-
File.write("#{tmpdir}/Gemfile", <<~GEMFILE)
|
|
24
|
-
source 'https://rubygems.org'
|
|
25
|
-
gem 'sqlite3', '~> 2.0'
|
|
26
|
-
gem 's3arch', '#{s3arch_version}'
|
|
27
|
-
GEMFILE
|
|
28
|
-
|
|
29
|
-
docker_image = "public.ecr.aws/sam/build-ruby#{ruby_version}:latest-#{architecture}"
|
|
30
|
-
platform = architecture == 'x86_64' ? 'linux/amd64' : 'linux/arm64'
|
|
31
|
-
|
|
32
|
-
build_script = <<~BASH
|
|
33
|
-
yum install -y sqlite-devel 2>/dev/null || dnf install -y sqlite-devel 2>/dev/null
|
|
34
|
-
bundle config set --local path /build/layer/ruby/gems/#{ruby_version}.0
|
|
35
|
-
bundle config set --local without "development test"
|
|
36
|
-
bundle config set --local deployment false
|
|
37
|
-
bundle install
|
|
38
|
-
# Flatten bundler's nested ruby/X.Y.0 structure into the layer root
|
|
39
|
-
NESTED="/build/layer/ruby/gems/#{ruby_version}.0/ruby/#{ruby_version}.0"
|
|
40
|
-
if [ -d "$NESTED" ]; then
|
|
41
|
-
mkdir -p /build/layer-final/ruby/gems/#{ruby_version}.0
|
|
42
|
-
cp -a "$NESTED"/* /build/layer-final/ruby/gems/#{ruby_version}.0/
|
|
43
|
-
rm -rf /build/layer
|
|
44
|
-
mv /build/layer-final /build/layer
|
|
45
|
-
fi
|
|
46
|
-
BASH
|
|
47
|
-
|
|
48
|
-
docker_cmd = [
|
|
49
|
-
'docker', 'run', '--rm',
|
|
50
|
-
'--platform', platform,
|
|
51
|
-
'-v', "#{tmpdir}:/build",
|
|
52
|
-
'-w', '/build',
|
|
53
|
-
docker_image,
|
|
54
|
-
'/bin/bash', '-c', build_script
|
|
55
|
-
]
|
|
56
|
-
|
|
57
|
-
puts "🐳 Building in Docker (#{docker_image})..."
|
|
58
|
-
abort '❌ Docker build failed' unless system(*docker_cmd)
|
|
59
|
-
|
|
60
|
-
layer_dir = "#{tmpdir}/layer"
|
|
61
|
-
|
|
62
|
-
# Strip unnecessary files to reduce layer size
|
|
63
|
-
puts '🧹 Stripping layer...'
|
|
64
|
-
Dir.glob("#{layer_dir}/ruby/gems/*/gems/*/").each do |gem_dir|
|
|
65
|
-
%w[spec test tests doc docs examples benchmarks].each do |fat_dir|
|
|
66
|
-
FileUtils.rm_rf("#{gem_dir}#{fat_dir}")
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
junk_patterns = %w[
|
|
71
|
-
*.md *.rdoc *.txt *.c *.h *.o Makefile *.log
|
|
72
|
-
CHANGELOG* HISTORY* LICENSE* README* .gitignore Rakefile
|
|
73
|
-
]
|
|
74
|
-
junk_patterns.each do |pattern|
|
|
75
|
-
Dir.glob("#{layer_dir}/**/#{pattern}").each { |f| FileUtils.rm_f(f) }
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# Strip debug symbols from shared objects
|
|
79
|
-
Dir.glob("#{layer_dir}/**/*.so").each do |so|
|
|
80
|
-
system('strip', '--strip-debug', so, err: File::NULL)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# Verify native extension is present
|
|
84
|
-
sqlite_so = Dir.glob("#{layer_dir}/**/sqlite3_native.so") +
|
|
85
|
-
Dir.glob("#{layer_dir}/**/sqlite3.so")
|
|
86
|
-
abort '❌ sqlite3 native extension NOT found in layer' if sqlite_so.empty?
|
|
87
|
-
puts '✅ sqlite3 native extension included'
|
|
88
|
-
|
|
89
|
-
# Verify s3arch gem is present
|
|
90
|
-
s3arch_lib = Dir.glob("#{layer_dir}/**/gems/s3arch-*/lib/s3arch.rb")
|
|
91
|
-
abort '❌ s3arch gem NOT found in layer' if s3arch_lib.empty?
|
|
92
|
-
puts '✅ s3arch gem included'
|
|
93
|
-
|
|
94
|
-
# Package the zip
|
|
95
|
-
FileUtils.rm_f(output_file)
|
|
96
|
-
abort '❌ Failed to create zip' unless system('zip', '-qr', output_file, 'ruby/', chdir: layer_dir)
|
|
97
|
-
|
|
98
|
-
size = `du -h #{output_file}`.split("\t").first
|
|
99
|
-
puts "✅ Layer built: #{output_file} (#{size})"
|
|
100
|
-
ensure
|
|
101
|
-
# Docker creates files as root; use sudo rm to clean up
|
|
102
|
-
system('sudo', 'rm', '-rf', tmpdir) || FileUtils.rm_rf(tmpdir)
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
desc 'Publish the Lambda layer to AWS (set PROFILE and REGION env vars)'
|
|
107
|
-
task publish_layer: :build_layer do
|
|
108
|
-
profile = ENV.fetch('PROFILE', nil)
|
|
109
|
-
region = ENV.fetch('REGION', 'us-east-1')
|
|
110
|
-
layer_name = ENV.fetch('LAYER_NAME', 'stowzilla-sqlite3-ruby')
|
|
111
|
-
ruby_version = ENV.fetch('RUBY_VERSION', '3.4')
|
|
112
|
-
architecture = ENV.fetch('ARCHITECTURE', 'x86_64')
|
|
113
|
-
output_file = File.expand_path(ENV.fetch('OUTPUT', 'pkg/sqlite-layer.zip'))
|
|
114
|
-
|
|
115
|
-
unless File.exist?(output_file)
|
|
116
|
-
abort "❌ Layer zip not found at #{output_file}. Run `rake lambda:build_layer` first."
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
cmd = %w[aws lambda publish-layer-version]
|
|
120
|
-
cmd += ['--layer-name', layer_name]
|
|
121
|
-
cmd += ['--zip-file', "fileb://#{output_file}"]
|
|
122
|
-
cmd += ['--compatible-runtimes', "ruby#{ruby_version}"]
|
|
123
|
-
cmd += ['--compatible-architectures', architecture]
|
|
124
|
-
cmd += ['--region', region]
|
|
125
|
-
cmd += ['--profile', profile] if profile
|
|
126
|
-
|
|
127
|
-
puts "📤 Publishing layer '#{layer_name}' to #{region}..."
|
|
128
|
-
puts " #{cmd.join(' ')}"
|
|
129
|
-
|
|
130
|
-
abort '❌ Failed to publish layer' unless system(*cmd)
|
|
131
|
-
|
|
132
|
-
puts '✅ Layer published successfully'
|
|
133
|
-
end
|
|
134
|
-
end
|
data.tar.gz.sig
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
9Q�{�e[��a$)[���%Zb#s�1$�ؖ�j�p�7"��y ;�X��$y�*�H������яd�L���M�yH2ZZD���`��8*n�@tj3(��g����^a��@gV�{�q� 6t�>����3B�>�v��.FW�g��-ͤ< jgT;�;u�H�&��H�D�$��E���8�
|
|
2
|
-
�ݻO�+悹m2���'��z��:��pV���&r�W��� q�`?/�@r�5���r��p=J��3���֠�Fr��r��&t�T��qG��������A�"��0�&�g�Yo��ˮ��l����*S����Pd��!S�od[�{%������:��&
|
metadata.gz.sig
DELETED