retag 0.1.2 → 0.1.3
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/Gemfile.lock +12 -1
- data/bin/retag +34 -78
- data/lib/retag/image.rb +0 -12
- data/lib/retag/repo.rb +67 -0
- data/lib/retag/service.rb +6 -30
- data/lib/retag/version.rb +1 -1
- data/lib/retag.rb +2 -0
- data/retag.gemspec +2 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e2df15980e560df6495c0565d3b2eef9ea085c34ff1756dc53861e058c31833f
|
4
|
+
data.tar.gz: 0db02684208f5b8e4b97a6230495025a9033d7b8dfc2ecb3df4294c03b79eec6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d71f1915637a2ca9b256094d49f615cc4f54413338467f82589853f172a4fb41992eb58db19b7bea0ae45743438c0ca80d3409994b2d1450e18ea30473ad762
|
7
|
+
data.tar.gz: 87ad3d50a71c22574565437d3192333bfe47a006ecdc1d8f26d86f3eba1a5e2a884bf7699176b82f528bd91c07761f629169bd87067619f6e3b373514a061520
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
retag (0.1.
|
4
|
+
retag (0.1.3)
|
5
5
|
activesupport (~> 6.0)
|
6
6
|
colorize
|
7
|
+
gitlab
|
7
8
|
json
|
8
9
|
thor
|
9
10
|
uri
|
@@ -28,11 +29,21 @@ GEM
|
|
28
29
|
rexml
|
29
30
|
diff-lcs (1.5.0)
|
30
31
|
docile (1.4.0)
|
32
|
+
gitlab (4.18.0)
|
33
|
+
httparty (~> 0.18)
|
34
|
+
terminal-table (>= 1.5.1)
|
31
35
|
hashdiff (1.0.1)
|
36
|
+
httparty (0.20.0)
|
37
|
+
mime-types (~> 3.0)
|
38
|
+
multi_xml (>= 0.5.2)
|
32
39
|
i18n (1.8.11)
|
33
40
|
concurrent-ruby (~> 1.0)
|
34
41
|
json (2.6.1)
|
42
|
+
mime-types (3.4.1)
|
43
|
+
mime-types-data (~> 3.2015)
|
44
|
+
mime-types-data (3.2022.0105)
|
35
45
|
minitest (5.15.0)
|
46
|
+
multi_xml (0.6.0)
|
36
47
|
parallel (1.21.0)
|
37
48
|
parser (3.1.0.0)
|
38
49
|
ast (~> 2.4.1)
|
data/bin/retag
CHANGED
@@ -5,46 +5,23 @@ require 'thor'
|
|
5
5
|
require 'colorize'
|
6
6
|
require 'retag'
|
7
7
|
|
8
|
-
UTIL = File.basename(__FILE__)
|
9
8
|
ENV_PREFIX = 'RETAG'
|
10
9
|
|
11
10
|
$logger = ActiveSupport::TaggedLogging.new(Retag::Logger.new(STDOUT))
|
12
|
-
$logger.level = :
|
13
|
-
|
14
|
-
# config = YAML.load_file('release.yml')
|
15
|
-
# release = config['release']
|
16
|
-
# services = config['services'].map{|(name, cfg)| Service.new(name, cfg, release)}
|
17
|
-
|
18
|
-
# services.each do |srv|
|
19
|
-
# $logger.tagged(srv.name, srv.revision) do
|
20
|
-
# $logger.info "==> Releasing service #{srv.name} from #{srv.repo} at #{srv.branch}:"
|
21
|
-
# $logger.shift do
|
22
|
-
# #$logger.info "* Pulling service..."
|
23
|
-
# #srv.pull
|
24
|
-
# $logger.info "* Tagging service..."
|
25
|
-
# srv.release!
|
26
|
-
# #$logger.info "* Pushing service..."
|
27
|
-
# #srv.push
|
28
|
-
# #$logger.info "* Cleaning service..."
|
29
|
-
# #srv.rm
|
30
|
-
# end
|
31
|
-
# end
|
32
|
-
# end
|
33
|
-
|
34
|
-
# $logger.info "==> #{services.count} relesed as #{release}"
|
11
|
+
$logger.level = :info
|
35
12
|
|
36
13
|
class Cli < Thor
|
37
14
|
|
38
15
|
def self.exit_on_failure?
|
39
16
|
true
|
40
17
|
end
|
18
|
+
|
19
|
+
package_name "Retag is cli to manipulate docker images in handy way.
|
41
20
|
|
42
|
-
#
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
# class_option :service_tag, default: ENV.fetch('SERVICE_TAG', 'latest'),
|
47
|
-
# desc: 'Docker image tag to build. Taken from SERVICE_TAG enviroment variable'
|
21
|
+
# Gitlab authorization
|
22
|
+
Using GITLAB_API_ENDPOINT and GITLAB_API_PRIVATE_TOKEN environment variable used for authorization
|
23
|
+
|
24
|
+
#{File.basename(__FILE__)}"
|
48
25
|
|
49
26
|
desc 'version', 'Display version'
|
50
27
|
map %w[-v --version] => :version
|
@@ -53,7 +30,7 @@ class Cli < Thor
|
|
53
30
|
say Retag::VERSION
|
54
31
|
end
|
55
32
|
|
56
|
-
desc 'tag',
|
33
|
+
desc 'tag', "Tag Docker image without downloading"
|
57
34
|
map %w[--tag] => :tag
|
58
35
|
|
59
36
|
option :image, default: ENV.fetch("#{ENV_PREFIX}_TAG_IMAGE", nil),
|
@@ -82,6 +59,7 @@ class Cli < Thor
|
|
82
59
|
image.retag!(opts['tag'])
|
83
60
|
end
|
84
61
|
|
62
|
+
|
85
63
|
desc 'release', 'Release projects bundler from release.yml manifest'
|
86
64
|
map %w[--release] => :release
|
87
65
|
|
@@ -98,70 +76,48 @@ class Cli < Thor
|
|
98
76
|
config = YAML.load_file(File.expand_path(opts['config']))
|
99
77
|
config['release'] = opts['name'] || config['release']
|
100
78
|
|
101
|
-
release = config['release']
|
79
|
+
release = config['release'].to_s
|
102
80
|
suffix = config['suffix']
|
103
81
|
|
104
82
|
services = config['services'].map do|(name, cfg)|
|
105
83
|
Retag::Service.new(name, cfg, release, suffix: cfg.fetch('suffix', suffix)) unless name.start_with?('.')
|
106
84
|
end.compact
|
107
85
|
|
86
|
+
tag_message = "Release #{release} at #{DateTime.now.iso8601}"
|
87
|
+
|
88
|
+
$logger.info "*** Starting '#{tag_message.colorize(mode: :bold)}'...".colorize(:cyan)
|
89
|
+
|
108
90
|
services.each do |srv|
|
109
91
|
$logger.tagged(srv.name.colorize(:yellow), "#{srv.revision.colorize(mode: :bold)}@#{srv.branch}") do
|
110
|
-
$logger.info "#{'==>'.colorize(mode: :bold, color: :white)} Releasing service #{srv.name.colorize(:
|
92
|
+
$logger.info "#{'==>'.colorize(mode: :bold, color: :white)} Releasing service #{srv.name.colorize(mode: :bold)} from #{srv.repo.repo} at #{srv.branch.colorize(mode: :bold)}:".colorize(:green)
|
111
93
|
$logger.shift do
|
112
94
|
srv.images.each do |img|
|
113
|
-
$logger.info "
|
114
|
-
|
115
|
-
$logger.
|
95
|
+
$logger.info ">>> Image #{img.image}"
|
96
|
+
|
97
|
+
$logger.shift do
|
98
|
+
$logger.info "From ".ljust(5) + "[#{img.tag.colorize(:yellow)}]: ".ljust(35) + img.full
|
99
|
+
newimg = img.retag!(release)
|
100
|
+
$logger.info "To ".ljust(5) + "[#{newimg.tag.colorize(:yellow)}]: ".ljust(35) + newimg.full
|
101
|
+
end
|
102
|
+
|
103
|
+
$logger.info ">>> Repo #{srv.repo.repo}"
|
104
|
+
|
105
|
+
$logger.shift do
|
106
|
+
$logger.info "From ".ljust(5) + "[#{srv.revision.colorize(:yellow)}]: ".ljust(35) + "#{srv.repo.repo}~#{srv.revision}@#{srv.branch}"
|
107
|
+
newimg = img.retag!(release)
|
108
|
+
$logger.info "To ".ljust(5) + "[#{release.colorize(:yellow)}]: ".ljust(35) + "#{srv.repo.repo}~#{srv.revision}@#{release}"
|
109
|
+
end
|
110
|
+
|
111
|
+
srv.repo.tag!(release, message: tag_message)
|
116
112
|
end
|
117
|
-
|
118
|
-
#$logger.info "* Pulling service..."
|
119
|
-
#srv.pull
|
120
|
-
#$logger.info "* Tagging service..."
|
121
|
-
#srv.release!
|
122
|
-
#$logger.info "* Pushing service..."
|
123
|
-
#srv.push
|
124
|
-
#$logger.info "* Cleaning service..."
|
125
|
-
#srv.rm
|
126
113
|
end
|
127
114
|
end
|
128
115
|
end
|
129
116
|
|
130
|
-
|
117
|
+
$logger.info "*** Completed '#{tag_message.colorize(mode: :bold)}'".colorize(:cyan)
|
131
118
|
|
132
|
-
|
133
|
-
|
134
|
-
def cache_image(opts)
|
135
|
-
"#{opts['service_image']}_cache:latest"
|
136
|
-
end
|
119
|
+
end
|
137
120
|
|
138
121
|
end
|
139
122
|
|
140
123
|
::Cli.start
|
141
|
-
|
142
|
-
# puts ARGV.inspect
|
143
|
-
|
144
|
-
# parser.parse!
|
145
|
-
|
146
|
-
# puts ARGV.inspect
|
147
|
-
|
148
|
-
# warn parser.help
|
149
|
-
# exit 1
|
150
|
-
|
151
|
-
# config = {
|
152
|
-
# services: [
|
153
|
-
# {core: {images: []}}
|
154
|
-
# ]
|
155
|
-
# }
|
156
|
-
|
157
|
-
# release=$(cat .release | head -n 1)
|
158
|
-
|
159
|
-
# for line in "${services[@]}"; do
|
160
|
-
# module=$(echo $line | cut -f1 -d '|')
|
161
|
-
# repo=$(echo $line | cut -f2 -d '|')
|
162
|
-
# branch=$(echo $line | cut -f3 -d '|')
|
163
|
-
|
164
|
-
# echo "Tagging ${module} from ${branch} of ${repo}"
|
165
|
-
# git subtree push --prefix="src/${module}" "${repo}" "feature/otr"
|
166
|
-
# done
|
167
|
-
|
data/lib/retag/image.rb
CHANGED
@@ -35,18 +35,6 @@ module Retag
|
|
35
35
|
Image.new(image, newtag)
|
36
36
|
end
|
37
37
|
|
38
|
-
def pull(img = full)
|
39
|
-
cmd!("docker pull -q #{img}")
|
40
|
-
end
|
41
|
-
|
42
|
-
def push(img = full)
|
43
|
-
cmd!("docker push -q #{img}")
|
44
|
-
end
|
45
|
-
|
46
|
-
def rm(img = full)
|
47
|
-
cmd!("docker rmi #{img}")
|
48
|
-
end
|
49
|
-
|
50
38
|
end
|
51
39
|
end
|
52
40
|
|
data/lib/retag/repo.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
|
2
|
+
module Retag
|
3
|
+
class Repo
|
4
|
+
|
5
|
+
include Utils
|
6
|
+
attr_reader :repo, :branch, :revision, :name
|
7
|
+
|
8
|
+
def initialize(repo, branch)
|
9
|
+
@repo = repo
|
10
|
+
@branch = branch
|
11
|
+
@gitlab = Gitlab.client
|
12
|
+
end
|
13
|
+
|
14
|
+
def tag!(tag, message: nil)
|
15
|
+
begin
|
16
|
+
result = @gitlab.tag(name, tag)
|
17
|
+
if result.to_h.dig('commit', 'short_id').to_s == revision
|
18
|
+
# Success: tag with same revision already exists
|
19
|
+
return true
|
20
|
+
end
|
21
|
+
rescue Gitlab::Error::NotFound
|
22
|
+
# Success: there is no such tag
|
23
|
+
end
|
24
|
+
|
25
|
+
@gitlab.create_tag(name, tag, revision, message)
|
26
|
+
end
|
27
|
+
|
28
|
+
def name
|
29
|
+
@name ||= @repo.split(':').last.gsub('.git', '')
|
30
|
+
end
|
31
|
+
|
32
|
+
def revision
|
33
|
+
@revision ||= begin
|
34
|
+
rev, _name = cmd!("git ls-remote #{repo} #{branch}", capture: true).split("\n").select{|line| line["heads/#{branch}"] }.first.split
|
35
|
+
rev[0..7]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
# ==> /var/log/gitlab/gitlab-rails/api_json.log <==
|
46
|
+
# {"time":"2022-01-21T10:48:07.308Z","severity":"INFO",
|
47
|
+
# "duration_s":0.20214,"db_duration_s":0.00607,"view_duration_s":0.19607,"status":201,
|
48
|
+
# "method":"POST","path":"/api/v4/projects/aggredator%2Fservices%2Fuprid3/repository/tags",
|
49
|
+
# "params":[{"key":"tag_name","value":"testtag3"},{"key":"ref","value":"master"}],
|
50
|
+
# "host":"br.rnds.pro","remote_ip":"213.138.65.74, 172.22.20.31, 213.138.65.74","ua":"curl/7.79.1",
|
51
|
+
# "route":"/api/:version/projects/:id/repository/tags","user_id":38,"username":"bot",
|
52
|
+
# "queue_duration_s":0.008366,"gitaly_calls":1,"gitaly_duration_s":0.16823,"redis_calls":6,
|
53
|
+
# "redis_duration_s":0.004274,"redis_read_bytes":113,"redis_write_bytes":521,"redis_cache_calls":6,
|
54
|
+
# "redis_cache_duration_s":0.004274,"redis_cache_read_bytes":113,"redis_cache_write_bytes":521,"db_count":10,
|
55
|
+
# "db_write_count":0,"db_cached_count":0,"cpu_s":0.034309,"mem_objects":15111,"mem_bytes":920832,"mem_mallocs":3159,
|
56
|
+
# "mem_total_bytes":1525272,"correlation_id":"01FSY40ANS3TD0CJJTDCQXGQ1N","meta.user":"bot","meta.project":"aggredator/services/uprid3",
|
57
|
+
# "meta.root_namespace":"aggredator","meta.caller_id":"POST /api/:version/projects/:id/repository/tags",
|
58
|
+
# "meta.remote_ip":"213.138.65.74","meta.feature_category":"source_code_management","meta.client_id":
|
59
|
+
# "user/38","content_length":"0"}
|
60
|
+
|
61
|
+
# ==> /var/log/gitlab/gitlab-rails/api_json.log <==
|
62
|
+
# {"time":"2022-01-21T10:49:36.954Z","severity":"INFO",
|
63
|
+
# "duration_s":0.01892,"db_duration_s":0.0036,"view_duration_s":0.01532,"status":400,
|
64
|
+
# "method":"POST","path":"/api/v4/projects/aggredator%2Fservices%2Fuprid3/repository/tags",
|
65
|
+
# "params":[{"key":"tag_name","value":"44444444"},{"key":"ref","value":"509a3719"},{"key":"message","value":{"message":"hello"}},{"key":"release_description","value":""}],"host":"br.rnds.pro","remote_ip":"213.138.65.74, 172.22.20.31, 213.138.65.74","ua":"Gitlab Ruby Gem 4.18.0","route":"/api/:version/projects/:id/repository/tags","user_id":38,"username":"bot","queue_duration_s":0.007279,"db_count":6,"db_write_count":0,"db_cached_count":0,"cpu_s":0.022143,"mem_objects":11483,"mem_bytes":783064,"mem_mallocs":2634,"mem_total_bytes":1242384,"correlation_id":"01FSY432CZMEFNDJQ88HMNW0E8","meta.user":"bot","meta.project":"aggredator/services/uprid3","meta.root_namespace":"aggredator","meta.caller_id":"POST /api/:version/projects/:id/repository/tags","meta.remote_ip":"213.138.65.74","meta.feature_category":"source_code_management","meta.client_id":"user/38","content_length":"78"}
|
66
|
+
|
67
|
+
|
data/lib/retag/service.rb
CHANGED
@@ -1,15 +1,18 @@
|
|
1
|
+
require 'active_support/core_ext/module/delegation'
|
2
|
+
|
1
3
|
module Retag
|
2
4
|
class Service
|
3
5
|
|
4
6
|
include Retag::Utils
|
5
7
|
|
6
|
-
attr_reader :name, :config, :repo, :
|
8
|
+
attr_reader :name, :config, :repo, :release, :suffix
|
9
|
+
|
10
|
+
delegate :revision, :branch, to: :repo
|
7
11
|
|
8
12
|
def initialize(name, config, release, suffix: )
|
9
13
|
@name = name
|
10
14
|
@config = config
|
11
|
-
@repo = config['repo']
|
12
|
-
@branch = config['branch']
|
15
|
+
@repo = Retag::Repo.new(config['repo'], config.fetch('branch', 'master'))
|
13
16
|
@release = release
|
14
17
|
@suffix = suffix
|
15
18
|
end
|
@@ -17,33 +20,6 @@ module Retag
|
|
17
20
|
def images
|
18
21
|
@images ||= config['images'].map{|img| Retag::Image.new(img, revision, suffix: @suffix) }
|
19
22
|
end
|
20
|
-
|
21
|
-
def pull
|
22
|
-
images.each(&:pull)
|
23
|
-
end
|
24
|
-
|
25
|
-
def push
|
26
|
-
images.each(&:push)
|
27
|
-
end
|
28
|
-
|
29
|
-
def rm
|
30
|
-
images.each(&:rm)
|
31
|
-
end
|
32
|
-
|
33
|
-
def release!(tag = release)
|
34
|
-
images.each do |image|
|
35
|
-
image.retag!(tag)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def revision
|
40
|
-
@revision ||= begin
|
41
|
-
rev, _name = cmd!("git ls-remote #{repo} #{branch}", capture: true).split("\n").select{|line| line["heads/#{branch}"] }.first.split
|
42
|
-
rev[0..7]
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
|
47
23
|
end
|
48
24
|
end
|
49
25
|
|
data/lib/retag/version.rb
CHANGED
data/lib/retag.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'active_support'
|
4
|
+
require 'gitlab'
|
4
5
|
require_relative 'retag/version'
|
5
6
|
require_relative 'retag/logger'
|
6
7
|
require_relative 'retag/utils'
|
7
8
|
require_relative 'retag/image'
|
9
|
+
require_relative 'retag/repo'
|
8
10
|
require_relative 'retag/service'
|
9
11
|
|
10
12
|
module Retag
|
data/retag.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: retag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samoilenko Yuri
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-01-
|
11
|
+
date: 2022-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -212,6 +212,20 @@ dependencies:
|
|
212
212
|
- - ">="
|
213
213
|
- !ruby/object:Gem::Version
|
214
214
|
version: '0'
|
215
|
+
- !ruby/object:Gem::Dependency
|
216
|
+
name: gitlab
|
217
|
+
requirement: !ruby/object:Gem::Requirement
|
218
|
+
requirements:
|
219
|
+
- - ">="
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
version: '0'
|
222
|
+
type: :runtime
|
223
|
+
prerelease: false
|
224
|
+
version_requirements: !ruby/object:Gem::Requirement
|
225
|
+
requirements:
|
226
|
+
- - ">="
|
227
|
+
- !ruby/object:Gem::Version
|
228
|
+
version: '0'
|
215
229
|
description: Retag is cli to manipulate docker images in handy way
|
216
230
|
email:
|
217
231
|
- kinnalru@gmail.com
|
@@ -230,6 +244,7 @@ files:
|
|
230
244
|
- lib/retag.rb
|
231
245
|
- lib/retag/image.rb
|
232
246
|
- lib/retag/logger.rb
|
247
|
+
- lib/retag/repo.rb
|
233
248
|
- lib/retag/service.rb
|
234
249
|
- lib/retag/utils.rb
|
235
250
|
- lib/retag/version.rb
|