Skip to content

Commit ff8ff70

Browse files
committed
ci: automatic releases
1 parent de1ea49 commit ff8ff70

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed

.github/workflows/release.yml

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
name: release
2+
3+
on:
4+
schedule:
5+
- cron: '0 0 1 */1 *' # @monthly
6+
workflow_dispatch:
7+
inputs:
8+
release_tag:
9+
type: string
10+
required: false
11+
environment:
12+
type: environment
13+
required: true
14+
default: release
15+
16+
concurrency:
17+
group: ${{ github.workflow }}
18+
cancel-in-progress: true
19+
20+
jobs:
21+
verify:
22+
runs-on: ubuntu-latest
23+
outputs:
24+
release_tag: ${{ steps.verify.outputs.release_tag }}
25+
release_commit: ${{ steps.verify.outputs.release_commit }}
26+
steps:
27+
- uses: actions/checkout@v4
28+
with:
29+
fetch-tags: true
30+
# FIXME: workaround for git 2.48, see https://github.com/actions/checkout/issues/1467
31+
fetch-depth: 100
32+
ref: ${{ github.ref }}
33+
34+
- name: Verify release tag
35+
id: verify
36+
env:
37+
INPUT_RELEASE_TAG: ${{ inputs.release_tag }}
38+
REPOSITORY_URL: '${{ github.server_url }}/${{ github.repository }}'
39+
run: |
40+
set -eu
41+
42+
latest_tag="$(git describe --tags --abbrev=0)"
43+
latest_tag_fmt="[\`${latest_tag}\`](${REPOSITORY_URL}/releases/tag/${latest_tag})"
44+
release_tag="${INPUT_RELEASE_TAG:-$(date +'%Y.%m.%d')}"
45+
release_commit="$(git log --format="%H" -n 1)"
46+
47+
# note: this comparison only works with lexicographic dates
48+
if [[ ! "${release_tag}" > "${latest_tag}" ]]; then
49+
echo "## Skipping release \`${release_tag}\`" >> "$GITHUB_STEP_SUMMARY"
50+
echo "Latest tag ${latest_tag_fmt} already covers this date." >> "$GITHUB_STEP_SUMMARY"
51+
exit 0
52+
elif [[ "$(git log --format="%H" -n 1 "${latest_tag}")" = "${release_commit}" ]]; then
53+
echo "## Skipping release \`${release_tag}\`" >> "$GITHUB_STEP_SUMMARY"
54+
echo "No changes since ${latest_tag_fmt}." >> "$GITHUB_STEP_SUMMARY"
55+
exit 0
56+
fi
57+
58+
{
59+
echo "## Proposing new release \`${release_tag}\`"
60+
echo "Commit: [${release_commit}](${REPOSITORY_URL}/commit/${release_commit})"
61+
62+
echo "### Changes since ${latest_tag_fmt}"
63+
echo '```log'
64+
git diff --histogram --stat "${latest_tag}..${release_commit}"
65+
echo '```'
66+
67+
echo '### Git log'
68+
echo '```log'
69+
git log --no-merges "${latest_tag}..${release_commit}"
70+
echo '```'
71+
} >> "$GITHUB_STEP_SUMMARY"
72+
73+
echo "release_tag=${release_tag}" >> "$GITHUB_OUTPUT"
74+
echo "release_commit=${release_commit}" >> "$GITHUB_OUTPUT"
75+
76+
release:
77+
runs-on: ubuntu-latest
78+
needs: [verify]
79+
if: needs.verify.outputs.release_tag != ''
80+
environment: ${{ inputs.environment || 'release' }}
81+
steps:
82+
- uses: actions/checkout@v4
83+
with:
84+
ref: ${{ needs.verify.outputs.release_commit }}
85+
86+
- name: Create release
87+
uses: softprops/action-gh-release@v2
88+
with:
89+
tag_name: ${{ needs.verify.outputs.release_tag }}
90+
name: ${{ needs.verify.outputs.release_tag }}
91+
target_commitish: ${{ needs.verify.outputs.release_commit }}
92+
generate_release_notes: true
93+
make_latest: true
94+
env:
95+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

0 commit comments

Comments
 (0)