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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 65b010085edf81afe7c8233594c9b8e115889cdfd02f15527d354d5482cf24d1
4
- data.tar.gz: ea5de615c2d4c76e9fd1f89fd222beb804060206ca6319feb0635ac114e2b7da
3
+ metadata.gz: 136f349f402dea79359c72b2090f93ca0c7fcb42ac20f6b8970d10790f26d3ea
4
+ data.tar.gz: 30922beac4518bb29e76412d2b0fe82a89e9bdf751f1dffe7dadcbc91daa8b81
5
5
  SHA512:
6
- metadata.gz: f263f65817da2c6afcef96d0968679f84905f7c7c51e4ddc96cae2b1372b0a0231137eb9685752b0aa88017c913da9e86f51d29953761891a8700fc152b71cd2
7
- data.tar.gz: 9abdac846de81dda6854f396b757051847a10bf3fc36c2f4ec72cd13f04d2d0f5fce7a814ee0a164b3f509923639c4b5785fbc102074a48e55f465d4a67c6ff2
6
+ metadata.gz: 6df527a5b44a190381ed74b2de006c26dccf6a11333357fc0baf16d6a14b10ceb2c41d6b58bf48d29a0667d9f01acb55b612b1226e5e29b2d1155d0358d65933
7
+ data.tar.gz: d725b94d57c9f266495639b326e171d06857a80283e6e71e08746a1e518624c8db8ce19753c8e40f6a2c2a00bb95343c67f4f3caced4753098be8e1e4afe2a8d
@@ -10,7 +10,7 @@
10
10
  # badge_service_token — write token for badge.cbp-org.internal
11
11
 
12
12
  when:
13
- event: [push, manual]
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
 
@@ -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.2.2)
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.2.2)
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
@@ -3,7 +3,7 @@
3
3
  module Rake
4
4
  module Gem
5
5
  module Maintenance
6
- VERSION = "0.2.2"
6
+ VERSION = "0.3.0"
7
7
  end
8
8
  end
9
9
  end
@@ -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.2.2
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.10
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: []