Skip to content

Commit 7aa6736

Browse files
authored
Merge pull request #690 from sparklemotion/publish-pipeline
ci: add release pipeline for publishing gems
2 parents 05c922b + a57b168 commit 7aa6736

File tree

3 files changed

+156
-89
lines changed

3 files changed

+156
-89
lines changed

.github/workflows/build-gems.yml

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
name: Build gems
2+
on:
3+
workflow_call:
4+
inputs:
5+
release:
6+
description: "Pass --release to bin/test-gem-build (skip timestamp version)"
7+
type: boolean
8+
default: false
9+
artifact_prefix:
10+
description: "Prefix for artifact names (e.g., 'release-v2.9.1-')"
11+
type: string
12+
default: ""
13+
ref:
14+
description: "Git ref to check out (e.g., a version tag). Defaults to the caller's ref."
15+
type: string
16+
default: ""
17+
18+
permissions:
19+
contents: read
20+
21+
jobs:
22+
native_setup:
23+
name: "Setup for native gem build"
24+
runs-on: ubuntu-latest
25+
outputs:
26+
rcd_image_version: ${{ steps.rcd_image_version.outputs.rcd_image_version }}
27+
steps:
28+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
29+
with:
30+
ref: ${{ inputs.ref || github.ref }}
31+
persist-credentials: false
32+
- uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
33+
with:
34+
path: ports/archives
35+
key: ports-archives-tarball-${{ hashFiles('ext/sqlite3/extconf.rb','dependencies.yml') }}
36+
- uses: ruby/setup-ruby@dffb23f65a78bba8db45d387d5ea1bbd6be3ef18 # v1.293.0
37+
with:
38+
ruby-version: "4.0"
39+
bundler-cache: true
40+
- run: bundle exec ruby ./ext/sqlite3/extconf.rb --download-dependencies
41+
- id: rcd_image_version
42+
run: bundle exec ruby -e 'require "rake_compiler_dock"; puts "rcd_image_version=#{RakeCompilerDock::IMAGE_VERSION}"' >> $GITHUB_OUTPUT
43+
44+
build_source_gem:
45+
name: "build source"
46+
runs-on: ubuntu-latest
47+
steps:
48+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
49+
with:
50+
ref: ${{ inputs.ref || github.ref }}
51+
persist-credentials: false
52+
- uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
53+
with:
54+
path: ports/archives
55+
key: ports-archives-tarball-${{ hashFiles('ext/sqlite3/extconf.rb','dependencies.yml') }}
56+
- uses: ruby/setup-ruby@dffb23f65a78bba8db45d387d5ea1bbd6be3ef18 # v1.293.0
57+
with:
58+
ruby-version: "4.0"
59+
bundler-cache: true
60+
- run: ./bin/test-gem-build ${RELEASE_FLAG} gems ruby
61+
env:
62+
RELEASE_FLAG: ${{ inputs.release && '--release' || '' }}
63+
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
64+
with:
65+
name: "${{ inputs.artifact_prefix }}source-gem"
66+
path: gems
67+
retention-days: 1
68+
69+
build_native_gem:
70+
needs: native_setup
71+
name: "build native"
72+
strategy:
73+
fail-fast: false
74+
matrix:
75+
platform:
76+
- aarch64-linux-gnu
77+
- aarch64-linux-musl
78+
- arm-linux-gnu
79+
- arm-linux-musl
80+
- arm64-darwin
81+
- x64-mingw-ucrt
82+
- x86-linux-gnu
83+
- x86-linux-musl
84+
- x86_64-darwin
85+
- x86_64-linux-gnu
86+
- x86_64-linux-musl
87+
runs-on: ubuntu-latest
88+
steps:
89+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
90+
with:
91+
ref: ${{ inputs.ref || github.ref }}
92+
persist-credentials: false
93+
- uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
94+
with:
95+
path: ports/archives
96+
key: ports-archives-tarball-${{ hashFiles('ext/sqlite3/extconf.rb', 'dependencies.yml') }}
97+
- run: |
98+
docker run --rm -v $PWD:/work -w /work \
99+
ghcr.io/rake-compiler/rake-compiler-dock-image:${RCD_IMAGE_VERSION}-mri-${{ matrix.platform }} \
100+
./bin/test-gem-build ${RELEASE_FLAG} gems ${{ matrix.platform }}
101+
env:
102+
RCD_IMAGE_VERSION: ${{ needs.native_setup.outputs.rcd_image_version }}
103+
RELEASE_FLAG: ${{ inputs.release && '--release' || '' }}
104+
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
105+
with:
106+
name: "${{ inputs.artifact_prefix }}cruby-${{ matrix.platform }}-gem"
107+
path: gems
108+
retention-days: 1

