Skip to content

Commit 7500270

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

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

.github/workflows/release.yml

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
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+
steps:
26+
- uses: actions/checkout@v4
27+
with:
28+
fetch-tags: true
29+
# FIXME: workaround for git 2.48, see https://github.com/actions/checkout/issues/1467
30+
fetch-depth: 100
31+
ref: ${{ github.ref }}
32+
33+
- name: Verify release tag
34+
id: verify
35+
env:
36+
INPUT_RELEASE_TAG: ${{ inputs.release_tag }}
37+
REPOSITORY_URL: '${{ github.server_url }}/${{ github.repository }}'
38+
run: |
39+
set -eu
40+
41+
latest_tag="$(git describe --tags --abbrev=0)"
42+
latest_tag_fmt="[\`${latest_tag}\`](${REPOSITORY_URL}/releases/tag/${latest_tag})"
43+
release_tag="${INPUT_RELEASE_TAG:-$(date +'%Y.%m.%d')}"
44+
45+
# note: this comparison only works with lexicographic dates
46+
if [[ ! "${release_tag}" > "${latest_tag}" ]]; then
47+
echo "## Skipping release \`${release_tag}\`" >> "$GITHUB_STEP_SUMMARY"
48+
echo "Latest tag ${latest_tag_fmt} already covers this date." >> "$GITHUB_STEP_SUMMARY"
49+
exit 0
50+
elif git diff --quiet "${latest_tag}"; then
51+
echo "## Skipping release \`${release_tag}\`" >> "$GITHUB_STEP_SUMMARY"
52+
echo "No changes since ${latest_tag_fmt}." >> "$GITHUB_STEP_SUMMARY"
53+
exit 0
54+
fi
55+
56+
{
57+
echo "## Proposing new release \`${release_tag}\`"
58+
59+
echo "### Changes since ${latest_tag_fmt}"
60+
echo '```log'
61+
git diff --histogram --stat "${latest_tag}..HEAD"
62+
echo '```'
63+
64+
echo '### Git log'
65+
echo '```log'
66+
git log --no-merges "${latest_tag}..HEAD"
67+
echo '```'
68+
} >> "$GITHUB_STEP_SUMMARY"
69+
70+
echo "release_tag=${release_tag}" >> "$GITHUB_OUTPUT"
71+
72+
release:
73+
runs-on: ubuntu-latest
74+
needs: [verify]
75+
if: needs.verify.outputs.release_tag != ''
76+
environment: ${{ inputs.environment || 'release' }}
77+
steps:
78+
- uses: actions/checkout@v4
79+
80+
- name: Create release
81+
uses: softprops/action-gh-release@v2
82+
with:
83+
tag_name: ${{ needs.verify.outputs.release_tag }}
84+
name: ${{ needs.verify.outputs.release_tag }}
85+
generate_release_notes: true
86+
make_latest: true
87+
env:
88+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

0 commit comments

Comments
 (0)