build-labels 0.0.15 → 0.0.17
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/examples/Dockerfile +2 -1
- data/examples/common-compose.yml +30 -0
- data/examples/simple-compose.yml +4 -0
- data/lib/build-labels/builder.rb +44 -6
- data/lib/build-labels/command_gitlab.rb +1 -1
- data/lib/build-labels/command_line.rb +0 -1
- data/lib/build-labels/yaml_merge.rb +107 -0
- data/lib/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 139e7e061e2bf7a7a9cb861de8477fc09e08340987ed89e53239e9867881e1c7
|
4
|
+
data.tar.gz: 9ab1d0aaf92e3b0f18e5ae4c42ead33c058513fd25123e6e859c231ae10538db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec5e462b03595e656d57d925fe58b993377a9e1508758c0115054fe8d41c6b518591d6dda5fb5c75441e4cc82a83aaa87304eb92c25165a20e4377ee7cfb368d
|
7
|
+
data.tar.gz: 17e2b02be847d4d8f008b3cc6f3564e06e3c0039cb51a3c1107680b82e7ade6c3090236a4f0ce45b7306364035ff03d52e80431b0fb83e9b835ba62d40b57095
|
data/examples/Dockerfile
CHANGED
@@ -7,4 +7,5 @@ ENV COM_GITLAB_CI_COMMITURL="/commit/"
|
|
7
7
|
ENV COM_GITLAB_CI_MRURL="/-/merge_requests/"
|
8
8
|
ENV COM_GITLAB_CI_TAG=":"
|
9
9
|
ENV ORG_LABEL-SCHEMA_VENDOR="/"
|
10
|
-
ENV ORG_LABEL-SCHEMA_SCHEMA-VERSION="1.0"
|
10
|
+
ENV ORG_LABEL-SCHEMA_SCHEMA-VERSION="1.0"
|
11
|
+
ENV ORG_OPENCONTAINERS_IMAGE_REF_NAME=":"
|
@@ -0,0 +1,30 @@
|
|
1
|
+
x-common-build: &common-build
|
2
|
+
args:
|
3
|
+
- CI_PIPELINE_ID=${CI_PIPELINE_ID}
|
4
|
+
- CI_PIPELINE_IID=${CI_PIPELINE_IID}
|
5
|
+
- CI_NEXUS_CREDENTIALS=${CI_NEXUS_CREDENTIALS}
|
6
|
+
- CI_NEXUS_FOLDER=${CI_NEXUS_FOLDER}
|
7
|
+
- CI_COMMIT_TIMESTAMP=${CI_COMMIT_TIMESTAMP}
|
8
|
+
- CI_PROJECT_PATH_SLUG=${CI_PROJECT_PATH_SLUG}
|
9
|
+
- CI_COMMIT_BRANCH=${CI_COMMIT_BRANCH}
|
10
|
+
context: ../src_mobile_app
|
11
|
+
dockerfile: ../docker/flutter/Dockerfile
|
12
|
+
|
13
|
+
services:
|
14
|
+
app_dev:
|
15
|
+
image: ${REGISTRY_HOST}/app/${CI_COMMIT_BRANCH}-dev
|
16
|
+
build:
|
17
|
+
<<: *common-build
|
18
|
+
args:
|
19
|
+
- MAP_BACKEND=dev
|
20
|
+
volumes:
|
21
|
+
- ../docker_build_results_dev:/app/results
|
22
|
+
|
23
|
+
app_prod:
|
24
|
+
image: ${REGISTRY_HOST}/app/${CI_COMMIT_BRANCH}-prod
|
25
|
+
build:
|
26
|
+
<<: *common-build
|
27
|
+
args:
|
28
|
+
- MAP_BACKEND=prod
|
29
|
+
volumes:
|
30
|
+
- ../docker_build_results_prod:/app/results
|
data/examples/simple-compose.yml
CHANGED
data/lib/build-labels/builder.rb
CHANGED
@@ -2,6 +2,38 @@
|
|
2
2
|
require 'yaml'
|
3
3
|
require 'ostruct'
|
4
4
|
require 'pp'
|
5
|
+
require_relative 'yaml_merge'
|
6
|
+
|
7
|
+
class MyYAMLTree < Psych::Visitors::YAMLTree
|
8
|
+
class Registrar
|
9
|
+
# record object for future, using '@_yaml_anchor_name' rather
|
10
|
+
# than object_id if it exists
|
11
|
+
def register target, node
|
12
|
+
anchor_name = target.instance_variable_get('@_yaml_anchor_name') || target.object_id
|
13
|
+
@obj_to_node[anchor_name] = node
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# check to see if this object has been seen before
|
18
|
+
def accept target
|
19
|
+
if anchor_name = target.instance_variable_get('@_yaml_anchor_name')
|
20
|
+
if @st.key? anchor_name
|
21
|
+
oid = anchor_name
|
22
|
+
node = @st[oid]
|
23
|
+
anchor = oid.to_s
|
24
|
+
node.anchor = anchor
|
25
|
+
return @emitter.alias anchor
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# accept is a pretty big method, call super to avoid copying
|
30
|
+
# it all here. super will handle the cases when it's an object
|
31
|
+
# that's been seen but doesn't have '@_yaml_anchor_name' set
|
32
|
+
super
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
5
37
|
module BuildLabels
|
6
38
|
|
7
39
|
class Builder
|
@@ -38,7 +70,9 @@ module BuildLabels
|
|
38
70
|
def apply_environment
|
39
71
|
@namespaces.each do |ns, struct|
|
40
72
|
struct.each_pair do |name, value|
|
41
|
-
|
73
|
+
next unless value.to_s.include? '$'
|
74
|
+
struct[name] = value.gsub(/\$\{(\w+)\}/) { ENV[$1] }
|
75
|
+
.gsub(/\$(\w+)/) { ENV[$1] }
|
42
76
|
end
|
43
77
|
end
|
44
78
|
end
|
@@ -52,11 +86,17 @@ module BuildLabels
|
|
52
86
|
end
|
53
87
|
|
54
88
|
def extend_compose(compose_text)
|
55
|
-
|
89
|
+
|
90
|
+
result = YamlMerge::parse_and_process_yaml compose_text
|
91
|
+
compose = YamlMerge::deep_copy_without_aliases result
|
92
|
+
|
93
|
+
# compose = YAML.load compose_text
|
94
|
+
|
56
95
|
compose['services'].each do |name, service|
|
96
|
+
service.delete_if {|k, v| !%w[image build].include? k }
|
57
97
|
next unless service['build']
|
58
98
|
if service['build'].class == String
|
59
|
-
service['build'] = { 'context'
|
99
|
+
service['build'] = { 'context' => service['build'] }
|
60
100
|
end
|
61
101
|
service['build']['labels'] ||= []
|
62
102
|
add_namespace :dc, 'docker.service'
|
@@ -68,9 +108,7 @@ module BuildLabels
|
|
68
108
|
end
|
69
109
|
end
|
70
110
|
end
|
71
|
-
compose['services'].delete_if do |name, svc|
|
72
|
-
! svc.key?('build')
|
73
|
-
end
|
111
|
+
compose['services'].delete_if do |name, svc| ! svc.key?('build') end
|
74
112
|
puts compose.to_yaml
|
75
113
|
end
|
76
114
|
end
|
@@ -5,7 +5,7 @@ BuildLabels::CommandLine::COMMANDS[:gitlab] = Class.new do
|
|
5
5
|
builder.oc.vendor = '$CI_SERVER_URL/$GITLAB_USER_LOGIN'
|
6
6
|
builder.oc.authors = '$CI_SERVER_URL/$GITLAB_USER_LOGIN'
|
7
7
|
builder.oc.revision = '$CI_COMMIT_SHA'
|
8
|
-
builder.oc['ref.name'] = '$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
|
8
|
+
builder.oc['ref.name'] = '$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME'
|
9
9
|
builder.oc.source = '$CI_PROJECT_URL'
|
10
10
|
builder.oc.documentation = '$CI_PROJECT_URL'
|
11
11
|
builder.oc.licenses = '$CI_PROJECT_URL'
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# https://claude.ai/chat/4cd83f29-8ce4-42b7-8dcd-4f7c6222ab5e
|
2
|
+
require 'psych'
|
3
|
+
|
4
|
+
module YamlMerge
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def deep_merge(base, override)
|
8
|
+
result = base.dup
|
9
|
+
override.each do |key, value|
|
10
|
+
if value.is_a?(Hash) && result[key].is_a?(Hash)
|
11
|
+
result[key] = deep_merge(result[key], value)
|
12
|
+
elsif value.is_a?(Array) && result[key].is_a?(Array)
|
13
|
+
result[key] = (result[key] + value).uniq
|
14
|
+
else
|
15
|
+
result[key] = value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
result
|
19
|
+
end
|
20
|
+
|
21
|
+
def process_yaml(node, anchors = {})
|
22
|
+
case node
|
23
|
+
when Psych::Nodes::Mapping
|
24
|
+
result = {}
|
25
|
+
node.children.each_slice(2) do |key, value|
|
26
|
+
processed_key = process_yaml(key, anchors)
|
27
|
+
processed_value = process_yaml(value, anchors)
|
28
|
+
if key.is_a?(Psych::Nodes::Scalar) && key.anchor
|
29
|
+
anchors[key.anchor.to_sym] = processed_value
|
30
|
+
end
|
31
|
+
if processed_key == '<<'
|
32
|
+
if processed_value.is_a?(Array)
|
33
|
+
processed_value.each { |v| result = deep_merge(v, result) }
|
34
|
+
else
|
35
|
+
result = deep_merge(processed_value, result)
|
36
|
+
end
|
37
|
+
elsif result.key?(processed_key) && result[processed_key].is_a?(Array) && processed_value.is_a?(Array)
|
38
|
+
result[processed_key] = (result[processed_key] + processed_value).uniq
|
39
|
+
else
|
40
|
+
result[processed_key] = processed_value
|
41
|
+
end
|
42
|
+
end
|
43
|
+
node.anchor ? anchors[node.anchor.to_sym] = result : result
|
44
|
+
when Psych::Nodes::Sequence
|
45
|
+
result = node.children.map { |child| process_yaml(child, anchors) }
|
46
|
+
node.anchor ? anchors[node.anchor.to_sym] = result : result
|
47
|
+
when Psych::Nodes::Scalar
|
48
|
+
result = node.value
|
49
|
+
node.anchor ? anchors[node.anchor.to_sym] = result : result
|
50
|
+
when Psych::Nodes::Alias
|
51
|
+
anchors[node.anchor.to_sym] || node.anchor
|
52
|
+
else
|
53
|
+
node
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def parse_and_process_yaml(yaml_string)
|
58
|
+
parsed = Psych.parse(yaml_string)
|
59
|
+
process_yaml(parsed.root)
|
60
|
+
end
|
61
|
+
|
62
|
+
def deep_copy_without_aliases(obj)
|
63
|
+
case obj
|
64
|
+
when Hash
|
65
|
+
obj.transform_values { |v| deep_copy_without_aliases(v) }
|
66
|
+
when Array
|
67
|
+
obj.map { |v| deep_copy_without_aliases(v) }
|
68
|
+
else
|
69
|
+
obj
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
# SELF TEST ============================================================================================================
|
77
|
+
if File.expand_path($0) == File.expand_path(__FILE__)
|
78
|
+
yaml_string = <<~YAML
|
79
|
+
defaults: &defaults
|
80
|
+
common:
|
81
|
+
setting1: value1
|
82
|
+
setting2: value2
|
83
|
+
arr: [1, 2]
|
84
|
+
|
85
|
+
node1: &node1
|
86
|
+
<<: *defaults
|
87
|
+
specific:
|
88
|
+
key1: val1
|
89
|
+
arr: [3, 4]
|
90
|
+
|
91
|
+
node2:
|
92
|
+
<<: [*defaults, *node1]
|
93
|
+
arr: [5]
|
94
|
+
nested:
|
95
|
+
<<: *defaults
|
96
|
+
extra: [a, b]
|
97
|
+
YAML
|
98
|
+
|
99
|
+
result = YamlMerge::parse_and_process_yaml(yaml_string)
|
100
|
+
puts result.inspect
|
101
|
+
|
102
|
+
data_without_aliases = YamlMerge::deep_copy_without_aliases(result)
|
103
|
+
puts data_without_aliases.to_yaml
|
104
|
+
|
105
|
+
# puts Psych.dump(data_without_aliases, indentation: 2, line_width: -1)
|
106
|
+
|
107
|
+
end
|
data/lib/version.rb
CHANGED
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.
|
4
|
+
version: 0.0.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artyom B
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -103,6 +103,7 @@ extra_rdoc_files: []
|
|
103
103
|
files:
|
104
104
|
- bin/build-labels
|
105
105
|
- examples/Dockerfile
|
106
|
+
- examples/common-compose.yml
|
106
107
|
- examples/simple-compose.yml
|
107
108
|
- lib/build-labels.rb
|
108
109
|
- lib/build-labels/builder.rb
|
@@ -112,6 +113,7 @@ files:
|
|
112
113
|
- lib/build-labels/command_print.rb
|
113
114
|
- lib/build-labels/command_to_compose.rb
|
114
115
|
- lib/build-labels/command_to_dockerfiles.rb
|
116
|
+
- lib/build-labels/yaml_merge.rb
|
115
117
|
- lib/version.rb
|
116
118
|
homepage: https://rubygems.org/gems/build-labels
|
117
119
|
licenses:
|