.github/workflows/ci.yml

Lines changed: 10 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -194,55 +194,17 @@ jobs:
194194
- run: bundle exec rake test:valgrind
195195

196196
#
197-
# gem tests (source and native)
197+
# gem build (source and native)
198198
#
199-
native_setup:
199+
build_gems:
200200
needs: basic
201-
name: "Setup for native gem tests"
202-
runs-on: ubuntu-latest
203-
outputs:
204-
rcd_image_version: ${{ steps.rcd_image_version.outputs.rcd_image_version }}
205-
steps:
206-
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
207-
with:
208-
persist-credentials: false
209-
- uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 # zizmor: ignore[cache-poisoning]
210-
with:
211-
path: ports/archives
212-
key: ports-archives-tarball-${{ hashFiles('ext/sqlite3/extconf.rb','dependencies.yml') }}
213-
- uses: ruby/setup-ruby@dffb23f65a78bba8db45d387d5ea1bbd6be3ef18 # v1.293.0
214-
with:
215-
ruby-version: "4.0"
216-
bundler-cache: true # zizmor: ignore[cache-poisoning]
217-
- run: bundle exec ruby ./ext/sqlite3/extconf.rb --download-dependencies
218-
- id: rcd_image_version
219-
run: bundle exec ruby -e 'require "rake_compiler_dock"; puts "rcd_image_version=#{RakeCompilerDock::IMAGE_VERSION}"' >> $GITHUB_OUTPUT
220-
221-
build_source_gem:
222-
needs: native_setup
223-
name: "build source"
224-
runs-on: ubuntu-latest
225-
steps:
226-
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
227-
with:
228-
persist-credentials: false
229-
- uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 # zizmor: ignore[cache-poisoning]
230-
with:
231-
path: ports/archives
232-
key: ports-archives-tarball-${{ hashFiles('ext/sqlite3/extconf.rb','dependencies.yml') }}
233-
- uses: ruby/setup-ruby@dffb23f65a78bba8db45d387d5ea1bbd6be3ef18 # v1.293.0
234-
with:
235-
ruby-version: "4.0"
236-
bundler-cache: true # zizmor: ignore[cache-poisoning]
237-
- run: ./bin/test-gem-build gems ruby
238-
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
239-
with:
240-
name: source-gem
241-
path: gems
242-
retention-days: 1
201+
uses: ./.github/workflows/build-gems.yml
243202

203+
#
204+
# gem tests (source and native)
205+
#
244206
install_source_linux:
245-
needs: [build_source_gem, ruby_versions]
207+
needs: [build_gems, ruby_versions]
246208
name: "test source"
247209
strategy:
248210
fail-fast: false
@@ -270,48 +232,9 @@ jobs:
270232
- run: ./bin/test-gem-install gems -- --${{ matrix.syslib }}-system-libraries ${{ matrix.compile_flags }}
271233
shell: sh
272234

