name: Prepare Release on: workflow_dispatch: inputs: version: description: Optional semantic version override, with or without leading v. When omitted, the recommended version is used. required: false workflow_call: inputs: version: description: Optional semantic version override, with or without leading v. When omitted, the recommended version is used. required: false default: '' type: string jobs: prepare: runs-on: ubuntu-latest container: docker.io/catthehacker/ubuntu:act-latest defaults: run: shell: bash env: RELEASE_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Go uses: actions/setup-go@v5 with: go-version: '1.26.1' check-latest: true cache: true cache-dependency-path: go.sum - name: Resolve release version id: resolve-version env: INPUT_VERSION: ${{ inputs.version }} run: | set -euo pipefail provided_version="$(printf '%s' "${INPUT_VERSION:-}" | sed 's/^[[:space:]]\+//; s/[[:space:]]\+$//')" if [[ -n "$provided_version" ]]; then release_version="$provided_version" else if ! release_version="$(go run ./cmd/vociferate --recommend --root . 2>release-recommendation.err)"; then recommendation_error="$(tr '\n' ' ' < release-recommendation.err | sed 's/[[:space:]]\+/ /g' | sed 's/^ //; s/ $//')" echo "Resolve release version: ${recommendation_error}" >&2 exit 1 fi fi echo "RELEASE_VERSION=$release_version" >> "$GITHUB_ENV" echo "version=$release_version" >> "$GITHUB_OUTPUT" - name: Prepare release files run: | set -euo pipefail go run ./cmd/vociferate \ --root . \ --version "$RELEASE_VERSION" \ --date "$(date -u +%F)" \ --changelog changelog.md - name: Run tests run: | set -euo pipefail go test ./... - name: Configure git author run: | set -euo pipefail git config user.name "gitea-actions[bot]" git config user.email "gitea-actions[bot]@users.noreply.local" - name: Commit release changes and push tag run: | set -euo pipefail normalized_version="${RELEASE_VERSION#v}" tag="v${normalized_version}" if git rev-parse "$tag" >/dev/null 2>&1; then echo "Tag ${tag} already exists" >&2 exit 1 fi case "$GITHUB_SERVER_URL" in https://*) authed_remote="https://oauth2:${RELEASE_TOKEN}@${GITHUB_SERVER_URL#https://}/${GITHUB_REPOSITORY}.git" ;; http://*) authed_remote="http://oauth2:${RELEASE_TOKEN}@${GITHUB_SERVER_URL#http://}/${GITHUB_REPOSITORY}.git" ;; *) echo "Unsupported GITHUB_SERVER_URL: ${GITHUB_SERVER_URL}" >&2 exit 1 ;; esac git remote set-url origin "$authed_remote" git add changelog.md release-version git commit -m "release: prepare ${tag}" git tag "$tag" git push origin HEAD git push origin "$tag" - name: Summarize prepared release run: | set -euo pipefail normalized_version="${RELEASE_VERSION#v}" tag="v${normalized_version}" { echo "## Release Prepared" echo echo "- Updated files were committed to main." echo "- Tag pushed: ${tag}" echo "- The tag-triggered Do Release workflow will create or update the release and publish binaries." } >> "$GITHUB_STEP_SUMMARY"