Repository navigation
142 lines (129 loc) · 6.16 KB
/
Copy pathbuild.yml
File metadata and controls
142 lines (129 loc) · 6.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
name: Build
run-name: >-
${{ github.event_name == 'pull_request' && format('Checking that #{0} builds', github.event.pull_request.number)
|| format('Building {0}', github.ref_name) }}
# Trunk-based: main is the only long-lived branch. Every pull request and every push to main runs the specs
# on each supported Ruby and builds the gem, but nothing is published here: RubyGems versions are permanent,
# so a release is a deliberate act - publishing a GitHub Release v{semver}, which runs publish.yml. The
# required status check is the `build` job, which passes only when every Ruby passed and the gem built.
on:
pull_request:
branches: [main]
push:
branches: [main]
workflow_dispatch:
permissions:
contents: read
concurrency:
# A newer push to the same pull request cancels the older build; builds of main never cancel each other.
group: build-${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || github.run_id }}
cancel-in-progress: true
jobs:
test:
name: test (Ruby ${{ matrix.ruby }})
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
ruby: ['3.2', '3.3', '3.4', '4.0']
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: ruby/setup-ruby@824c0e29fdfc7d689c191c27acc969d2d04b7dd8 # v1.331.0
with:
ruby-version: ${{ matrix.ruby }}
bundler-cache: true
# The examples tagged `live: true` convert real files on ConvertAPI and run only when the
# CONVERTAPI_SECRET secret (an API token) exists; pull requests from forks and Dependabot never get it,
# so for them only the offline examples run. CONVERTAPI_BASE_URI (a variable) can point them at
# another deployment, e.g. https://stag-v2.convertapi.com/.
- name: Specs
env:
CONVERT_API_SECRET: ${{ secrets.CONVERTAPI_SECRET }}
CONVERT_API_BASE_URI: ${{ vars.CONVERTAPI_BASE_URI }}
RUBYOPT: -W
run: bundle exec rake spec
build:
name: build
needs: test
# Runs even when a test job failed, so that the required check reports a failure instead of being
# skipped - a skipped required check counts as passed.
if: always()
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Check the specs
env:
RESULT: ${{ needs.test.result }}
run: |
if [ "$RESULT" != success ]; then
echo "::error::The specs did not pass on every Ruby ($RESULT)"
exit 1
fi
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
persist-credentials: false
- uses: ruby/setup-ruby@824c0e29fdfc7d689c191c27acc969d2d04b7dd8 # v1.331.0
with:
ruby-version: '3.4'
# ConvertApi::VERSION is the gem's version and goes into the User-Agent of every request; publish.yml
# refuses a tag that does not match it. It may run ahead of the latest release, never behind it.
- name: Check the version
id: version
run: |
set -euo pipefail
VERSION=$(ruby -Ilib -rconvert_api/version -e 'print ConvertApi::VERSION')
if ! [[ "$VERSION" =~ ^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(\.(alpha|beta|rc)\.(0|[1-9][0-9]*))?$ ]]; then
echo "::error file=lib/convert_api/version.rb::ConvertApi::VERSION '$VERSION' is not {major}.{minor}.{patch} or {major}.{minor}.{patch}.{alpha|beta|rc}.{n}"
exit 1
fi
# The highest release so far, pre-releases included (v3.1.0-rc.2 is gem version 3.1.0.rc.2). Gem::Version
# sorts a pre-release below its release, so this also refuses a pre-release of a released version.
LATEST=$(git tag --list 'v*' | ruby -e '
tags = $stdin.read.split.grep(/\Av\d+\.\d+\.\d+(-(alpha|beta|rc)\.\d+)?\z/)
print tags.map { |t| Gem::Version.new(t.delete_prefix("v").tr("-", ".")) }.max')
if [ -n "$LATEST" ] && ! ruby -e 'exit Gem::Version.new(ARGV[0]) >= Gem::Version.new(ARGV[1])' "$VERSION" "$LATEST"; then
echo "::error file=lib/convert_api/version.rb::ConvertApi::VERSION $VERSION is lower than the latest release $LATEST"
exit 1
fi
{
echo "version=$VERSION"
echo "latest=$LATEST"
} >> "$GITHUB_OUTPUT"
# The gem a release would publish, built and installed outside the checkout, so a change can be tried
# out from the run's artifact before it is released.
- name: Build the gem
env:
VERSION: ${{ steps.version.outputs.version }}
run: |
set -euo pipefail
mkdir -p dist
gem build convert_api.gemspec --output "dist/convert_api-$VERSION.gem"
GEM_HOME="$RUNNER_TEMP/gems" gem install --local --no-document "dist/convert_api-$VERSION.gem"
cd "$RUNNER_TEMP"
GEM_HOME="$RUNNER_TEMP/gems" GEM_PATH="$RUNNER_TEMP/gems" ruby -W -e '
require "convert_api"
abort "loaded #{ConvertApi::VERSION}, expected #{ARGV[0]}" unless ConvertApi::VERSION == ARGV[0]
abort "loaded from #{$LOADED_FEATURES.grep(/convert_api\.rb\z/)}" unless $LOADED_FEATURES.grep(/convert_api\.rb\z/).all? { |f| f.start_with?(ENV["GEM_HOME"]) }
puts ConvertApi::Client::USER_AGENT' "$VERSION"
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: convert_api-${{ steps.version.outputs.version }}-run${{ github.run_number }}
path: dist/
retention-days: 14
if-no-files-found: error
- name: Summary
env:
VERSION: ${{ steps.version.outputs.version }}
LATEST: ${{ steps.version.outputs.latest }}
run: |
{
echo "| | |"
echo "|---|---|"
echo "| \`ConvertApi::VERSION\` | \`$VERSION\` (latest release: \`$LATEST\`) |"
echo "| Gem | \`convert_api-$VERSION.gem\` (artifact only, not published) |"
echo "| Ruby | 3.2, 3.3, 3.4, 4.0 |"
} >> "$GITHUB_STEP_SUMMARY"