build-labels 0.0.78 → 0.0.80

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: 8c98d7473c265c1f954d96ece1cfa66d725076c82a77575eb818e0f555203d8e
4
- data.tar.gz: 0e255d2b86daef6f54e974b42ccb170e45ac36f71d7986b7c4b996999814826e
3
+ metadata.gz: 85c6a279190386fdb2b18065e676e640484c5ce4b2f4fe3b3de8597bb81214a8
4
+ data.tar.gz: 419d06b5f33b03d79312022cc7ee4df622d2bcca99474177481d131890cdfa6f
5
5
  SHA512:
6
- metadata.gz: 78c6fea7954548de03d0253fc93fa101c29b405577a6cb9da917618af6e3fc9ea60d1b30b54d0b43e36b6e4f80e3b25f0c07c358f53ca67928ff61107d53c31e
7
- data.tar.gz: 924f79076a6224150b2137851fa98a7b9d8f8f95c356d94c08cf5d3f908c438c4d9ccf8044925d0776b4ee958e80adde8fe5e6e1b1aa6280e705e75a6ed0c30b
6
+ metadata.gz: f915e25af163403dd28199c99cd08d1acac593d780bdd7fd3841028e567c6944342ebbe9a6198d05586ab2f70c02bf19d547d24eb0f5a0e4fc240eec8fdafaa1
7
+ data.tar.gz: 9c45b412e6622ac2bc9aa528ef8fb0cb0e13d9c8663cfe85f8e3b9b00c85d186c392455f515a9c38fd53fda4ea68421bb12e1e6c066cab531dacf2e7e8e18d3a
@@ -9,6 +9,16 @@ set -eux
9
9
  docker_major=""
10
10
  docker_version_prefix=""
11
11
 
