Skip to content

Create Release

Create Release #27

Workflow file for this run

name: Create Release
# example: gh workflow run release.yml -f tag_name=v1.1.4
on:
workflow_dispatch:
inputs:
tag_name:
description: Tag name with v prefix
type: string
required: true
jobs:
create-release:
name: Create release
runs-on: ubuntu-latest
permissions:
contents: write
outputs:
version_number: ${{ steps.set-version-number.outputs.version_number }}
major_tag: ${{ steps.set-major-tag.outputs.major_tag }}
env:
TAG_NAME: ${{ github.event.inputs.tag_name }}
steps:
- name: Check naming convention
run: |
VERIF=$(echo ${{ env.TAG_NAME }} | grep -E "^v([0-9]{1,}\.)([0-9]{1,}\.)([0-9]{1,})(-(alpha|beta)\.[0-9]{1,})?$")
if [ ! ${VERIF} ]
then
echo "Tag name '${{ env.TAG_NAME }}' does not comply with naming convention vX.Y.Z"
exit 1
fi
- name: Set version number with v
id: set-version-number
run: |
echo "version_number=$(echo ${{ env.TAG_NAME }})" >> $GITHUB_OUTPUT
- name: Set major tag with v
id: set-major-tag
run: |
echo "major_tag=$(echo ${{ steps.set-version-number.outputs.version_number }} | cut -d. -f1)" >> $GITHUB_OUTPUT
- name: Clone sources
uses: actions/checkout@v6
- name: Check version consistency in CHANGELOG and README
run: |
# Check top ## [VERSION_NUMBER](GITHUB_URL/releases/tag/VERSION_NUMBER) - yyyy-mm-dd in CHANGELOG.md
CURRENT_DATE=$(date +'%Y-%m-%d')
CHANGELOG_VERSION=$(grep -o -E "## \[(.*)\].* - $CURRENT_DATE" CHANGELOG.md | head -1 | sed 's/ //g')
if [[ $CHANGELOG_VERSION == "##[${{ steps.set-version-number.outputs.version_number }}]($GITHUB_SERVER_URL/$GITHUB_REPOSITORY/releases/tag/${{ steps.set-version-number.outputs.version_number }})-$CURRENT_DATE" ]]
then
echo "CHANGELOG VERSION OK"
else
echo "CHANGELOG VERSION KO"
exit 1
fi
# Check top [_Compare with previous release_](GITHUB_URL/compare/vLAST_TAG...VERSION_NUMBER) in CHANGELOG.md
COMPARISON=$(grep -oP "\/compare\/\K(.*)$" CHANGELOG.md | head -1)
LAST_TAG=$(curl -Ls -o /dev/null -w %{url_effective} $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/releases/latest | grep -oP "\/tag\/\K(.*)$")
if [[ $COMPARISON == "$LAST_TAG...${{ steps.set-version-number.outputs.version_number }})" ]]
then
echo "VERSION COMPARISON OK"
else
echo "VERSION COMPARISON KO"
echo $COMPARISON
echo "$LAST_TAG...${{ steps.set-version-number.outputs.version_number }})"
exit 1
fi
# Check first major tag uses in README
README_VERSION=$(grep -E "$GITHUB_REPOSITORY@v(.*)" README.md | sed 's/ //g' | head -1)
echo $README_VERSION
echo "-uses:$GITHUB_REPOSITORY@v${{ steps.set-major-tag.outputs.major_tag }}"
if [[ $README_VERSION == "-uses:$GITHUB_REPOSITORY@${{ steps.set-major-tag.outputs.major_tag }}" ]]
then
echo "Major tag in README.md: OK"
else
echo "Major tag in README.md: KO"
exit 1
fi
# Check second major tags uses in README
README_VERSION=$(grep -E "$GITHUB_REPOSITORY@v(.*)" README.md | sed 's/ //g' | tail -1)
echo $README_VERSION
echo "-uses:$GITHUB_REPOSITORY@v${{ steps.set-major-tag.outputs.major_tag }}"
if [[ $README_VERSION == "-uses:$GITHUB_REPOSITORY@${{ steps.set-major-tag.outputs.major_tag }}" ]]
then
echo "Major tag in README.md: OK"
else
echo "Major tag in README.md: KO"
exit 1
fi
- name: Create Tag
uses: actions/github-script@v7
with:
github-token: ${{ github.token }}
script: |
github.rest.git.createRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: "refs/tags/${{ env.TAG_NAME }}",
sha: context.sha
})
- name: Prepare release notes
run: |
# Retrieve release body and remove ---
VERSION_RELEASE_NOTES=$(awk -v ver="[${{ steps.set-version-number.outputs.version_number }}]($GITHUB_SERVER_URL/$GITHUB_REPOSITORY/releases/tag/${{ steps.set-version-number.outputs.version_number }})" '/^## / { if (p) { exit }; if ($2 == ver) { p=1; next} } p && NF' CHANGELOG.md | sed ':a;N;$!ba;s/\n---/ /g')
echo "$VERSION_RELEASE_NOTES" >> CHANGELOG.txt
- name: Create release ${{ steps.set-version-number.outputs.version_number }}
uses: softprops/action-gh-release@v2
with:
body_path: CHANGELOG.txt
name: ${{ steps.set-version-number.outputs.version_number }}
tag_name: ${{ env.TAG_NAME }}
draft: false
prerelease: false
update-major-tag:
name: Update major tag
runs-on: ubuntu-latest
needs: create-release
permissions:
contents: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Move or create the major tag
run: git tag -f ${{ needs.create-release.outputs.major_tag }} ${{ needs.create-release.outputs.version_number }}
- name: Push the major tag
run: git push origin ${{ needs.create-release.outputs.major_tag }} --force
run-test:
name: Run test on add-ons
needs: [create-release, update-major-tag]
uses: ./.github/workflows/add-ons-test.yml
with:
action_ref: ${{ needs.create-release.outputs.major_tag }}