retag 0.1.3 → 0.1.7
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 +1 -1
- data/bin/retag +96 -22
- data/lib/retag/repo.rb +17 -27
- data/lib/retag/service.rb +2 -2
- data/lib/retag/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e71af667189dceff7c2606302321bedfa7defebc54e3c77d73a3d4d2a1d1cfe8
|
4
|
+
data.tar.gz: cfdbf324852f22a679609651ed49b1bb7519247d778ace647f056673620aed56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b324b0efdaa8e56771c8fc2ab5867d67c4a641eab9531a614d1d4d510fb07d4ec9d3e8248a661970f498f8d5291def7ea0c641d478879ff7fdf48d5c632ec47a
|
7
|
+
data.tar.gz: 51967abd9fec922eb7de05eaec2a4cbf244d318498c82d8347d15a2df86e51b66c02531f55eb2aa8b61aa5810af5e00e0bdaf907e70735bc184adebccbc14fff
|
data/Gemfile.lock
CHANGED
data/bin/retag
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'yaml'
|
4
|
+
require 'erb'
|
4
5
|
require 'thor'
|
5
6
|
require 'colorize'
|
6
7
|
require 'retag'
|
@@ -10,36 +11,67 @@ ENV_PREFIX = 'RETAG'
|
|
10
11
|
$logger = ActiveSupport::TaggedLogging.new(Retag::Logger.new(STDOUT))
|
11
12
|
$logger.level = :info
|
12
13
|
|
13
|
-
class Cli < Thor
|
14
14
|
|
15
|
-
def self.exit_on_failure?
|
16
|
-
true
|
17
|
-
end
|
18
|
-
|
19
|
-
package_name "Retag is cli to manipulate docker images in handy way.
|
20
15
|
|
21
|
-
|
22
|
-
|
16
|
+
class RepoCommand < Thor
|
17
|
+
desc "tag <project> <tag>", "Create tag in Gitlab project"
|
18
|
+
long_desc <<-LONGDESC
|
19
|
+
LONGDESC
|
20
|
+
option :force, default: false,
|
21
|
+
required: false,
|
22
|
+
type: :boolean,
|
23
|
+
desc: "Override Gitlab tag if exists"
|
23
24
|
|
24
|
-
#{
|
25
|
+
option :ref, default: ENV.fetch("#{ENV_PREFIX}_TAG_REF", 'master'),
|
26
|
+
required: true,
|
27
|
+
type: :string,
|
28
|
+
desc: "Gtilab refspec from which create tag"
|
25
29
|
|
26
|
-
|
27
|
-
|
30
|
+
option :message, default: nil,
|
31
|
+
type: :string,
|
32
|
+
desc: "Tag message"
|
28
33
|
|
29
|
-
def
|
30
|
-
|
34
|
+
def tag(project, tag)
|
35
|
+
opts = options.to_h.dup
|
36
|
+
$logger.level = :debug if opts['verbose']
|
37
|
+
|
38
|
+
begin
|
39
|
+
Gitlab.client.delete_tag(project, tag).inspect
|
40
|
+
rescue Gitlab::Error::NotFound
|
41
|
+
# Success: there is no such tag
|
42
|
+
end if opts['force']
|
43
|
+
|
44
|
+
puts Gitlab.client.create_tag(project, tag, options['ref'], options['message']).inspect
|
31
45
|
end
|
32
46
|
|
33
|
-
desc
|
34
|
-
|
47
|
+
desc "release <project> <tag>", "Create tag in Gitlab project"
|
48
|
+
long_desc <<-LONGDESC
|
49
|
+
LONGDESC
|
50
|
+
|
51
|
+
option :ref, default: ENV.fetch("#{ENV_PREFIX}_RELEASE_REF", 'master'),
|
52
|
+
required: true,
|
53
|
+
type: :string,
|
54
|
+
desc: "Gtilab refspec from which create tag"
|
55
|
+
|
56
|
+
option :description, default: nil,
|
57
|
+
type: :string,
|
58
|
+
desc: "description Markdown"
|
59
|
+
def release(project, tag)
|
60
|
+
Gitlab.client.create_project_release(project, name: tag, tag_name: tag, description: description, ref: options['ref'])
|
61
|
+
end
|
62
|
+
end
|
35
63
|
|
64
|
+
class DockerCommand < Thor
|
65
|
+
desc "tag", "Tag Docker image without downloading"
|
66
|
+
long_desc <<-LONGDESC
|
67
|
+
LONGDESC
|
36
68
|
option :image, default: ENV.fetch("#{ENV_PREFIX}_TAG_IMAGE", nil),
|
37
69
|
required: true,
|
38
70
|
desc: "Env: #{ENV_PREFIX}_TAG_IMAGE. Full image to be tagged. Ex: docker.rnds.pro/aggredator/service-uprid3:latest"
|
39
71
|
|
40
72
|
option :tag, default: ENV.fetch("#{ENV_PREFIX}_TAG_TAG", nil),
|
41
73
|
required: true,
|
42
|
-
desc: "Env: #{ENV_PREFIX}_TAG_TAG. New tag
|
74
|
+
desc: "Env: #{ENV_PREFIX}_TAG_TAG. New tag"
|
43
75
|
|
44
76
|
option :suffix, default: ENV.fetch("#{ENV_PREFIX}_TAG_SUFFIX", nil),
|
45
77
|
required: false,
|
@@ -51,6 +83,8 @@ class Cli < Thor
|
|
51
83
|
|
52
84
|
def tag(*_args)
|
53
85
|
opts = options.to_h.dup
|
86
|
+
$logger.level = :debug if opts['verbose']
|
87
|
+
|
54
88
|
img, tag = opts['image'].split(':')
|
55
89
|
tag ||= 'latest'
|
56
90
|
tag = opts['suffix'].present? ? "#{tag}-#{opts['suffix']}" : tag
|
@@ -59,10 +93,14 @@ class Cli < Thor
|
|
59
93
|
image.retag!(opts['tag'])
|
60
94
|
end
|
61
95
|
|
96
|
+
end
|
62
97
|
|
63
|
-
|
64
|
-
|
98
|
+
class ReleaseCommand < Thor
|
99
|
+
default_command :release
|
65
100
|
|
101
|
+
desc "release", "Release projects bundler from release.yml manifest"
|
102
|
+
long_desc <<-LONGDESC
|
103
|
+
LONGDESC
|
66
104
|
option :config, default: ENV.fetch("#{ENV_PREFIX}_RELEASE_CONFIG", './release.yml'),
|
67
105
|
required: true,
|
68
106
|
desc: "Env: #{ENV_PREFIX}_RELEASE_CONFIG. Path to release manifest"
|
@@ -73,14 +111,17 @@ class Cli < Thor
|
|
73
111
|
|
74
112
|
def release(*_args)
|
75
113
|
opts = options.to_h.dup
|
76
|
-
|
114
|
+
$logger.level = :debug if opts['verbose']
|
115
|
+
|
116
|
+
config = YAML.load(ERB.new(File.read(File.expand_path(opts['config']))).result)
|
77
117
|
config['release'] = opts['name'] || config['release']
|
78
118
|
|
79
119
|
release = config['release'].to_s
|
80
|
-
suffix = config['suffix']
|
120
|
+
suffix = config['default-suffix']
|
121
|
+
branch = config['default-branch']
|
81
122
|
|
82
|
-
services = config['services'].map do|(name, cfg)|
|
83
|
-
Retag::Service.new(name, cfg, release, suffix: cfg.fetch('suffix', suffix)) unless name.start_with?('.')
|
123
|
+
services = config['services'].map do|(name, cfg)|
|
124
|
+
Retag::Service.new(name, cfg, release, suffix: cfg.fetch('suffix', suffix), branch: cfg.fetch('branch', branch)) unless name.start_with?('.')
|
84
125
|
end.compact
|
85
126
|
|
86
127
|
tag_message = "Release #{release} at #{DateTime.now.iso8601}"
|
@@ -120,4 +161,37 @@ class Cli < Thor
|
|
120
161
|
|
121
162
|
end
|
122
163
|
|
164
|
+
|
165
|
+
class Cli < Thor
|
166
|
+
|
167
|
+
def self.exit_on_failure?
|
168
|
+
true
|
169
|
+
end
|
170
|
+
|
171
|
+
package_name "Retag is cli to manipulate docker images in handy way.
|
172
|
+
|
173
|
+
# Gitlab authorization
|
174
|
+
Using GITLAB_API_ENDPOINT and GITLAB_API_PRIVATE_TOKEN environment variable used for authorization
|
175
|
+
|
176
|
+
#{File.basename(__FILE__)}"
|
177
|
+
|
178
|
+
class_option :verbose, type: :boolean
|
179
|
+
|
180
|
+
desc 'version', 'Display version'
|
181
|
+
map %w[-v --version] => :version
|
182
|
+
|
183
|
+
def version
|
184
|
+
say Retag::VERSION
|
185
|
+
end
|
186
|
+
|
187
|
+
desc "repo SUBCOMMAND ...ARGS", "Manage git repository stuffs"
|
188
|
+
subcommand "repo", RepoCommand
|
189
|
+
|
190
|
+
desc "docker SUBCOMMAND ...ARGS", "Manage docker stuffs"
|
191
|
+
subcommand "docker", DockerCommand
|
192
|
+
|
193
|
+
desc "release SUBCOMMAND ...ARGS", "Manage releases"
|
194
|
+
subcommand "release", ReleaseCommand
|
195
|
+
end
|
196
|
+
|
123
197
|
::Cli.start
|
data/lib/retag/repo.rb
CHANGED
@@ -31,37 +31,27 @@ module Retag
|
|
31
31
|
|
32
32
|
def revision
|
33
33
|
@revision ||= begin
|
34
|
-
|
34
|
+
# "^{}" means the object could be a tag. https://mirrors.edge.kernel.org/pub/software/scm/git/docs/gitrevisions.html#_specifying_revisions
|
35
|
+
# Example:
|
36
|
+
# git ls-remote git@gir.example.com:repo.git | grep release-latest
|
37
|
+
# 174cf2b6685df563e59c5cd0d367996fcf24f0ae refs/tags/release-latest <-- annotated tag itself
|
38
|
+
# 47208e276cd277896887417a383e05973278438c refs/tags/release-latest^{} <-- WE NEED: original commit tag is references to
|
39
|
+
rev_name_pair = remote_refs(repo, branch+"^{}") # try to find commit tag is references to
|
40
|
+
rev_name_pair ||= remote_refs(repo, branch) # try to find simple branch or commit
|
41
|
+
|
42
|
+
raise "There is no '#{branch}' revision at #{repo}" if rev_name_pair.nil?
|
43
|
+
|
44
|
+
rev, _name = rev_name_pair.split
|
35
45
|
rev[0..7]
|
36
46
|
end
|
37
47
|
end
|
38
48
|
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
|
49
|
+
private
|
43
50
|
|
51
|
+
def remote_refs repo, branch
|
52
|
+
cmd!("git ls-remote #{repo} #{branch}", capture: true).split("\n").select{|line| line.strip.end_with?("/#{branch}") }.first
|
53
|
+
end
|
44
54
|
|
45
|
-
|
46
|
-
|
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
|
-
|
55
|
+
end
|
56
|
+
end
|
67
57
|
|
data/lib/retag/service.rb
CHANGED
@@ -9,10 +9,10 @@ module Retag
|
|
9
9
|
|
10
10
|
delegate :revision, :branch, to: :repo
|
11
11
|
|
12
|
-
def initialize(name, config, release, suffix:
|
12
|
+
def initialize(name, config, release, branch:, suffix:)
|
13
13
|
@name = name
|
14
14
|
@config = config
|
15
|
-
@repo = Retag::Repo.new(config['repo'],
|
15
|
+
@repo = Retag::Repo.new(config['repo'], branch)
|
16
16
|
@release = release
|
17
17
|
@suffix = suffix
|
18
18
|
end
|
data/lib/retag/version.rb
CHANGED