name: Create Tag and Release on: workflow_dispatch: inputs: prerelease: description: 'Mark as pre-release' required: false type: boolean default: false draft: description: 'Create as draft' required: false type: boolean default: false env: NODE_VERSION: '20' jobs: create-tag: name: Create Git Tag runs-on: ubuntu-latest outputs: release_tag: ${{ steps.version.outputs.tag }} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Read version from package.json id: version run: | VERSION=$(jq -r .version desktop/package.json) echo "tag=v${VERSION}" >> $GITHUB_OUTPUT - name: Create and push tag run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git tag -a ${{ steps.version.outputs.tag }} -m "Release ${{ steps.version.outputs.tag }}" git push origin ${{ steps.version.outputs.tag }} build-browser: name: Build Browser Bundle needs: create-tag runs-on: ubuntu-latest defaults: run: working-directory: browser steps: - name: Checkout uses: actions/checkout@v4 with: ref: ${{ needs.create-tag.outputs.release_tag }} - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: Install dependencies run: npm install - name: Build static site run: npm run build - name: Create browser archive run: | cd dist zip -r ../nanokvm-usb-browser-${{ needs.create-tag.outputs.release_tag }}.zip . cd .. - name: Upload browser artifact uses: actions/upload-artifact@v4 with: name: browser-release path: browser/nanokvm-usb-browser-${{ needs.create-tag.outputs.release_tag }}.zip if-no-files-found: error build-desktop: name: Build Desktop Apps needs: create-tag runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: include: - os: ubuntu-latest target: linux build_script: build:linux-full artifact_name: desktop-linux - os: windows-latest target: windows build_script: build:win-full artifact_name: desktop-windows - os: macos-latest target: macos build_script: build:mac-full artifact_name: desktop-macos defaults: run: working-directory: desktop env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} steps: - name: Checkout uses: actions/checkout@v4 with: ref: ${{ needs.create-tag.outputs.release_tag }} - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: Install Linux build dependencies if: matrix.os == 'ubuntu-latest' run: | sudo apt-get update sudo apt-get install -y build-essential python3 libudev-dev rpm - name: Import Code-Signing Certificates if: startsWith(matrix.os, 'macos') uses: apple-actions/import-codesign-certs@v3 with: p12-file-base64: ${{ secrets.APPLE_CERTIFICATE }} p12-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - name: Install dependencies run: npm install - name: Build desktop package run: npm run ${{ matrix.build_script }} - name: Upload desktop artifacts uses: actions/upload-artifact@v4 with: name: ${{ matrix.artifact_name }} path: | desktop/dist/*.exe desktop/dist/*.AppImage desktop/dist/*.deb desktop/dist/*.rpm desktop/dist/*.dmg desktop/dist/*-mac.zip desktop/dist/latest*.yml if-no-files-found: error create-release: name: Create GitHub Release needs: [create-tag, build-browser, build-desktop] runs-on: ubuntu-latest permissions: contents: write steps: - name: Download all artifacts uses: actions/download-artifact@v4 with: path: release-artifacts - name: Display structure of downloaded files run: ls -R release-artifacts - name: Create Release uses: softprops/action-gh-release@v1 with: tag_name: ${{ needs.create-tag.outputs.release_tag }} name: ${{ needs.create-tag.outputs.release_tag }} draft: ${{ inputs.draft }} prerelease: ${{ inputs.prerelease }} files: | release-artifacts/**/* generate_release_notes: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}