diff --git a/.github/workflows/auto-release.yml b/.github/workflows/auto-release.yml new file mode 100644 index 0000000..19e80c2 --- /dev/null +++ b/.github/workflows/auto-release.yml @@ -0,0 +1,171 @@ +name: Auto Release on Release Branch + +on: + pull_request: + types: [closed] + branches: + - release + +permissions: + contents: write + +jobs: + auto-release: + # Only run if PR was merged to release branch (not just closed) + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch all history for versioning + + - name: Setup Zig + uses: goto-bus-stop/setup-zig@v2 + with: + version: 0.14.0 + + - name: Read VERSION file + id: get_version + run: | + VERSION=$(cat VERSION) + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "tag=v$VERSION" >> $GITHUB_OUTPUT + + - name: Check if tag exists + id: check_tag + run: | + if git rev-parse "v${{ steps.get_version.outputs.version }}" >/dev/null 2>&1; then + echo "exists=true" >> $GITHUB_OUTPUT + echo "Tag v${{ steps.get_version.outputs.version }} already exists" + else + echo "exists=false" >> $GITHUB_OUTPUT + echo "Tag v${{ steps.get_version.outputs.version }} does not exist" + fi + + - name: Run tests + if: steps.check_tag.outputs.exists == 'false' + run: zig build test + + - name: Build library + if: steps.check_tag.outputs.exists == 'false' + run: zig build + + - name: Update build.zig.zon version + if: steps.check_tag.outputs.exists == 'false' + run: | + VERSION="${{ steps.get_version.outputs.version }}" + sed -i "s/\.version = \"[^\"]*\"/\.version = \"$VERSION\"/" build.zig.zon + + - name: Generate changelog + if: steps.check_tag.outputs.exists == 'false' + id: changelog + run: | + VERSION="${{ steps.get_version.outputs.version }}" + + # Get previous tag + PREV_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") + + if [ -z "$PREV_TAG" ]; then + echo "## Initial Release" > CHANGELOG.md + echo "" >> CHANGELOG.md + echo "First release of snappyframesz - A Zig implementation of Snappy frame format." >> CHANGELOG.md + echo "" >> CHANGELOG.md + echo "### Features" >> CHANGELOG.md + echo "- Snappy frame format support" >> CHANGELOG.md + echo "- Frame compression and decompression" >> CHANGELOG.md + echo "- CRC32C checksum validation" >> CHANGELOG.md + echo "- Comprehensive test suite" >> CHANGELOG.md + else + echo "## Changes since $PREV_TAG" > CHANGELOG.md + echo "" >> CHANGELOG.md + git log "$PREV_TAG"..HEAD --pretty=format:"- %s (%h)" >> CHANGELOG.md + fi + + cat CHANGELOG.md + + - name: Commit version update + if: steps.check_tag.outputs.exists == 'false' + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add build.zig.zon + git diff --staged --quiet || git commit -m "chore: bump version to ${{ steps.get_version.outputs.version }}" + + - name: Push version update + if: steps.check_tag.outputs.exists == 'false' + run: | + git push origin release + + - name: Create Git tag + if: steps.check_tag.outputs.exists == 'false' + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git tag -a "${{ steps.get_version.outputs.tag }}" -m "Release ${{ steps.get_version.outputs.tag }}" + git push origin "${{ steps.get_version.outputs.tag }}" + + - name: Create GitHub Release + if: steps.check_tag.outputs.exists == 'false' + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.get_version.outputs.tag }} + name: Release ${{ steps.get_version.outputs.tag }} + body_path: CHANGELOG.md + draft: false + prerelease: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Calculate tarball hash + if: steps.check_tag.outputs.exists == 'false' + id: tarball_hash + run: | + VERSION="${{ steps.get_version.outputs.version }}" + TARBALL_URL="https://github.com/${{ github.repository }}/archive/v${VERSION}.tar.gz" + + # Download and calculate hash + curl -L "$TARBALL_URL" -o release.tar.gz + HASH=$(zig fetch release.tar.gz 2>&1 | grep -o '12[0-9a-f]*' || echo "") + + if [ -z "$HASH" ]; then + echo "Could not calculate hash automatically" + echo "Users can get the hash by running:" + echo " zig fetch --save $TARBALL_URL" + else + echo "hash=$HASH" >> $GITHUB_OUTPUT + echo "Tarball hash: $HASH" + fi + + - name: Post release information + if: steps.check_tag.outputs.exists == 'false' + run: | + echo "==========================================================================" + echo "Release ${{ steps.get_version.outputs.tag }} created successfully!" + echo "==========================================================================" + echo "" + echo "To use this release in your project's build.zig.zon:" + echo "" + echo ".dependencies = .{" + echo " .snappyframesz = .{" + echo " .url = \"https://github.com/${{ github.repository }}/archive/${{ steps.get_version.outputs.tag }}.tar.gz\"," + echo " .hash = \"${{ steps.tarball_hash.outputs.hash }}\"," + echo " }," + echo "}," + echo "" + echo "==========================================================================" + + - name: Skip release (tag exists) + if: steps.check_tag.outputs.exists == 'true' + run: | + echo "==========================================================================" + echo "Skipping release - tag ${{ steps.get_version.outputs.tag }} already exists" + echo "==========================================================================" + echo "" + echo "To create a new release:" + echo "1. Update the VERSION file with a new version number" + echo "2. Commit the change" + echo "3. Create and merge a PR to the release branch" + echo "" + echo "==========================================================================" diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..8acdd82 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.0.1