name: "๐Ÿ“ฆ Test: Deploy (server)" on: workflow_call: inputs: distros: description: "Space-separated distro list" required: true type: string whitelist: description: "Optional space-separated whitelist of app ids" required: false type: string default: "" permissions: contents: read packages: read env: INFINITO_DEPLOY_TYPE: server INFINITO_DISTROS: ${{ inputs.distros }} NIX_CONFIG: | access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} INFINITO_IMAGE_TAG: ci-${{ github.sha }} INFINITO_GHCR_MIRROR_PREFIX: mirror INFINITO_PLAYWRIGHT_KEEP: ${{ vars.INFINITO_PLAYWRIGHT_KEEP }} INFINITO_APP_DISCOVERY_RUNNER: host jobs: discover: name: ๐ŸŒ Discover apps runs-on: ubuntu-latest timeout-minutes: 60 outputs: apps: ${{ steps.discover.outputs.apps }} steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: ๐Ÿ” Resolve repository owner shell: bash run: | set -euo pipefail echo "GITHUB_REPOSITORY_OWNER=$(scripts/meta/resolve/repository/owner.sh)" >> "$GITHUB_ENV" - name: ๐Ÿ“ฆ Install jq shell: bash run: ./scripts/install/apt.sh jq - name: Install deps (jq + envsubst) shell: bash run: ./scripts/install/apt.sh jq gettext-base - name: Set up Python uses: actions/setup-python@v6 with: python-version: "3.12" cache: pip cache-dependency-path: pyproject.toml - name: Install project (host venv) shell: bash run: make install - name: Resolve effective whitelist (diff vs origin/main) id: resolve_wl shell: bash env: INPUT_WHITELIST: ${{ inputs.whitelist }} run: ./scripts/github/resolve/effective_whitelist.sh - name: Discover apps id: discover shell: bash env: INFINITO_WHITELIST: ${{ steps.resolve_wl.outputs.whitelist }} run: ./scripts/github/resolve/output_apps.sh server: name: ๐ŸŒ Deploy ${{ matrix.apps }} if: needs.discover.outputs.apps != '' && needs.discover.outputs.apps != '[]' runs-on: ubuntu-latest timeout-minutes: 360 needs: discover strategy: fail-fast: false matrix: apps: ${{ fromJson(needs.discover.outputs.apps) }} steps: # Reclaim runner space before Docker pulls start. Server deploy tests pull # large CI and application images and can otherwise exhaust / on # GitHub-hosted runners. # Option rationale: docs/contributing/artefact/files/github/workflow.md - name: ๐Ÿงน Free disk space uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 with: tool-cache: true android: true dotnet: true haskell: true large-packages: true docker-images: true swap-storage: true - uses: actions/checkout@v6 # Replace the default ~4 GB runner swap with a larger file so transient # memory spikes (e.g. peertube plugin install, issue #162) don't trip # the host OOM-killer. Script picks / or /mnt based on live free space. - name: ๐Ÿ’พ Enlarge swap space shell: bash run: ./scripts/github/runner/enlarge_swap.sh - name: ๐Ÿ” Resolve repository owner shell: bash run: | set -euo pipefail echo "GITHUB_REPOSITORY_OWNER=$(scripts/meta/resolve/repository/owner.sh)" >> "$GITHUB_ENV" - name: ๐Ÿ“ฆ Install jq shell: bash run: ./scripts/install/apt.sh jq - name: ๐Ÿš€ Deploy app shell: bash env: apps: ${{ matrix.apps }} ANSIBLE_LOG_PATH: /tmp/ansible-${{ matrix.apps }}.log run: ./scripts/tests/deploy/ci/all.sh - name: ๐Ÿ“Š Role runtimes if: always() shell: bash run: python3 utils/github/profile/role_summary.py /tmp/ansible-${{ matrix.apps }}.log - name: ๐Ÿฉบ Dump runner state (on failure) if: failure() shell: bash run: ./scripts/github/runner/dump_state.sh "post-deploy failure (${{ matrix.apps }})" - name: Playwright step summary if: always() shell: bash run: | set -euo pipefail python3 utils/github/playwright_summary.py \ /tmp/playwright-artifacts \ "${{ matrix.apps }}" \ >> "$GITHUB_STEP_SUMMARY" - name: Upload Playwright artifacts if: always() uses: actions/upload-artifact@v7 with: name: playwright-server-${{ matrix.apps }} path: /tmp/playwright-artifacts/ if-no-files-found: ignore