name: Debian-based ISO and SquashFS on: workflow_call: workflow_dispatch: inputs: environment: type: choice description: Environment options: - NONE - dev - unstable - dev-unstable runner: type: choice description: Runner options: - standard - fast platform: type: choice description: Platform options: - ALL - x86_64 - x86_64-nonfree - aarch64 - aarch64-nonfree - raspberrypi - riscv64 deploy: type: choice description: Deploy options: - NONE - alpha - beta push: branches: - master - next/* pull_request: branches: - master - next/* env: NODEJS_VERSION: "24.11.0" ENVIRONMENT: '${{ fromJson(format(''["{0}", ""]'', github.event.inputs.environment || ''dev''))[github.event.inputs.environment == ''NONE''] }}' jobs: compile: name: Compile Base Binaries strategy: fail-fast: true matrix: arch: >- ${{ fromJson('{ "x86_64": ["x86_64"], "x86_64-nonfree": ["x86_64"], "aarch64": ["aarch64"], "aarch64-nonfree": ["aarch64"], "raspberrypi": ["aarch64"], "riscv64": ["riscv64"], "ALL": ["x86_64", "aarch64", "riscv64"] }')[github.event.inputs.platform || 'ALL'] }} runs-on: >- ${{ fromJson( format( '["{0}", "{1}"]', fromJson('{ "x86_64": "ubuntu-latest", "aarch64": "ubuntu-24.04-arm", "riscv64": "ubuntu-latest" }')[matrix.arch], fromJson('{ "x86_64": "buildjet-32vcpu-ubuntu-2204", "aarch64": "buildjet-32vcpu-ubuntu-2204-arm", "riscv64": "buildjet-32vcpu-ubuntu-2204" }')[matrix.arch] ) )[github.event.inputs.runner == 'fast'] }} steps: - name: Cleaning up unnecessary files run: | sudo apt-get remove --purge -y azure-cli || true sudo apt-get remove --purge -y firefox || true sudo apt-get remove --purge -y ghc-* || true sudo apt-get remove --purge -y google-cloud-sdk || true sudo apt-get remove --purge -y google-chrome-stable || true sudo apt-get remove --purge -y powershell || true sudo apt-get remove --purge -y php* || true sudo apt-get remove --purge -y ruby* || true sudo apt-get remove --purge -y mono-* || true sudo apt-get autoremove -y sudo apt-get clean sudo rm -rf /usr/lib/jvm # All JDKs sudo rm -rf /usr/local/.ghcup # Haskell toolchain sudo rm -rf /usr/local/lib/android # Android SDK/NDK, emulator sudo rm -rf /usr/share/dotnet # .NET SDKs sudo rm -rf /usr/share/swift # Swift toolchain (if present) sudo rm -rf "$AGENT_TOOLSDIRECTORY" # Pre-cached tool cache (Go, Node, etc.) - run: | sudo mount -t tmpfs tmpfs . if: ${{ github.event.inputs.runner == 'fast' }} - uses: actions/checkout@v4 with: submodules: recursive - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.x" - uses: actions/setup-node@v4 with: node-version: ${{ env.NODEJS_VERSION }} - name: Set up docker QEMU uses: docker/setup-qemu-action@v3 - name: Set up system dependencies run: sudo apt-get update && sudo apt-get install -y qemu-user-static systemd-container squashfuse - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Configure sccache uses: actions/github-script@v7 with: script: | core.exportVariable('ACTIONS_RESULTS_URL', process.env.ACTIONS_RESULTS_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - name: Make run: make ARCH=${{ matrix.arch }} compiled-${{ matrix.arch }}.tar env: SCCACHE_GHA_ENABLED: on SCCACHE_GHA_VERSION: 0 - uses: actions/upload-artifact@v4 with: name: compiled-${{ matrix.arch }}.tar path: compiled-${{ matrix.arch }}.tar image: name: Build Image needs: [compile] strategy: fail-fast: false matrix: platform: >- ${{ fromJson( format( '[ ["{0}"], ["x86_64", "x86_64-nonfree", "aarch64", "aarch64-nonfree", "riscv64", "raspberrypi"] ]', github.event.inputs.platform || 'ALL' ) )[(github.event.inputs.platform || 'ALL') == 'ALL'] }} runs-on: >- ${{ fromJson( format( '["{0}", "{1}"]', fromJson('{ "x86_64": "ubuntu-latest", "x86_64-nonfree": "ubuntu-latest", "aarch64": "ubuntu-24.04-arm", "aarch64-nonfree": "ubuntu-24.04-arm", "raspberrypi": "ubuntu-24.04-arm", "riscv64": "ubuntu-24.04-arm", }')[matrix.platform], fromJson('{ "x86_64": "buildjet-8vcpu-ubuntu-2204", "x86_64-nonfree": "buildjet-8vcpu-ubuntu-2204", "aarch64": "buildjet-8vcpu-ubuntu-2204-arm", "aarch64-nonfree": "buildjet-8vcpu-ubuntu-2204-arm", "raspberrypi": "buildjet-8vcpu-ubuntu-2204-arm", "riscv64": "buildjet-8vcpu-ubuntu-2204", }')[matrix.platform] ) )[github.event.inputs.runner == 'fast'] }} env: ARCH: >- ${{ fromJson('{ "x86_64": "x86_64", "x86_64-nonfree": "x86_64", "aarch64": "aarch64", "aarch64-nonfree": "aarch64", "raspberrypi": "aarch64", "riscv64": "riscv64", }')[matrix.platform] }} steps: - name: Free space run: | sudo apt-get remove --purge -y azure-cli || true sudo apt-get remove --purge -y firefox || true sudo apt-get remove --purge -y ghc-* || true sudo apt-get remove --purge -y google-cloud-sdk || true sudo apt-get remove --purge -y google-chrome-stable || true sudo apt-get remove --purge -y powershell || true sudo apt-get remove --purge -y php* || true sudo apt-get remove --purge -y ruby* || true sudo apt-get remove --purge -y mono-* || true sudo apt-get autoremove -y sudo apt-get clean sudo rm -rf /usr/lib/jvm # All JDKs sudo rm -rf /usr/local/.ghcup # Haskell toolchain sudo rm -rf /usr/local/lib/android # Android SDK/NDK, emulator sudo rm -rf /usr/share/dotnet # .NET SDKs sudo rm -rf /usr/share/swift # Swift toolchain (if present) sudo rm -rf "$AGENT_TOOLSDIRECTORY" # Pre-cached tool cache (Go, Node, etc.) if: ${{ github.event.inputs.runner != 'fast' }} - uses: actions/checkout@v4 with: submodules: recursive - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.x" - name: Install dependencies run: | sudo apt-get update sudo apt-get install -y qemu-user-static wget https://deb.debian.org/debian/pool/main/d/debspawn/debspawn_0.6.2-1_all.deb sha256sum ./debspawn_0.6.2-1_all.deb | grep 37ef27458cb1e35e8bce4d4f639b06b4b3866fc0b9191ec6b9bd157afd06a817 sudo apt-get install -y ./debspawn_0.6.2-1_all.deb - name: Configure debspawn run: | sudo mkdir -p /etc/debspawn/ echo "AllowUnsafePermissions=true" | sudo tee /etc/debspawn/global.toml sudo mkdir -p /var/tmp/debspawn - run: sudo mount -t tmpfs tmpfs /var/tmp/debspawn if: ${{ github.event.inputs.runner == 'fast' && (matrix.platform == 'x86_64' || matrix.platform == 'x86_64-nonfree') }} - name: Download compiled artifacts uses: actions/download-artifact@v4 with: name: compiled-${{ env.ARCH }}.tar - name: Extract compiled artifacts run: tar -xvf compiled-${{ env.ARCH }}.tar - name: Prevent rebuild of compiled artifacts run: | mkdir -p web/node_modules mkdir -p web/dist/raw mkdir -p core/startos/bindings mkdir -p sdk/base/lib/osBindings mkdir -p container-runtime/node_modules mkdir -p container-runtime/dist mkdir -p container-runtime/dist/node_modules mkdir -p core/startos/bindings mkdir -p sdk/dist mkdir -p sdk/baseDist mkdir -p patch-db/client/node_modules mkdir -p patch-db/client/dist mkdir -p web/.angular mkdir -p web/dist/raw/ui mkdir -p web/dist/raw/install-wizard mkdir -p web/dist/raw/setup-wizard mkdir -p web/dist/static/ui mkdir -p web/dist/static/install-wizard mkdir -p web/dist/static/setup-wizard PLATFORM=${{ matrix.platform }} make -t compiled-${{ env.ARCH }}.tar - run: git status - name: Run iso build run: PLATFORM=${{ matrix.platform }} make iso if: ${{ matrix.platform != 'raspberrypi' }} - name: Run img build run: PLATFORM=${{ matrix.platform }} make img if: ${{ matrix.platform == 'raspberrypi' }} - uses: actions/upload-artifact@v4 with: name: ${{ matrix.platform }}.squashfs path: results/*.squashfs - uses: actions/upload-artifact@v4 with: name: ${{ matrix.platform }}.iso path: results/*.iso if: ${{ matrix.platform != 'raspberrypi' }} - uses: actions/upload-artifact@v4 with: name: ${{ matrix.platform }}.img path: results/*.img if: ${{ matrix.platform == 'raspberrypi' }} - name: Upload OTA to registry run: >- PLATFORM=${{ matrix.platform }} make upload-ota TARGET="${{ fromJson('{ "alpha": "alpha-registry-x.start9.com", "beta": "beta-registry.start9.com", }')[github.event.inputs.deploy] }}" KEY="${{ fromJson( format('{{ "alpha": "{0}", "beta": "{1}", }}', secrets.ALPHA_INDEX_KEY, secrets.BETA_INDEX_KEY) )[github.event.inputs.deploy] }}" if: ${{ github.event.inputs.deploy != '' && github.event.inputs.deploy != 'NONE' }} index: if: ${{ github.event.inputs.deploy != '' && github.event.inputs.deploy != 'NONE' }} needs: [image] runs-on: ubuntu-latest steps: - run: >- curl "https://${{ fromJson('{ "alpha": "alpha-registry-x.start9.com", "beta": "beta-registry.start9.com", }')[github.event.inputs.deploy] }}:8443/resync.cgi?key=${{ fromJson( format('{{ "alpha": "{0}", "beta": "{1}", }}', secrets.ALPHA_INDEX_KEY, secrets.BETA_INDEX_KEY) )[github.event.inputs.deploy] }}"