From 9069ba5723a9dbebb649c9125a0f5a41c5d9c705 Mon Sep 17 00:00:00 2001 From: Philip Peterson Date: Fri, 25 Apr 2025 22:55:51 -0700 Subject: [PATCH] add release workflow --- .github/actions/build/action.yml | 104 +++++++++++++++++++++++++++++++ .github/workflows/nodejs.yml | 16 +++++ .github/workflows/release.yml | 59 ++++++++++++++++++ 3 files changed, 179 insertions(+) create mode 100644 .github/actions/build/action.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/actions/build/action.yml b/.github/actions/build/action.yml new file mode 100644 index 00000000..a494b6cd --- /dev/null +++ b/.github/actions/build/action.yml @@ -0,0 +1,104 @@ +name: 'Build' +description: 'Builds, tests, and packages the app for release' +inputs: + node-version: + description: 'Node.js version to use' + required: true +runs: + using: 'composite' + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ inputs.node-version }} + + - name: Fix node-gyp and Python + shell: bash + run: | + if [[ "$RUNNER_OS" == "macOS" ]]; then + brew install python-setuptools python-packaging + else + python3 -m pip install packaging setuptools + fi + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + shell: bash + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + + - uses: actions/cache/restore@v4 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock', 'app/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install dependencies + shell: bash + run: yarn install + env: + npm_config_node_gyp: ${{ github.workspace }}${{ runner.os == 'Windows' && '\node_modules\node-gyp\bin\node-gyp.js' || '/node_modules/node-gyp/bin/node-gyp/bin/node-gyp.js' }} + + - name: Install libarchive-tools + if: runner.os == 'Linux' + shell: bash + run: | + sudo apt update + sudo apt install libarchive-tools + + - name: Lint and Run Unit Tests + shell: bash + run: yarn run test + + - name: Getting Build Icon + if: github.ref == 'refs/heads/canary' || github.base_ref == 'canary' + shell: bash + run: | + cp build/canary.ico build/icon.ico + cp build/canary.icns build/icon.icns + + - name: Build + shell: bash + run: | + if [ -z "$CSC_LINK" ] ; then unset CSC_LINK ; fi + if [ -z "$CSC_KEY_PASSWORD" ] ; then unset CSC_KEY_PASSWORD ; fi + if [ -z "$WIN_CSC_LINK" ] ; then unset WIN_CSC_LINK ; fi + if [ -z "$WIN_CSC_KEY_PASSWORD" ] ; then unset WIN_CSC_KEY_PASSWORD ; fi + if [ -z "$APPLE_ID" ] ; then unset APPLE_ID ; fi + if [ -z "$APPLE_APP_SPECIFIC_PASSWORD" ] ; then unset APPLE_APP_SPECIFIC_PASSWORD ; fi + yarn run dist + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CSC_LINK: ${{ secrets.MAC_CERT_P12_BASE64 }} + CSC_KEY_PASSWORD: ${{ secrets.MAC_CERT_P12_PASSWORD }} + WIN_CSC_LINK: ${{ secrets.WIN_CERT_P12_BASE64 }} + WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CERT_P12_PASSWORD }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + + - name: Archive Build Artifacts + uses: actions/upload-artifact@v4 + with: + name: hyper-${{ runner.os }} + path: | + dist/*.dmg + dist/*.snap + dist/*.AppImage + dist/*.deb + dist/*.pacman + dist/*.exe + + - name: Run E2E Tests (non-Linux) + if: runner.os != 'Linux' + shell: bash + run: yarn run test:e2e --verbose + + - name: Run E2E Tests on Linux + if: runner.os == 'Linux' + uses: GabrielBB/xvfb-action@v1.7 + with: + run: | + yarn run test diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index ecd69d90..6527493a 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -24,10 +24,12 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} + - name: Fix node-gyp and Python run: | if [[ "$RUNNER_OS" == "macOS" ]]; then @@ -35,31 +37,38 @@ jobs: else python3 -m pip install $EXTRA_ARGS packaging setuptools fi + - name: Get yarn cache directory path id: yarn-cache-dir-path run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + - uses: actions/cache/restore@v4 with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} key: ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock', 'app/yarn.lock') }} restore-keys: | ${{ runner.os }}-yarn- + - name: Install run: yarn install env: npm_config_node_gyp: ${{ github.workspace }}${{ runner.os == 'Windows' && '\node_modules\node-gyp\bin\node-gyp.js' || '/node_modules/node-gyp/bin/node-gyp.js' }} + - name: Install libarchive-tools if: runner.os == 'Linux' run: | sudo apt update sudo apt install libarchive-tools + - name: Lint and Run Unit Tests run: yarn run test + - name: Getting Build Icon if: github.ref == 'refs/heads/canary' || github.base_ref == 'canary' run: | cp build/canary.ico build/icon.ico cp build/canary.icns build/icon.icns + - name: Build run: | if [ -z "$CSC_LINK" ] ; then unset CSC_LINK ; fi @@ -77,6 +86,7 @@ jobs: WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CERT_P12_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + - name: Archive Build Artifacts uses: actions/upload-artifact@v4 with: @@ -88,9 +98,11 @@ jobs: dist/*.deb dist/*.pacman dist/*.exe + - name: Run E2E Tests if: runner.os != 'Linux' run: yarn run test:e2e --verbose + - name: Run E2E Tests on Linux if: runner.os == 'Linux' uses: GabrielBB/xvfb-action@v1.7 @@ -100,22 +112,26 @@ jobs: env: SHELL: /bin/bash DEBUG: "pw:browser*" + - name: Archive E2E test screenshot uses: actions/upload-artifact@v4 with: name: e2e-${{ matrix.os }}-${{ strategy.job-index }} path: dist/tmp/*.png + - name: Save the pr number in an artifact if: github.event_name == 'pull_request' env: PR_NUM: ${{ github.event.number }} run: echo $PR_NUM > pr_num.txt + - name: Upload the pr num uses: actions/upload-artifact@v4 if: github.event_name == 'pull_request' with: name: pr_num path: ./pr_num.txt + - uses: actions/cache/save@v4 if: github.event_name == 'push' with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..58b4a2ae --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,59 @@ +name: Create Release + +on: + push: + tags: + - "v*" + workflow_dispatch: + +concurrency: + group: release-${{ github.ref }} + cancel-in-progress: true + +jobs: + build-ubuntu: + name: Build Ubuntu + runs-on: ubuntu-latest + steps: + - uses: ./.github/actions/build + with: + node-version: ${{ env.NODE_VERSION }} + + build-macos: + name: Build macOS + runs-on: macos-latest + steps: + - uses: ./.github/actions/build + with: + node-version: ${{ env.NODE_VERSION }} + + upload-release: + name: Upload and Create Release + needs: + - build-ubuntu + - build-macos + runs-on: ubuntu-latest + steps: + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: ./artifacts + + - name: List downloaded artifacts + run: ls -R ./artifacts + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + name: Release ${{ github.ref_name }} + tag_name: ${{ github.ref }} + files: | + artifacts/**/*.dmg + artifacts/**/*.snap + artifacts/**/*.AppImage + artifacts/**/*.deb + artifacts/**/*.pacman + artifacts/**/*.exe + artifacts/**/*.png + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file