273-
build_native_gem:
274-
needs: native_setup
275-
name: "build native"
276-
strategy:
277-
fail-fast: false
278-
matrix:
279-
platform:
280-
- aarch64-linux-gnu
281-
- aarch64-linux-musl
282-
- arm-linux-gnu
283-
- arm-linux-musl
284-
- arm64-darwin
285-
- x64-mingw-ucrt
286-
- x86-linux-gnu
287-
- x86-linux-musl
288-
- x86_64-darwin
289-
- x86_64-linux-gnu
290-
- x86_64-linux-musl
291-
runs-on: ubuntu-latest
292-
steps:
293-
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
294-
with:
295-
persist-credentials: false
296-
- uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 # zizmor: ignore[cache-poisoning]
297-
with:
298-
path: ports/archives
299-
key: ports-archives-tarball-${{ hashFiles('ext/sqlite3/extconf.rb','dependencies.yml') }}
300-
- run: |
301-
docker run --rm -v $PWD:/work -w /work \
302-
ghcr.io/rake-compiler/rake-compiler-dock-image:${NEEDS_NATIVE_SETUP_OUTPUTS_RCD_IMAGE_VERSION}-mri-${{ matrix.platform }} \
303-
./bin/test-gem-build gems ${{ matrix.platform }}
304-
env:
305-
NEEDS_NATIVE_SETUP_OUTPUTS_RCD_IMAGE_VERSION: ${{ needs.native_setup.outputs.rcd_image_version }}
306-
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
307-
with:
308-
name: "cruby-${{ matrix.platform }}-gem"
309-
path: gems
310-
retention-days: 1
311-
312235
test_architecture_matrix:
313236
name: "${{ matrix.platform }} ${{ matrix.ruby }}"
314-
needs: [build_native_gem, ruby_versions]
237+
needs: [build_gems, ruby_versions]
315238
strategy:
316239
fail-fast: false
317240
matrix:
@@ -359,7 +282,7 @@ jobs:
359282
360283
test_the_rest:
361284
name: "${{ matrix.platform }} ${{ matrix.ruby }}"
362-
needs: [build_native_gem, ruby_versions]
285+
needs: [build_gems, ruby_versions]
363286
strategy:
364287
fail-fast: false
365288
matrix:
@@ -388,7 +311,7 @@ jobs:
388311
shell: sh
389312

390313
cruby-x86_64-linux-musl-install:
391-
needs: build_native_gem
314+
needs: build_gems
392315
strategy:
393316
fail-fast: false
394317
matrix:

.github/workflows/release.yml

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,46 @@
11
name: release
2+
concurrency:
3+
group: "release-${{ inputs.version_tag }}"
4+
cancel-in-progress: false
25

36
on:
47
workflow_dispatch:
8+
inputs:
9+
version_tag:
10+
description: "Version tag to release (e.g., v2.9.1)"
11+
required: true
12+
type: string
13+
14+
permissions:
15+
contents: read
516

617
jobs:
7-
hello:
18+
build:
19+
uses: ./.github/workflows/build-gems.yml
20+
with:
21+
release: true
22+
artifact_prefix: "release-${{ inputs.version_tag }}-"
23+
ref: ${{ inputs.version_tag }}
24+
25+
push:
26+
name: "Push gems to RubyGems.org"
27+
needs: build
828
runs-on: ubuntu-latest
29+
permissions:
30+
contents: read
31+
id-token: write
932
steps:
10-
- run: echo "Hello, world!"
33+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
34+
with:
35+
path: gems
36+
pattern: "release-${{ inputs.version_tag }}-*-gem"
37+
merge-multiple: true
38+
- name: Print checksums
39+
run: ls gems/*.gem | sort | xargs sha256sum
40+
- uses: rubygems/configure-rubygems-credentials@bc6dd217f8a4f919d6835fcfefd470ef821f5c44 # v1.0.0
41+
- name: Push gems
42+
run: |
43+
for gem in gems/*.gem; do
44+
echo "Pushing ${gem} ..."
45+
gem push "${gem}" || echo "WARNING: Failed to push ${gem} (may already exist)"
46+
done

0 commit comments

Comments
 (0)