rake-gem-maintenance 0.2.2 → 0.3.0
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/.woodpecker/publish.yml +2 -2
- data/.woodpecker/renew_api_key.yml +1 -2
- data/.woodpecker/verify.yml +1 -1
- data/Gemfile.lock +2 -2
- data/lib/rake/gem/maintenance/ci_version_bump_task.rb +149 -0
- data/lib/rake/gem/maintenance/version.rb +1 -1
- data/lib/rake/gem/maintenance.rb +1 -0
- data/rake-gem-maintenance.gemspec +33 -0
- 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: 136f349f402dea79359c72b2090f93ca0c7fcb42ac20f6b8970d10790f26d3ea
|
|
4
|
+
data.tar.gz: 30922beac4518bb29e76412d2b0fe82a89e9bdf751f1dffe7dadcbc91daa8b81
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6df527a5b44a190381ed74b2de006c26dccf6a11333357fc0baf16d6a14b10ceb2c41d6b58bf48d29a0667d9f01acb55b612b1226e5e29b2d1155d0358d65933
|
|
7
|
+
data.tar.gz: d725b94d57c9f266495639b326e171d06857a80283e6e71e08746a1e518624c8db8ce19753c8e40f6a2c2a00bb95343c67f4f3caced4753098be8e1e4afe2a8d
|
data/.woodpecker/publish.yml
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# badge_service_token — write token for badge.cbp-org.internal
|
|
11
11
|
|
|
12
12
|
when:
|
|
13
|
-
event:
|
|
13
|
+
event: push
|
|
14
14
|
branch: main
|
|
15
15
|
|
|
16
16
|
labels:
|
|
@@ -34,7 +34,7 @@ steps:
|
|
|
34
34
|
RUBYGEMS_OTP_SEED:
|
|
35
35
|
from_secret: rubygems_otp_seed
|
|
36
36
|
commands:
|
|
37
|
-
- apk add --no-cache build-base git
|
|
37
|
+
- apk add --no-cache build-base git yaml-dev
|
|
38
38
|
- bundle install --jobs 4 --retry 3
|
|
39
39
|
- ruby scripts/ci_publish_rubygems.rb
|
|
40
40
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
when:
|
|
2
2
|
- event: cron
|
|
3
3
|
cron: monthly-renew-api-key
|
|
4
|
-
- event: manual
|
|
5
4
|
|
|
6
5
|
labels:
|
|
7
6
|
platform: linux
|
|
@@ -29,7 +28,7 @@ steps:
|
|
|
29
28
|
from_secret: woodpecker_api_token
|
|
30
29
|
WOODPECKER_SERVER: "https://ci.cbp-org.internal"
|
|
31
30
|
commands:
|
|
32
|
-
- apk add --no-cache build-base
|
|
31
|
+
- apk add --no-cache build-base git yaml-dev
|
|
33
32
|
- bundle install --jobs 4 --retry 3
|
|
34
33
|
- bundle exec rake upgrade:renew_api_key
|
|
35
34
|
|
data/.woodpecker/verify.yml
CHANGED
|
@@ -19,7 +19,7 @@ steps:
|
|
|
19
19
|
environment:
|
|
20
20
|
CUCUMBER_PUBLISH_QUIET: "true"
|
|
21
21
|
commands:
|
|
22
|
-
- apk add --no-cache build-base git
|
|
22
|
+
- apk add --no-cache build-base git yaml-dev
|
|
23
23
|
- mkdir -p /root/.local/share/ruby-advisory-db/gems
|
|
24
24
|
- bundle install --jobs 4 --retry 3
|
|
25
25
|
- bundle exec rake verify
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
rake-gem-maintenance (0.
|
|
4
|
+
rake-gem-maintenance (0.3.0)
|
|
5
5
|
bundler-audit
|
|
6
6
|
gem-release
|
|
7
7
|
rake
|
|
@@ -254,7 +254,7 @@ CHECKSUMS
|
|
|
254
254
|
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
|
|
255
255
|
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
|
|
256
256
|
rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
|
|
257
|
-
rake-gem-maintenance (0.
|
|
257
|
+
rake-gem-maintenance (0.3.0)
|
|
258
258
|
rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe
|
|
259
259
|
rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e
|
|
260
260
|
rdoc (7.2.0) sha256=8650f76cd4009c3b54955eb5d7e3a075c60a57276766ebf36f9085e8c9f23192
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rake"
|
|
4
|
+
require "rake/tasklib"
|
|
5
|
+
require "net/http"
|
|
6
|
+
require "openssl"
|
|
7
|
+
require "base64"
|
|
8
|
+
require "open3"
|
|
9
|
+
|
|
10
|
+
module Rake
|
|
11
|
+
module Gem
|
|
12
|
+
module Maintenance
|
|
13
|
+
# Defines `version:ci_bump` — auto-bump for CI push pipelines.
|
|
14
|
+
#
|
|
15
|
+
# Checks whether the current version is already published at the configured
|
|
16
|
+
# registry. If yes: patch-bumps, commits with [skip ci], tags, and pushes.
|
|
17
|
+
# If no: assumes the developer already bumped and does nothing.
|
|
18
|
+
# Either way skips if the HEAD commit message contains any skip_pattern.
|
|
19
|
+
#
|
|
20
|
+
# Usage in Rakefile:
|
|
21
|
+
# Rake::Gem::Maintenance::CiVersionBumpTask.new do |t|
|
|
22
|
+
# t.registry_url = 'https://gems.cbp-org.internal'
|
|
23
|
+
# t.ca_cert_env = 'CBP_ORG_CA_CERT' # base64-encoded PEM, optional
|
|
24
|
+
# t.push_token_env = 'FORGEJO_PUSH_TOKEN' # token for git push auth, optional
|
|
25
|
+
# end
|
|
26
|
+
class CiVersionBumpTask < ::Rake::TaskLib
|
|
27
|
+
attr_accessor :registry_url, :ca_cert_env, :push_token_env,
|
|
28
|
+
:skip_patterns, :push_branch, :git_author_email, :git_author_name
|
|
29
|
+
|
|
30
|
+
def initialize
|
|
31
|
+
super
|
|
32
|
+
@registry_url = "https://rubygems.org"
|
|
33
|
+
@ca_cert_env = nil
|
|
34
|
+
@push_token_env = nil
|
|
35
|
+
@skip_patterns = ["[skip bump]", "[skip ci]"]
|
|
36
|
+
@push_branch = "main"
|
|
37
|
+
@git_author_email = "ci@cbp-org.internal"
|
|
38
|
+
@git_author_name = "CBP-Org-CI"
|
|
39
|
+
yield self if block_given?
|
|
40
|
+
define_tasks
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
def define_tasks
|
|
46
|
+
desc "CI auto-bump: patch-bump if already published; skip if developer already bumped"
|
|
47
|
+
task "version:ci_bump" do
|
|
48
|
+
run_ci_bump
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def run_ci_bump
|
|
53
|
+
return if head_opts_out?
|
|
54
|
+
|
|
55
|
+
current = current_version
|
|
56
|
+
if already_published?(current)
|
|
57
|
+
puts "auto-bump: #{current} is already published — bumping patch"
|
|
58
|
+
perform_bump(current)
|
|
59
|
+
else
|
|
60
|
+
puts "auto-bump: #{current} not yet published — no action needed"
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def head_opts_out?
|
|
65
|
+
msg = head_commit_message
|
|
66
|
+
return false unless skip?(msg)
|
|
67
|
+
|
|
68
|
+
puts "auto-bump: HEAD opts out — leaving version alone"
|
|
69
|
+
true
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def perform_bump(current)
|
|
73
|
+
system("git checkout -- .") or abort("auto-bump: git checkout failed")
|
|
74
|
+
system("bundle exec gem bump --version patch --file #{version_file} --no-commit") or
|
|
75
|
+
abort("auto-bump: gem bump failed")
|
|
76
|
+
new_version = current_version
|
|
77
|
+
abort("auto-bump: gem bump did not change version") if new_version == current
|
|
78
|
+
puts "auto-bump: bumped to #{new_version}"
|
|
79
|
+
commit_and_push(new_version)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def commit_and_push(new_version)
|
|
83
|
+
git_cfg = ["-c", "user.email=#{git_author_email}", "-c", "user.name=#{git_author_name}"]
|
|
84
|
+
system("git", *git_cfg, "add", version_file) or abort("auto-bump: git add failed")
|
|
85
|
+
system("git", *git_cfg, "commit", "-m",
|
|
86
|
+
"chore: auto-bump version to #{new_version} [skip ci]") or
|
|
87
|
+
abort("auto-bump: git commit failed")
|
|
88
|
+
system("git", "tag", "v#{new_version}") or abort("auto-bump: git tag failed")
|
|
89
|
+
system("git", "push", authenticated_url(origin_url), "HEAD:#{push_branch}",
|
|
90
|
+
"--tags") or abort("auto-bump: git push failed")
|
|
91
|
+
puts "auto-bump: pushed v#{new_version}"
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def skip?(message)
|
|
95
|
+
skip_patterns.any? { |pattern| message.include?(pattern) }
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def head_commit_message
|
|
99
|
+
stdout, status = Open3.capture2("git log -1 --pretty=%B")
|
|
100
|
+
status.success? ? stdout.strip : abort("auto-bump: git log failed")
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def origin_url
|
|
104
|
+
url, status = Open3.capture2("git remote get-url origin")
|
|
105
|
+
status.success? ? url.strip : abort("auto-bump: could not determine origin URL")
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def current_version
|
|
109
|
+
content = File.read(version_file)
|
|
110
|
+
content[/VERSION\s*=\s*['"]([^'"]+)['"]/, 1] ||
|
|
111
|
+
abort("auto-bump: could not parse VERSION from #{version_file}")
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def already_published?(version)
|
|
115
|
+
uri = URI("#{registry_url}/gems/#{gem_name}-#{version}.gem")
|
|
116
|
+
res = Net::HTTP.start(uri.host, uri.port,
|
|
117
|
+
use_ssl: true, cert_store: build_cert_store,
|
|
118
|
+
verify_mode: OpenSSL::SSL::VERIFY_PEER) { |h| h.head(uri.path) }
|
|
119
|
+
res.is_a?(Net::HTTPSuccess)
|
|
120
|
+
rescue StandardError
|
|
121
|
+
false
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def build_cert_store
|
|
125
|
+
store = OpenSSL::X509::Store.new
|
|
126
|
+
store.set_default_paths
|
|
127
|
+
if ca_cert_env && (b64 = ENV.fetch(ca_cert_env, nil))
|
|
128
|
+
store.add_cert(OpenSSL::X509::Certificate.new(Base64.decode64(b64)))
|
|
129
|
+
end
|
|
130
|
+
store
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def authenticated_url(url)
|
|
134
|
+
return url unless push_token_env && (token = ENV.fetch(push_token_env, nil))
|
|
135
|
+
|
|
136
|
+
url.sub("https://", "https://x-access-token:#{token}@")
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def version_file
|
|
140
|
+
@version_file ||= Dir.glob("lib/**/version.rb").first
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def gem_name
|
|
144
|
+
@gem_name ||= ::Gem::Specification.load(Dir.glob("*.gemspec").first).name
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
data/lib/rake/gem/maintenance.rb
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative "maintenance/version"
|
|
4
4
|
require_relative "maintenance/version_bump_task"
|
|
5
|
+
require_relative "maintenance/ci_version_bump_task"
|
|
5
6
|
require_relative "maintenance/ci_environment"
|
|
6
7
|
require_relative "maintenance/credential_store"
|
|
7
8
|
require_relative "maintenance/ruby_version_checker"
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "lib/rake/gem/maintenance/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = "rake-gem-maintenance"
|
|
7
|
+
spec.version = Rake::Gem::Maintenance::VERSION
|
|
8
|
+
spec.authors = ["Christophe Broult"]
|
|
9
|
+
spec.email = ["cbroult@yahoo.com"]
|
|
10
|
+
|
|
11
|
+
spec.summary = "Rake tasks for gem maintenance: dependency upgrades and version bumps."
|
|
12
|
+
spec.description = "Provides reusable Rake::TaskLib subclasses for upgrading gem dependencies and bumping versions."
|
|
13
|
+
spec.homepage = "https://github.com/cbroult/rake-gem-maintenance"
|
|
14
|
+
spec.license = "MIT"
|
|
15
|
+
spec.required_ruby_version = ">= 3.3.7"
|
|
16
|
+
|
|
17
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
|
18
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
|
19
|
+
spec.metadata["changelog_uri"] = File.join(spec.homepage, "Changelog")
|
|
20
|
+
spec.metadata["rubygems_mfa_required"] = "true"
|
|
21
|
+
|
|
22
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
23
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
|
24
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
spec.require_paths = ["lib"]
|
|
28
|
+
|
|
29
|
+
spec.add_dependency "bundler-audit"
|
|
30
|
+
spec.add_dependency "gem-release"
|
|
31
|
+
spec.add_dependency "rake"
|
|
32
|
+
spec.add_dependency "rotp"
|
|
33
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rake-gem-maintenance
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Christophe Broult
|
|
@@ -89,6 +89,7 @@ files:
|
|
|
89
89
|
- lib/rake/gem/maintenance.rb
|
|
90
90
|
- lib/rake/gem/maintenance/api_key_renewer.rb
|
|
91
91
|
- lib/rake/gem/maintenance/ci_environment.rb
|
|
92
|
+
- lib/rake/gem/maintenance/ci_version_bump_task.rb
|
|
92
93
|
- lib/rake/gem/maintenance/credential_store.rb
|
|
93
94
|
- lib/rake/gem/maintenance/gem_publisher.rb
|
|
94
95
|
- lib/rake/gem/maintenance/gem_push.rb
|
|
@@ -104,6 +105,7 @@ files:
|
|
|
104
105
|
- lib/rake/gem/maintenance/version.rb
|
|
105
106
|
- lib/rake/gem/maintenance/version_bump_task.rb
|
|
106
107
|
- lib/rake/gem/maintenance/woodpecker_secret_store.rb
|
|
108
|
+
- rake-gem-maintenance.gemspec
|
|
107
109
|
- scripts/ci_publish_rubygems.rb
|
|
108
110
|
homepage: https://github.com/cbroult/rake-gem-maintenance
|
|
109
111
|
licenses:
|
|
@@ -127,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
127
129
|
- !ruby/object:Gem::Version
|
|
128
130
|
version: '0'
|
|
129
131
|
requirements: []
|
|
130
|
-
rubygems_version: 4.0.
|
|
132
|
+
rubygems_version: 4.0.11
|
|
131
133
|
specification_version: 4
|
|
132
134
|
summary: 'Rake tasks for gem maintenance: dependency upgrades and version bumps.'
|
|
133
135
|
test_files: []
|