Merge pull request #175 from kaitranntt/dev #80
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release | |
| on: | |
| push: | |
| branches: [main] | |
| workflow_dispatch: | |
| jobs: | |
| release: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| issues: write | |
| pull-requests: write | |
| id-token: write | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| token: ${{ secrets.PAT_TOKEN }} | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '22' | |
| registry-url: 'https://registry.npmjs.org' | |
| - name: Setup Bun | |
| uses: oven-sh/setup-bun@v2 | |
| with: | |
| bun-version: latest | |
| - name: Install dependencies | |
| run: | | |
| bun install --frozen-lockfile | |
| cd ui && bun install --frozen-lockfile | |
| - name: Build package | |
| run: bun run build:all | |
| - name: Validate (typecheck + lint + tests) | |
| run: bun run validate | |
| - name: Release | |
| id: release | |
| env: | |
| HUSKY: 0 | |
| # Use built-in GITHUB_TOKEN for bot identity on comments/releases | |
| # PAT_TOKEN is only used for checkout (to trigger downstream workflows) | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| NPM_TOKEN: ${{ secrets.NPM_TOKEN }} | |
| NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
| run: | | |
| OUTPUT=$(bunx semantic-release 2>&1) || true | |
| echo "$OUTPUT" | |
| if echo "$OUTPUT" | grep -q "Published release"; then | |
| echo "released=true" >> $GITHUB_OUTPUT | |
| else | |
| echo "released=false" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Notify Discord | |
| if: success() && steps.release.outputs.released == 'true' | |
| env: | |
| DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} | |
| run: | | |
| if [ -z "$DISCORD_WEBHOOK_URL" ]; then | |
| echo "DISCORD_WEBHOOK_URL not set, skipping" | |
| exit 0 | |
| fi | |
| node scripts/send-discord-release.cjs production "$DISCORD_WEBHOOK_URL" | |
| - name: Cleanup stale labels on released issues | |
| if: success() && steps.release.outputs.released == 'true' | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| # semantic-release already adds "released" label via .releaserc.cjs | |
| # This step removes transitional labels from issues now in stable | |
| # Find issues with both "released" and "released-dev" labels | |
| ISSUES=$(gh issue list --label "released" --label "released-dev" --state all --json number --jq '.[].number' 2>/dev/null || echo "") | |
| for NUM in $ISSUES; do | |
| echo "Cleaning up labels on issue #$NUM" | |
| gh issue edit "$NUM" --remove-label "released-dev" --remove-label "pending-release" --repo "${{ github.repository }}" 2>/dev/null || true | |
| done | |
| # Also clean pending-release from any issues with released label | |
| PENDING=$(gh issue list --label "released" --label "pending-release" --state all --json number --jq '.[].number' 2>/dev/null || echo "") | |
| for NUM in $PENDING; do | |
| echo "Removing pending-release from issue #$NUM" | |
| gh issue edit "$NUM" --remove-label "pending-release" --repo "${{ github.repository }}" 2>/dev/null || true | |
| done |