From 72fa46491027fcd6e542e16b1d3ef6bd9db2eba2 Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Tue, 28 Jul 2026 12:41:50 +0300 Subject: [PATCH] feat: add Linux Electron release smoke builds Adds an opt-in input to build Linux Electron artifacts in the smoke workflow Builds and validates AppImage releases for x64 and arm64 Uploads Linux AppImage and update manifest artifacts --- .github/workflows/release-desktop-smoke.yml | 107 ++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/.github/workflows/release-desktop-smoke.yml b/.github/workflows/release-desktop-smoke.yml index e81407d8..670f9895 100644 --- a/.github/workflows/release-desktop-smoke.yml +++ b/.github/workflows/release-desktop-smoke.yml @@ -23,6 +23,11 @@ on: required: false default: true type: boolean + build_linux: + description: Build Linux Electron AppImage artifacts + required: false + default: true + type: boolean retention_days: description: Artifact retention days required: false @@ -266,3 +271,105 @@ jobs: packages/electron/dist/latest.yml if-no-files-found: error retention-days: ${{ fromJSON(inputs.retention_days) }} + + build-linux-electron: + if: ${{ inputs.build_linux }} + name: Build Linux Electron (${{ matrix.arch }}) + strategy: + fail-fast: false + matrix: + include: + - runner: ubuntu-24.04 + arch: x64 + host_arch: x86_64 + artifact_arch: x86_64 + manifest: latest-linux.yml + - runner: ubuntu-24.04-arm + arch: arm64 + host_arch: aarch64 + artifact_arch: arm64 + manifest: latest-linux-arm64.yml + runs-on: ${{ matrix.runner }} + steps: + - name: Checkout selected ref + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + with: + repository: ${{ inputs.repository || github.repository }} + ref: ${{ inputs.ref || github.ref }} + + - name: Setup bun + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 + + - name: Setup Node.js + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: '22' + + - name: Verify native Linux architecture + env: + EXPECTED_HOST_ARCH: ${{ matrix.host_arch }} + OPENCHAMBER_TARGET_ARCH: ${{ matrix.arch }} + run: | + set -euo pipefail + test "$(uname -m)" = "$EXPECTED_HOST_ARCH" + test "$(node -p 'process.arch')" = "$OPENCHAMBER_TARGET_ARCH" + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Get build versions + id: versions + shell: bash + run: | + echo "opencode_cli=$(node -p "require('./package.json').dependencies['@opencode-ai/sdk']")" >> "$GITHUB_OUTPUT" + echo "app=$(node -p "require('./packages/electron/package.json').version")" >> "$GITHUB_OUTPUT" + + - name: Cache bundled OpenCode CLI artifact + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 + with: + path: packages/electron/.cache/opencode-cli + key: opencode-cli-${{ runner.os }}-${{ matrix.arch }}-${{ steps.versions.outputs.opencode_cli }} + restore-keys: | + opencode-cli-${{ runner.os }}-${{ matrix.arch }}- + + - name: Run focused Electron release tests + working-directory: packages/electron + run: | + bun run test:architecture + bun run test:updater + + - name: Build and package Linux AppImage + working-directory: packages/electron + env: + OPENCHAMBER_TARGET_ARCH: ${{ matrix.arch }} + run: | + set -euo pipefail + bun run build:web-assets + bun run prepare:opencode-cli + bun run verify:opencode-cli + bun run bundle:main + bun run rebuild:native + node ./scripts/package.mjs --linux --${{ matrix.arch }} --publish=never + bun run verify:opencode-cli:packaged + bun run verify:linux-appimage + + - name: Validate Linux update manifest + working-directory: packages/electron + env: + VERSION: ${{ steps.versions.outputs.app }} + ARTIFACT_ARCH: ${{ matrix.artifact_arch }} + MANIFEST: ${{ matrix.manifest }} + run: | + set -euo pipefail + APPIMAGE="dist/OpenChamber-${VERSION}-linux-${ARTIFACT_ARCH}.AppImage" + node ./scripts/verify-update-manifest.mjs "dist/${MANIFEST}" "$APPIMAGE" "$VERSION" + + - name: Upload Linux installable artifacts + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: desktop-release-smoke-linux-${{ matrix.arch }} + path: | + packages/electron/dist/OpenChamber-${{ steps.versions.outputs.app }}-linux-${{ matrix.artifact_arch }}.AppImage + packages/electron/dist/${{ matrix.manifest }} + if-no-files-found: error + retention-days: ${{ fromJSON(inputs.retention_days) }}