# This is a **reuseable** workflow that bundles the Desktop App for Linux. # It doesn't get triggered on its own. It gets used in multiple workflows: # - release.yml # - canary.yml (when added) # - pr-comment-bundle-desktop.yml (when added) on: workflow_call: inputs: version: description: 'Version to set for the build' required: false default: "" type: string ref: type: string required: false default: '' name: "Bundle Desktop (Linux)" jobs: build-desktop-linux: name: Build Desktop (Linux) runs-on: ubuntu-latest steps: # 1) Check out source - name: Checkout repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@v4 with: ref: ${{ inputs.ref }} fetch-depth: 0 # 2) Update versions before build - name: Update versions if: ${{ inputs.version != '' }} run: | # Update version in Cargo.toml sed -i.bak 's/^version = ".*"/version = "'${{ inputs.version }}'"/' Cargo.toml rm -f Cargo.toml.bak # Update version in package.json cd ui/desktop npm version ${{ inputs.version }} --no-git-tag-version --allow-same-version # 3) Debug information - name: Debug workflow info env: WORKFLOW_NAME: ${{ github.workflow }} WORKFLOW_REF: ${{ github.ref }} EVENT_NAME: ${{ github.event_name }} REPOSITORY: ${{ github.repository }} run: | echo "=== Workflow Information ===" echo "Workflow: ${WORKFLOW_NAME}" echo "Ref: ${WORKFLOW_REF}" echo "Event: ${EVENT_NAME}" echo "Repo: ${REPOSITORY}" echo "" echo "=== System Information ===" uname -a lsb_release -a || true df -h # 4) Install system dependencies for Linux packaging - name: Install system dependencies run: | sudo apt-get update sudo apt-get install -y \ build-essential \ libnss3-dev \ libatk-bridge2.0-dev \ libdrm2 \ libxcomposite1 \ libxdamage1 \ libxrandr2 \ libgbm1 \ libxss1 \ libasound2t64 \ rpm \ fakeroot \ dpkg-dev \ protobuf-compiler # 4a) Pre-build cleanup to ensure enough disk space - name: Pre-build cleanup run: | echo "Performing aggressive pre-build cleanup..." # Clean npm cache npm cache clean --force || true # Clean any previous build artifacts rm -rf target || true # Clean Homebrew cache (if exists) brew cleanup || true # Remove unnecessary large directories sudo rm -rf /usr/share/dotnet || true sudo rm -rf /usr/local/lib/android || true sudo rm -rf /opt/ghc || true sudo rm -rf /usr/local/share/boost || true # Clean apt cache sudo apt-get clean || true sudo apt-get autoremove -y || true # Check disk space after cleanup df -h # 5) Set up Rust - name: Set up Rust uses: actions-rust-lang/setup-rust-toolchain@9d7e65c320fdb52dcd45ffaa68deb6c02c8754d9 # pin@v1 with: toolchain: stable # 6) Set up Node.js - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: 23 cache: 'npm' cache-dependency-path: ui/desktop/package-lock.json # 7) Cache Rust dependencies - name: Cache Cargo registry uses: actions/cache@v4 with: path: ~/.cargo/registry key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-registry- - name: Cache Cargo index uses: actions/cache@v4 with: path: ~/.cargo/index key: ${{ runner.os }}-cargo-index restore-keys: | ${{ runner.os }}-cargo-index - name: Cache Cargo build uses: actions/cache@v4 with: path: target key: ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-build- # 8) Set up Go for building temporal-service - name: Set up Go uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # pin@v5 with: go-version: '1.21' # 9) Build temporal-service using build.sh script - name: Build temporal-service run: | echo "Building temporal-service using build.sh script..." cd temporal-service ./build.sh echo "temporal-service built successfully" # 10) Build the Rust goosed binary - name: Build goosed binary run: | echo "Building goosed binary for Linux..." cargo build --release -p goose-server ls -la target/release/ file target/release/goosed # 11) Clean up build artifacts to save space - name: Clean up build artifacts run: | echo "Cleaning up to save disk space..." # Remove debug artifacts rm -rf target/debug || true # Remove incremental build files rm -rf target/release/incremental || true rm -rf target/release/deps || true rm -rf target/release/build || true # Remove other target directories that aren't needed find target -name "*.rlib" -delete || true find target -name "*.rmeta" -delete || true # Don't run cargo clean as it will remove our binary # Check disk space df -h # 12) Copy binaries to Electron folder - name: Copy binaries into Electron folder run: | echo "Copying binaries to ui/desktop/src/bin/" mkdir -p ui/desktop/src/bin cp target/release/goosed ui/desktop/src/bin/ cp temporal-service/temporal-service ui/desktop/src/bin/ chmod +x ui/desktop/src/bin/goosed chmod +x ui/desktop/src/bin/temporal-service ls -la ui/desktop/src/bin/ # 13) Final cleanup before npm build - name: Final cleanup before npm build run: | echo "Final cleanup before npm build..." # Now we can remove the entire target directory since we copied the binary rm -rf target || true # Clean any remaining caches rm -rf ~/.cargo/registry/cache || true rm -rf ~/.cargo/git/db || true # Check final disk space df -h # 14) Install npm dependencies - name: Install npm dependencies run: | cd ui/desktop # Clear npm cache and remove lock file as suggested by the error rm -rf node_modules package-lock.json || true npm cache clean --force || true npm install # Verify installation ls -la node_modules/.bin/ | head -5 # 15) Build Electron app with Linux makers (.deb and .rpm) - name: Build Linux packages run: | cd ui/desktop echo "Building Linux packages (.deb and .rpm)..." # Build both .deb and .rpm packages npm run make -- --platform=linux --arch=x64 echo "Build completed. Checking output..." ls -la out/ find out/ -name "*.deb" -o -name "*.rpm" | head -10 # 16) List all generated files for debugging - name: List generated files run: | echo "=== All files in out/ directory ===" find ui/desktop/out/ -type f | head -20 echo "" echo "=== Package files specifically ===" find ui/desktop/out/ -name "*.deb" -o -name "*.rpm" echo "" echo "=== File sizes ===" find ui/desktop/out/ -name "*.deb" -o -name "*.rpm" -exec ls -lh {} \; # 17) Upload .deb package - name: Upload .deb package uses: actions/upload-artifact@v4 with: name: Goose-linux-x64-deb path: ui/desktop/out/make/deb/x64/*.deb if-no-files-found: error # 18) Upload .rpm package - name: Upload .rpm package uses: actions/upload-artifact@v4 with: name: Goose-linux-x64-rpm path: ui/desktop/out/make/rpm/x64/*.rpm if-no-files-found: error # 19) Create combined artifact with both packages - name: Upload combined Linux packages uses: actions/upload-artifact@v4 with: name: Goose-linux-x64 path: | ui/desktop/out/make/deb/x64/*.deb ui/desktop/out/make/rpm/x64/*.rpm if-no-files-found: error