build-labels 0.0.79 → 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: eab2ff4b6f31c2174bfd1febbc333d15a77ee0dee520c9890425a53b1b68d13a
4
- data.tar.gz: c92078aa2fcaa417ffa8e12f9a0923c541b4922f6f17187245a066f5b401279a
3
+ metadata.gz: 85c6a279190386fdb2b18065e676e640484c5ce4b2f4fe3b3de8597bb81214a8
4
+ data.tar.gz: 419d06b5f33b03d79312022cc7ee4df622d2bcca99474177481d131890cdfa6f
5
5
  SHA512:
6
- metadata.gz: 370bddb89fe5dd3d97275e4722caefaa0d6f097dd28dc846e5ee29acffd9422a71d2c3f0b24642a0e3321f2c3b7e34c352d49de60ee698481a5ed37d45e4bd9f
7
- data.tar.gz: 19f3f0758ef096f40511153f0c430db56b1d6806b4437da2b9f46e3a24ec39c390a7783dcafcba12e23c6bd379aed14b84c49d89e92c9c9d5a0de7f24bddcb67
6
+ metadata.gz: f915e25af163403dd28199c99cd08d1acac593d780bdd7fd3841028e567c6944342ebbe9a6198d05586ab2f70c02bf19d547d24eb0f5a0e4fc240eec8fdafaa1
7
+ data.tar.gz: 9c45b412e6622ac2bc9aa528ef8fb0cb0e13d9c8663cfe85f8e3b9b00c85d186c392455f515a9c38fd53fda4ea68421bb12e1e6c066cab531dacf2e7e8e18d3a
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.79'
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.79
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: