Skip to content

🚀 Release v1.6.2 #25

🚀 Release v1.6.2

🚀 Release v1.6.2 #25

name: Release Workflow
on:
push:
branches:
- "release/**"
pull_request:
types: [closed]
branches:
- main
defaults:
run:
shell: bash
concurrency:
group: release-workflow-${{ github.ref }}
cancel-in-progress: true
jobs:
open-pr-to-main:
name: Open PR (release -> main)
if: github.event_name == 'push' && startsWith(github.ref_name, 'release/')
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Check if PR already exists
id: check-pr
env:
GH_TOKEN: ${{ github.token }}
run: |
HEAD_BRANCH="${{ github.ref_name }}"
PR_EXISTS=$(gh pr list --head "$HEAD_BRANCH" --base main --json number --jq 'length')
echo "pr_exists=$PR_EXISTS" >> "$GITHUB_OUTPUT"
if [ "$PR_EXISTS" -gt 0 ]; then
PR_NUMBER=$(gh pr list --head "$HEAD_BRANCH" --base main --json number --jq '.[0].number')
echo "pr_number=$PR_NUMBER" >> "$GITHUB_OUTPUT"
fi
- name: Create PR to main
if: steps.check-pr.outputs.pr_exists == '0'
env:
GH_TOKEN: ${{ github.token }}
run: |
HEAD_BRANCH="${{ github.ref_name }}"
VERSION="${HEAD_BRANCH#release/v}"
gh pr create \
--base main \
--head "$HEAD_BRANCH" \
--title "🚀 Release v${VERSION}" \
--body "## 🚀 Release v${VERSION}
### ⚙️ Release Configuration
**Escolha o tipo de release editando abaixo:**
Release Type: [lts]
**Opções válidas:**
- \`alpha\` - Release alpha (instável, desenvolvimento)
- \`beta\` - Release beta (pré-release, testes)
- \`lts\` - Release estável de longo prazo (produção)
---
_PR criado automaticamente pelo release-workflow_" \
--draft
- name: PR already exists
if: steps.check-pr.outputs.pr_exists != '0'
run: |
echo "ℹ️ PR já existe (#${{ steps.check-pr.outputs.pr_number }}) para ${{ github.ref_name }} -> main"
create-release:
name: Create GitHub Release (on merge)
if: github.event_name == 'pull_request' && github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'release/')
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.merge_commit_sha }}
- name: Extract version and release type
id: extract
env:
PR_BODY: ${{ github.event.pull_request.body }}
run: |
BRANCH_NAME="${{ github.event.pull_request.head.ref }}"
VERSION="${BRANCH_NAME#release/v}"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
PR_BODY_CLEAN=$(printf '%s' "$PR_BODY" | tr -d '\r')
RELEASE_TYPE=$(printf '%s' "$PR_BODY_CLEAN" | grep -oP 'Release Type:\s*\[\K(alpha|beta|lts)(?=\])' || true)
if [ -z "$RELEASE_TYPE" ]; then
RELEASE_TYPE=$(printf '%s' "$PR_BODY_CLEAN" | grep -oP 'Release Type:\s*\K(alpha|beta|lts)' || echo "lts")
fi
echo "release_type=$RELEASE_TYPE" >> "$GITHUB_OUTPUT"
if [ "$RELEASE_TYPE" = "lts" ]; then
FULL_TAG="v${VERSION}"
else
FULL_TAG="v${VERSION}-${RELEASE_TYPE}"
fi
echo "full_tag=$FULL_TAG" >> "$GITHUB_OUTPUT"
echo "✅ Version: $VERSION"
echo "✅ Release Type: $RELEASE_TYPE"
echo "✅ Full Tag: $FULL_TAG"
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Rust cache
uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: Build release artifacts
run: |
echo "🔨 Building release artifacts..."
cargo build --release
mkdir -p artifacts
if [ -d "target/release" ]; then
find target/release -maxdepth 1 -type f -executable -exec cp {} artifacts/ \;
fi
echo "📦 Artifacts criados:"
ls -lh artifacts/ || true
- name: Create and push tag
env:
FULL_TAG: ${{ steps.extract.outputs.full_tag }}
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
echo "🏷️ Creating tag $FULL_TAG"
git tag -a "$FULL_TAG" -m "Release $FULL_TAG"
git push origin "$FULL_TAG"
echo "✅ Tag $FULL_TAG created and pushed"
- name: Generate changelog
id: changelog
run: |
LAST_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
if [ -z "$LAST_TAG" ]; then
echo "📝 Generating full changelog (first release)"
CHANGELOG=$(git log --pretty=format:"- %s (\`%h\`)" | head -50)
else
echo "📝 Generating changelog from $LAST_TAG"
CHANGELOG=$(git log "${LAST_TAG}..HEAD" --pretty=format:"- %s (\`%h\`)")
fi
echo "$CHANGELOG" > /tmp/changelog.txt
- name: Create GitHub Release
env:
GH_TOKEN: ${{ github.token }}
FULL_TAG: ${{ steps.extract.outputs.full_tag }}
VERSION: ${{ steps.extract.outputs.version }}
RELEASE_TYPE: ${{ steps.extract.outputs.release_type }}
run: |
PRERELEASE_FLAG=""
RELEASE_LABEL="Stable"
if [ "$RELEASE_TYPE" = "alpha" ]; then
PRERELEASE_FLAG="--prerelease"
RELEASE_LABEL="Alpha (Unstable)"
elif [ "$RELEASE_TYPE" = "beta" ]; then
PRERELEASE_FLAG="--prerelease"
RELEASE_LABEL="Beta (Pre-release)"
elif [ "$RELEASE_TYPE" = "lts" ]; then
RELEASE_LABEL="LTS (Long Term Support)"
fi
CHANGELOG=$(cat /tmp/changelog.txt)
gh release create "$FULL_TAG" \
--title "Release $FULL_TAG" \
--notes "## 🎉 Release $VERSION
### 📦 Release Type
**$RELEASE_LABEL**
### 📝 Changes
$CHANGELOG
---
- **Pull Request**: #${{ github.event.pull_request.number }}
---
_Released on: $(date +'%Y-%m-%d %H:%M:%S UTC')_
_Built from commit: \`${{ github.sha }}\`_" \
$PRERELEASE_FLAG \
artifacts/* 2>/dev/null || true