ci: add tag release workflow
This commit is contained in:
parent
9b151968bd
commit
ad463d971e
1 changed files with 111 additions and 0 deletions
111
.gitea/workflows/release.yml
Normal file
111
.gitea/workflows/release.yml
Normal file
|
|
@ -0,0 +1,111 @@
|
||||||
|
name: Release
|
||||||
|
|
||||||
|
"on":
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "**"
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
releases: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Build changelog
|
||||||
|
id: changelog
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
current_tag="${GITHUB_REF_NAME}"
|
||||||
|
previous_tag=""
|
||||||
|
|
||||||
|
if previous_tag="$(git describe --tags --abbrev=0 "${current_tag}^" 2>/dev/null)"; then
|
||||||
|
range="${previous_tag}..${current_tag}"
|
||||||
|
{
|
||||||
|
printf '## Changelog\n\n'
|
||||||
|
printf 'Changes since `%s`.\n\n' "${previous_tag}"
|
||||||
|
git log --reverse --pretty=format:'- %h %s' "${range}"
|
||||||
|
printf '\n'
|
||||||
|
} >CHANGELOG.md
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf '## Changelog\n\n'
|
||||||
|
printf 'Initial release.\n\n'
|
||||||
|
git log --reverse --pretty=format:'- %h %s' "${current_tag}"
|
||||||
|
printf '\n'
|
||||||
|
} >CHANGELOG.md
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Create or update release
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
current_tag="${GITHUB_REF_NAME}"
|
||||||
|
api_url="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases"
|
||||||
|
release_by_tag_url="${api_url}/tags/${current_tag}"
|
||||||
|
|
||||||
|
json_escape() {
|
||||||
|
sed ':a;N;$!ba;s/\\/\\\\/g;s/"/\\"/g;s/\t/\\t/g;s/\r//g;s/\n/\\n/g'
|
||||||
|
}
|
||||||
|
|
||||||
|
body="$(json_escape < CHANGELOG.md)"
|
||||||
|
payload="$(printf '{"tag_name":"%s","name":"%s","body":"%s","draft":false,"prerelease":false}' \
|
||||||
|
"${current_tag}" \
|
||||||
|
"${current_tag}" \
|
||||||
|
"${body}")"
|
||||||
|
|
||||||
|
http_code="$(
|
||||||
|
curl --silent --show-error --output release.json --write-out '%{http_code}' \
|
||||||
|
--header "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
--header 'Accept: application/json' \
|
||||||
|
"${release_by_tag_url}"
|
||||||
|
)"
|
||||||
|
|
||||||
|
case "${http_code}" in
|
||||||
|
200)
|
||||||
|
release_id="$(
|
||||||
|
tr '{,' '\n' < release.json |
|
||||||
|
sed -n 's/^[[:space:]]*"id":[[:space:]]*\([0-9][0-9]*\)$/\1/p' |
|
||||||
|
head -n1
|
||||||
|
)"
|
||||||
|
|
||||||
|
if [ -z "${release_id}" ]; then
|
||||||
|
echo "failed to parse release id from existing release response" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
curl --silent --show-error --fail \
|
||||||
|
--request PATCH \
|
||||||
|
--header "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
--header 'Accept: application/json' \
|
||||||
|
--header 'Content-Type: application/json' \
|
||||||
|
--data "${payload}" \
|
||||||
|
"${api_url}/${release_id}" >/dev/null
|
||||||
|
;;
|
||||||
|
404)
|
||||||
|
curl --silent --show-error --fail \
|
||||||
|
--request POST \
|
||||||
|
--header "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
--header 'Accept: application/json' \
|
||||||
|
--header 'Content-Type: application/json' \
|
||||||
|
--data "${payload}" \
|
||||||
|
"${api_url}" >/dev/null
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "unexpected status code while looking up release: ${http_code}" >&2
|
||||||
|
cat release.json >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
Loading…
Reference in a new issue