name: Release permissions: contents: write actions: read on: push: tags: - 'v*' workflow_dispatch: inputs: tag: description: 'Tag version to release (e.g., v1.0.0)' required: true type: string jobs: build: runs-on: ${{ matrix.os }} strategy: matrix: os: [macos-latest, ubuntu-latest, windows-latest] steps: - name: Checkout repository uses: actions/checkout@v6 - name: Get Node.js version from .nvmrc id: versions shell: bash run: | NODE_VERSION=$(cat .nvmrc) echo "node-version=$NODE_VERSION" >> $GITHUB_OUTPUT echo "📦 Using Node.js $NODE_VERSION from .nvmrc" - name: Enable Corepack run: corepack enable - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: ${{ steps.versions.outputs.node-version }} cache: 'pnpm' - name: Install dependencies run: pnpm install - name: Run type check and linter run: pnpm check - name: Build Electron app run: pnpm package env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload artifacts (macOS) if: matrix.os == 'macos-latest' uses: actions/upload-artifact@v6 with: name: macos-release path: | release/*.dmg release/latest-mac.yml - name: Upload artifacts (Windows) if: matrix.os == 'windows-latest' uses: actions/upload-artifact@v6 with: name: windows-release path: | release/*.exe release/latest.yml - name: Upload artifacts (Linux) if: matrix.os == 'ubuntu-latest' uses: actions/upload-artifact@v6 with: name: linux-release path: | release/*.AppImage release/latest-linux.yml release: needs: build runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch' outputs: is_prerelease: ${{ steps.release_type.outputs.is_prerelease }} steps: - name: Checkout repository uses: actions/checkout@v6 - name: Download all artifacts uses: actions/download-artifact@v7 with: path: artifacts - name: Display structure of downloaded files run: ls -la artifacts/**/* - name: Determine tag name id: tag run: | if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then echo "tag=${{ github.event.inputs.tag }}" >> $GITHUB_OUTPUT else echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT fi - name: Determine release type id: release_type run: | if [[ "${{ steps.tag.outputs.tag }}" =~ -alpha|-beta|-rc ]]; then echo "is_prerelease=true" >> $GITHUB_OUTPUT echo "📋 This will be marked as a pre-release" else echo "is_prerelease=false" >> $GITHUB_OUTPUT echo "📋 This will be marked as a full release" fi - name: Create Release with all assets run: | # Collect all assets assets=() for file in artifacts/macos-release/*.dmg artifacts/macos-release/latest-mac.yml \ artifacts/windows-release/*.exe artifacts/windows-release/latest.yml \ artifacts/linux-release/*.AppImage artifacts/linux-release/latest-linux.yml; do if [ -f "$file" ]; then assets+=("$file") fi done # Create release with all assets at once if [ "${{ steps.release_type.outputs.is_prerelease }}" = "true" ]; then gh release create ${{ steps.tag.outputs.tag }} \ --title "Gerbil ${{ steps.tag.outputs.tag }}" \ --generate-notes \ --prerelease \ "${assets[@]}" else gh release create ${{ steps.tag.outputs.tag }} \ --title "Gerbil ${{ steps.tag.outputs.tag }}" \ --generate-notes \ "${assets[@]}" fi env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} aur-release: needs: release if: needs.release.outputs.is_prerelease != 'true' uses: ./.github/workflows/aur-release.yml with: tag: ${{ github.ref_name }} pkgrel: '1' secrets: inherit