Skip to content

Use vite mode during packaging to customize the client static configuration #288

Use vite mode during packaging to customize the client static configuration

Use vite mode during packaging to customize the client static configuration #288

Workflow file for this run

name: Package client
on:
pull_request:
paths:
- .github/workflows/package-client.yml
- client/electron/package.js
- client/electron/snap/*
workflow_call:
inputs:
version:
description: The version to use
type: string
required: true
version_patch_run_id:
description: |
The run id where the version.patch artifact was uploaded.
If not provided, the workflow will generate the patch by itself.
type: string
required: true
commit_sha:
required: true
type: string
description: The commit SHA to use when checkout'ing the repository
default: ${{ github.sha }}
nightly_build:
type: boolean
description: The current build is a nightly build
default: false
secrets:
SENTRY_AUTH_TOKEN:
required: true
workflow_dispatch:
inputs:
version:
description: The version to use (if not provided, will generate one from code space version)
type: string
required: false
# Set `concurrency` to prevent this workflow from being run on code that is not up-to-date on a PR (e.g. when making many push quickly on a PR).
# This behavior is only intended for a PR and not for merge commits on the main branch. Having the workflow run on each merge commit can be useful to spot regressions missed by previous checks.
# To distinguish between these cases, we use `head_ref` that is only defined on `pull-request` and fallback to `run_id` (this is a counter, so it's value is unique between workflow call).
concurrency:
group: package-client-${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
env:
# We use the version 18.12 because the version >= 18.13 have some breaking changes on how they format the date.
# That would break our unit test if we don't update them.
node-version: 18.12.0
wasm-pack-version: 0.12.1
WINFSP_VERSION: 2.0.23075
permissions:
contents: read
jobs:
version:
if: ${{ inputs.version_patch_run_id == '' }}
uses: ./.github/workflows/_parse_version.yml
with:
version: ${{ inputs.version }}
commit_sha: ${{ inputs.commit_sha }}
webapp:
needs: version
# Always run the job if `version` job is skipped otherwise only if `version` job was successful.
if: ${{ inputs.version_patch_run_id != '' && always() || success() }}
runs-on: ubuntu-22.04
name: ⚡ Package web app
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # pin v4.1.7
with:
ref: ${{ inputs.commit_sha }}
timeout-minutes: 5
- uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # pin v4.0.3
with:
node-version: ${{ env.node-version }}
timeout-minutes: 2
- name: Download version.patch artifact
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # pin v4.1.8
with:
name: version.patch
path: ${{ runner.temp }}/version.patch
run-id: ${{ inputs.version_patch_run_id || github.run_id }}
- name: Apply version.patch
run: git apply --allow-empty ${{ runner.temp }}/version.patch/version.patch
- name: Install dependencies
run: npm clean-install
working-directory: client
# Install syft
- uses: taiki-e/install-action@37129d5de13e9122cce55a7a5e7e49981cef514c # pin v2.42.26
with:
tool: syft@0.84.0, wasm-pack@${{ env.wasm-pack-version }}
- name: Build web bindings
run: npm run build:release
working-directory: bindings/web
- name: Build web app
run: npm run web:release
env:
VITE_SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
working-directory: client
- name: Generate SBOM
run: syft packages --config=.syft.yaml --output=spdx-json=client/dist/Parsec-SBOM-Web.spdx.json .
- uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # pin v4.3.6
with:
name: webapp
path: client/dist/
if-no-files-found: error
electron-snap:
needs: version
runs-on: ubuntu-22.04
# Always run the job if `version` job is skipped otherwise only if `version` job was successful.
if: ${{ inputs.version_patch_run_id != '' && always() || success() }}
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # pin v4.1.7
with:
ref: ${{ inputs.commit_sha }}
timeout-minutes: 5
- name: Download version.patch artifact
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # pin v4.1.8
with:
name: version.patch
path: ${{ runner.temp }}/version.patch
run-id: ${{ inputs.version_patch_run_id || github.run_id }}
- name: Load version config
id: version
shell: bash
run: |
cat version.patch/version.ini > "$GITHUB_OUTPUT"
cat "$GITHUB_OUTPUT"
working-directory: ${{ runner.temp }}
- name: Apply version.patch
run: git apply --allow-empty ${{ runner.temp }}/version.patch/version.patch
- name: Install snapcraft
uses: samuelmeuli/action-snapcraft@d33c176a9b784876d966f80fb1b461808edc0641 # pin v2.1.1
timeout-minutes: 1
- name: Setup LXD
uses: canonical/setup-lxd@4e959f8e0d9c5feb27d44c5e4d9a330a782edee0 # pin v0.1.1
timeout-minutes: 2
- name: Patch cannot install cypress on lxd
run: npm remove cypress{,-file-upload,-real-events,-vite}
working-directory: client
timeout-minutes: 2
- name: Patch snapcraft for nightly build
if: inputs.nightly_build
run:
sed -i 's/node package.js --mode prod --platform linux dir/& --nightly/' snap/snapcraft.yaml
working-directory: client/electron
# We need to patch the vite.config.js because we cannot pass the secret to the snap build (either via build-args or env).
- name: Patch vite config for snap build
run: >-
sed -i
-e s'/if (process.env.VITE_SENTRY_AUTH_TOKEN)/if (true)/'
-e s';authToken: process.env.VITE_SENTRY_AUTH_TOKEN;authToken: "${{ secrets.SENTRY_AUTH_TOKEN }}";'
vite.config.ts
working-directory: client
- name: Patch snapcraft file for sentry auth token and vite mode
run: >-
sed -i
-e s';SENTRY_AUTH_TOKEN: __TOKEN__;SENTRY_AUTH_TOKEN: "${{ secrets.SENTRY_AUTH_TOKEN }}";'
-e s'/VITE_MODE: development/VITE_MODE: ${{ steps.version.outputs.type }}/'
snap/snapcraft.yaml
working-directory: client/electron
- name: Build snap
run: |
ln -sv client/electron/snap
snapcraft pack --use-lxd -v
timeout-minutes: 30
- name: Rename artifacts
shell: bash
run: |
ARCH=$(uname -m)
mv -v parsec_*_*.snap Parsec_${{ steps.version.outputs.full }}_linux_$ARCH.snap
# Install syft
- uses: taiki-e/install-action@37129d5de13e9122cce55a7a5e7e49981cef514c # pin v2.42.26
with:
tool: syft@0.84.0
- name: Generate SBOM
run: syft packages --config=.syft.yaml --output=spdx-json=Parsec-SBOM-Electron-linux-snap.spdx.json .
- uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # pin v4.3.6
with:
name: ${{ runner.os }}-${{ runner.arch }}-electron-app-snap
path: |
Parsec_${{ steps.version.outputs.full }}_linux_*.snap
Parsec-SBOM-*.spdx.json
if-no-files-found: error
timeout-minutes: 10
electron-non-snap:
needs: version
# Always run the job if `version` job is skipped otherwise only if `version` job was successful.
if: ${{ inputs.version_patch_run_id != '' && always() || success() }}
strategy:
fail-fast: false
matrix:
include:
- name: 🏁 Windows
platform: windows
os: windows-2022
raw_latest_file: latest.yml
extension: exe
os_alias: win
- name: 🍎 macOS
platform: macos
os: macos-12
raw_latest_file: latest-mac.yml
extension: dmg
os_alias: mac
- name: 🐧 AppImage 4 Linux
platform: linux
os: ubuntu-22.04
raw_latest_file: latest-linux.yml
os_alias: linux
extension: AppImage
name: "${{matrix.name }}: ⚡ Package electron"
runs-on: ${{ matrix.os }}
timeout-minutes: 60
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # pin v4.1.7
with:
ref: ${{ inputs.commit_sha }}
timeout-minutes: 5
- uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # pin v4.0.3
with:
node-version: ${{ env.node-version }}
timeout-minutes: 2
- name: Download version.patch artifact
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # pin v4.1.8
with:
name: version.patch
path: ${{ runner.temp }}/version.patch
run-id: ${{ inputs.version_patch_run_id || github.run_id }}
- name: Load version config
id: version
shell: bash
run: |
cat version.patch/version.ini > "$GITHUB_OUTPUT"
cat "$GITHUB_OUTPUT"
working-directory: ${{ runner.temp }}
- name: Apply version.patch
run: git apply --allow-empty ${{ runner.temp }}/version.patch/version.patch
- name: Windows > Install WinFSP
if: matrix.platform == 'windows'
shell: bash
run: |
set -eux
choco install winfsp -y --version=${{ env.WINFSP_VERSION }}
curl -L https://github.com/winfsp/winfsp/releases/download/v2.0/winfsp-tests-${{ env.WINFSP_VERSION }}.zip -o D:/a/_temp/winfsp-tests.zip
unzip D:/a/_temp/winfsp-tests.zip -d D:/a/_temp/
mv 'D:/a/_temp/winfsp-tests-x64.exe' 'C:/Program Files (x86)/WinFsp/bin/'
timeout-minutes: 2
- name: MacOS > Install macFUSE
if: matrix.platform == 'macos'
run: brew install --cask macfuse
timeout-minutes: 5
- name: Linux > Install system dependencies
if: matrix.platform == 'linux'
run: |
sudo apt-get install -y fuse3 libfuse3-dev
timeout-minutes: 2
- name: Install client dependencies
# Use `--ignore-scripts` to prevent the postinstall script trying to be smarter than us and
# install electron dependencies (as it would use `npm install` instead of `npm clean-install`).
run: npm clean-install --ignore-scripts
working-directory: client
timeout-minutes: 10
- name: Install electron dependencies
run: npm clean-install
working-directory: client/electron
timeout-minutes: 2
- name: Install electron bindings dependencies
run: npm clean-install
working-directory: bindings/electron
timeout-minutes: 1
- name: Build Electron bindings
run: npm run build:release
working-directory: bindings/electron
# MacOS is really slow when build rust
timeout-minutes: 30
- name: Build client for electron
run: npm run native:build -- --mode ${{ steps.version.outputs.type }}
working-directory: client
timeout-minutes: 5
- name: Copy client build result to electron
run: npm exec cap copy @capacitor-community/electron
working-directory: client
timeout-minutes: 1
- name: Build Electron apps
# What's about the extra `--` in `-- --nightly`?
# The reason is for npm to pass the flag `--nightly` to the underlying npm script.
# But since the base npm script `npm run electron:release` call another npm script,
# we need to escape the flag another time by adding another `--`.
run: >-
npm run electron:release
${{ matrix.platform == 'linux' && '-- appimage' || '' }}
${{ inputs.nightly_build && '-- --nightly' || '' }}
env:
VITE_SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
working-directory: client/electron
timeout-minutes: 5
- name: Upload client electron sourcemaps
run: npm run sentry:sourcemaps
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
working-directory: client/electron
timeout-minutes: 1
# Install syft
- uses: taiki-e/install-action@37129d5de13e9122cce55a7a5e7e49981cef514c # pin v2.42.26
with:
tool: syft@0.84.0
- name: Generate SBOM
run: syft packages --config=.syft.yaml --output=spdx-json=client/electron/dist/Parsec-SBOM-Electron-${{ matrix.platform }}-${{ matrix.extension }}.spdx.json .
- name: Debug dist folder
if: runner.debug || false
run: ls client/electron/dist
- name: Build info
id: build-info
shell: bash
run: |
arch=$(uname -m)
app_file="Parsec_${{ steps.version.outputs.full }}_${{ matrix.os_alias }}_${arch}${{ matrix.platform == 'linux' && '' || '.unsigned'}}.${{ matrix.extension }}"
latest_file="latest-${{ matrix.os_alias }}-${arch}.yml"
cat << EOF | tee -a $GITHUB_OUTPUT
arch=$arch
app_file=$app_file
latest_file=$latest_file
EOF
- name: Rename "latest" file
shell: bash
run: mv -v "${{ matrix.raw_latest_file }}" "${{ steps.build-info.outputs.latest_file }}"
working-directory: client/electron/dist
- name: Sanity check that "latest" file contain the correct application file
run: |
cat "${{ steps.build-info.outputs.latest_file }}"
grep -e "${{ steps.build-info.outputs.app_file }}" "${{ steps.build-info.outputs.latest_file }}"
working-directory: client/electron/dist
- uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # pin v4.3.6
with:
name: ${{ runner.os }}-${{ runner.arch }}-electron-app-${{ matrix.extension }}
path: |
client/electron/dist/${{ steps.build-info.outputs.app_file }}
client/electron/dist/${{ steps.build-info.outputs.app_file }}.blockmap
client/electron/dist/${{ steps.build-info.outputs.latest_file }}
client/electron/dist/Parsec-SBOM-*.spdx.json
if-no-files-found: error
timeout-minutes: 10
- uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # pin v4.3.6
if: matrix.platform == 'windows'
with:
name: ${{ runner.os }}-${{ runner.arch }}-electron-app-${{ matrix.extension }}-pre-built
path: |
client/electron/app
client/electron/build
client/electron/assets
client/electron/scripts
client/electron/package.js
client/electron/package.json
client/electron/package-lock.json
client/electron/sign-windows-package.cmd
client/electron/README.md
if-no-files-found: error
timeout-minutes: 10