12
+ curl_fetch() {
13
+ curl -fsSL \
14
+ --retry "${CURL_RETRIES:-3}" \
15
+ --retry-delay "${CURL_RETRY_DELAY:-2}" \
16
+ --retry-all-errors \
17
+ --connect-timeout "${CURL_CONNECT_TIMEOUT:-10}" \
18
+ --max-time "${CURL_MAX_TIME:-120}" \
19
+ "$@"
20
+ }
21
+
12
22
  usage() {
13
23
  cat <<'USAGE'
14
24
  Usage: install-docker-static [VERSION_PREFIX] [--docker-major N]
@@ -140,7 +150,7 @@ install_docker_static() {
140
150
  detect_arch
141
151
  base_url="https://download.docker.com/linux/static/stable/$docker_arch/"
142
152
  versions="$(
143
- curl -fsSL "$base_url" \
153
+ curl_fetch "$base_url" \
144
154
  | sed -n 's/.*docker-\([0-9.][0-9.]*\)\.tgz.*/\1/p' \
145
155
  | sort -t. -k1,1n -k2,2n -k3,3n -k4,4n
146
156
  )"
@@ -170,7 +180,7 @@ install_docker_static() {
170
180
  exit 1
171
181
  fi
172
182
  tmp_dir="$(mktemp -d)"
173
- curl -fsSL "${base_url}docker-${latest_version}.tgz" -o "$tmp_dir/docker.tgz"
183
+ curl_fetch "${base_url}docker-${latest_version}.tgz" -o "$tmp_dir/docker.tgz"
174
184
  tar -xzf "$tmp_dir/docker.tgz" -C "$tmp_dir"
175
185
  install -m 0755 "$tmp_dir/docker/docker" /usr/local/bin/docker
176
186
  rm -rf "$tmp_dir"
@@ -181,7 +191,7 @@ install_buildx() {
181
191
  buildx_version="${BUILDX_VERSION:-}"
182
192
  if [ -z "$buildx_version" ]; then
183
193
  buildx_version="$(
184
- curl -fsSL https://api.github.com/repos/docker/buildx/releases/latest \
194
+ curl_fetch https://api.github.com/repos/docker/buildx/releases/latest \
185
195
  | sed -n 's/.*"tag_name": "\(v[0-9.]*\)".*/\1/p' \
186
196
  | head -n 1
187
197
  )"
@@ -192,7 +202,7 @@ install_buildx() {
192
202
  fi
193
203
  plugin_dir="/usr/local/lib/docker/cli-plugins"
194
204
  mkdir -p "$plugin_dir"
195
- curl -fsSL \
205
+ curl_fetch \
196
206
  -o "$plugin_dir/docker-buildx" \
197
207
  "https://github.com/docker/buildx/releases/download/${buildx_version}/buildx-${buildx_version}.linux-${buildx_arch}"
198
208
  chmod 0755 "$plugin_dir/docker-buildx"
@@ -203,7 +213,7 @@ install_compose() {
203
213
  compose_version="${COMPOSE_VERSION:-}"
204
214
  if [ -z "$compose_version" ]; then
205
215
  compose_version="$(
206
- curl -fsSL https://api.github.com/repos/docker/compose/releases/latest \
216
+ curl_fetch https://api.github.com/repos/docker/compose/releases/latest \
207
217
  | sed -n 's/.*"tag_name": "\(v[0-9.]*\)".*/\1/p' \
208
218
  | head -n 1
209
219
  )"
@@ -214,7 +224,7 @@ install_compose() {
214
224
  fi
215
225
  plugin_dir="/usr/local/lib/docker/cli-plugins"
216
226
  mkdir -p "$plugin_dir"
217
- curl -fsSL \
227
+ curl_fetch \
218
228
  -o "$plugin_dir/docker-compose" \
219
229
  "https://github.com/docker/compose/releases/download/${compose_version}/docker-compose-linux-${compose_arch}"
220
230
  chmod 0755 "$plugin_dir/docker-compose"
data/bin/trivy-runner ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/trivy-runner'
4
+
5
+ exit TrivyRunner.new.run(ARGV)
@@ -0,0 +1,93 @@
1
+ require 'json'
2
+ require 'open3'
3
+ require 'optparse'
4
+ require 'yaml'
5
+ require_relative 'version'
6
+
7
+ class TrivyRunner
8
+ SEVERITIES = %w[UNKNOWN LOW MEDIUM HIGH CRITICAL].freeze
9
+ IMAGE_ID = /\Asha256:[0-9a-f]{64}\z/
10
+
11
+ def run(args)
12
+ file = 'bake.yml'
13
+ metadata_file = nil
14
+ severity = %w[HIGH CRITICAL]
15
+ parser = OptionParser.new do |options|
16
+ options.banner = 'Usage: trivy-runner -f BAKE_FILE --metadata-file FILE [TARGET/GROUP ...]'
17
+ options.on('-f', '--file FILE', 'Bake or Compose file (default: bake.yml)') { file = _1 }
18
+ options.on('--metadata-file FILE', 'Buildx metadata from the local build') { metadata_file = _1 }
19
+ options.on('--image-src SOURCE', %w[docker], 'Image source (default: docker)')
20
+ options.on('--fail-on SEVERITIES', Array, 'Fail on these severities (default: HIGH,CRITICAL)') do |values|
21
+ severity = values.map { _1.strip.upcase }.uniq
22
+ if severity.empty? || (severity - SEVERITIES).any?
23
+ raise OptionParser::InvalidArgument, values.join(',')
24
+ end
25
+ end
26
+ options.on('-v', '--version', 'Print version') { puts BuildLabels::Builder::VERSION; return 0 }
27
+ options.on('-h', '--help', 'Print help') { puts options; return 0 }
28
+ end
29
+ targets = parser.parse!(args.dup)
30
+ raise OptionParser::MissingArgument, '--metadata-file' unless metadata_file
31
+ return 0 if targets.empty? && empty_compose?(file)
32
+
33
+ metadata = JSON.parse(File.read(metadata_file))
34
+ plan = capture_json('docker', 'buildx', 'bake', '-f', file, '--print', '--', *targets)
35
+ images = image_tags(plan.fetch('target'), metadata)
36
+ return 0 if images.empty?
37
+
38
+ verify_images(images)
39
+ images.values.uniq.each do |image_id|
40
+ return 1 unless system('trivy', 'image', '--image-src', 'docker', '--scanners', 'vuln',
41
+ '--severity', severity.join(','), '--exit-code', '1', image_id)
42
+ end
43
+ verify_images(images)
44
+ 0
45
+ rescue StandardError => error
46
+ warn error.message
47
+ 1
48
+ end
49
+
50
+ private
51
+
52
+ def empty_compose?(file)
53
+ document = YAML.safe_load(File.read(file), aliases: true)
54
+ document.is_a?(Hash) && document['services'] == {}
55
+ rescue Psych::Exception
56
+ false
57
+ end
58
+
59
+ def image_tags(targets, metadata)
60
+ raise 'Invalid Bake target map' unless targets.is_a?(Hash)
61
+
62
+ images = {}
63
+ targets.each do |name, target|
64
+ raise "Multiple platforms for target: #{name}" if (target['platforms'] || []).size > 1
65
+
66
+ image_id = metadata.fetch(name).fetch('containerimage.config.digest')
67
+ raise "Invalid image ID for target: #{name}" unless image_id.is_a?(String) && IMAGE_ID.match?(image_id)
68
+
69
+ tags = target.fetch('tags')
70
+ raise "Missing image tags for target: #{name}" unless tags.is_a?(Array) && !tags.empty?
71
+
72
+ tags.each do |tag|
73
+ raise "Invalid image tag for target: #{name}" unless tag.is_a?(String) && !tag.empty?
74
+ raise "Conflicting image tag: #{tag}" if images.key?(tag) && images[tag] != image_id
75
+
76
+ images[tag] = image_id
77
+ end
78
+ end
79
+ images
80
+ end
81
+
82
+ def verify_images(images)
83
+ actual = capture_json('docker', 'image', 'inspect', '--', *images.keys).map { _1.fetch('Id') }
84
+ raise 'Image tags do not match build metadata' unless actual == images.values
85
+ end
86
+
87
+ def capture_json(*command)
88
+ output, status = Open3.capture2(*command)
89
+ raise "#{command.first} failed with status #{status.exitstatus}" unless status.success?
90
+
91
+ JSON.parse(output)
92
+ end
93
+ end
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module BuildLabels
2
2
  class Builder
3
- VERSION = '0.0.78'
3
+ VERSION = '0.0.80'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: build-labels
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.78
4
+ version: 0.0.80
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artyom B
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-06-25 00:00:00.000000000 Z
11
+ date: 2026-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -99,6 +99,7 @@ email: author@email.address
99
99
  executables:
100
100
  - build-labels
101
101
  - helm-push
102
+ - trivy-runner
102
103
  - install-docker-static
103
104
  extensions: []
104
105
  extra_rdoc_files: []
@@ -106,6 +107,7 @@ files:
106
107
  - bin/build-labels
107
108
  - bin/helm-push
108
109
  - bin/install-docker-static
110
+ - bin/trivy-runner
109
111
  - examples/Dockerfile
110
112
  - examples/common-compose.yml
111
113
  - examples/simple-compose.yml
@@ -124,6 +126,7 @@ files:
124
126
  - lib/helm-push.rb
125
127
  - lib/helm-push/command_line.rb
126
128
  - lib/helm-push/command_push.rb
129
+ - lib/trivy-runner.rb
127
130
  - lib/version.rb
128
131
  homepage: https://rubygems.org/gems/build-labels
129
132
  licenses: