Daniel Lemire e62540e95f Add manually triggered release workflow; fix on-release asset upload
- New release.yml (workflow_dispatch): bumps patch/minor/major, runs
  script/release.py, tests the amalgamation and the full test suite,
  commits and tags on main, and publishes a release with fast_float.h.
- on-release.yml: the upload failed with 'Validation Failed' because
  fast_float.h was already attached to the release. Use
  'gh release upload --clobber' instead of the deprecated
  actions/upload-release-asset, and run the amalgamation test binary.
- release.py: also bump MODULE.bazel (stuck at 8.2.4) and exit non-zero
  if amalgamation fails.
2026-10-04 12:05:40 -04:00

105 lines
3.7 KiB
YAML

name: Release
# Manually triggered. Bumps the version (patch, minor or major), regenerates
# the amalgamated fast_float.h, runs the tests, commits the version bump to
# main, tags it and publishes a GitHub release with fast_float.h attached.
#
# Releases created with GITHUB_TOKEN do not trigger other workflows, so
# on-release.yml does not run for releases made here.
'on':
workflow_dispatch:
inputs:
bump:
description: 'Which part of the version to bump'
required: true
default: 'patch'
type: choice
options:
- patch
- minor
- major
permissions:
contents: write
concurrency:
group: release
cancel-in-progress: false
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
with:
ref: main
fetch-depth: 0
- name: Compute new version
id: version
run: |
current=$(git describe --abbrev=0 --tags)
current=${current#v}
IFS=. read -r major minor patch <<< "$current"
case "${{ inputs.bump }}" in
major) major=$((major + 1)); minor=0; patch=0 ;;
minor) minor=$((minor + 1)); patch=0 ;;
patch) patch=$((patch + 1)) ;;
*) echo "unknown bump type"; exit 1 ;;
esac
new="$major.$minor.$patch"
echo "current=$current" >> "$GITHUB_OUTPUT"
echo "new=$new" >> "$GITHUB_OUTPUT"
echo "Releasing $current -> $new (${{ inputs.bump }})"
- name: Bump version files and amalgamate
run: |
new="${{ steps.version.outputs.new }}"
IFS=. read -r major minor patch <<< "$new"
python3 script/release.py "$new"
rm -f CMakeLists.txt.bak README.md.bak MODULE.bazel.bak \
include/fast_float/float_common.h.bak
grep -q "project(fast_float VERSION $new LANGUAGES CXX)" CMakeLists.txt
grep -q "#define FASTFLOAT_VERSION_MAJOR $major$" include/fast_float/float_common.h
grep -q "#define FASTFLOAT_VERSION_MINOR $minor$" include/fast_float/float_common.h
grep -q "#define FASTFLOAT_VERSION_PATCH $patch$" include/fast_float/float_common.h
grep -q "version = \"$new\"," MODULE.bazel
grep -q "releases/download/v$new/fast_float.h" README.md
grep -q "#define FASTFLOAT_VERSION_PATCH $patch$" fast_float.h
- name: Test amalgamation
run: |
mkdir -p amalgamation/fast_float
cp fast_float.h amalgamation/fast_float/
g++ -O2 -std=c++17 -Iamalgamation -o amalgamation/string_test tests/string_test.cpp
./amalgamation/string_test
- name: Build and test
run: |
cmake -B build -DFASTFLOAT_TEST=ON -DCMAKE_CXX_FLAGS='-Werror -Wundef'
cmake --build build --parallel
ctest --test-dir build --output-on-failure
- name: Commit, tag and push
run: |
new="${{ steps.version.outputs.new }}"
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add CMakeLists.txt README.md MODULE.bazel include/fast_float/float_common.h
git commit -m "Version $new"
git tag -a "v$new" -m "version $new"
git push origin main
git push origin "v$new"
- name: Create GitHub release
env:
GH_TOKEN: ${{ github.token }}
run: |
new="${{ steps.version.outputs.new }}"
gh release create "v$new" \
--title "Version $new" \
--generate-notes \
--notes-start-tag "v${{ steps.version.outputs.current }}" \
fast_float.h