# SPDX-License-Identifier: AGPL-3.0-or-later name: CI on: workflow_dispatch: env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" GHCR_REGISTRY: ghcr.io/${{ github.repository_owner }} jobs: typecheck: runs-on: ubuntu-24.04 timeout-minutes: 25 steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up Rust toolchain (CI helpers) uses: dtolnay/rust-toolchain@b3b07ba8b418998c39fb20f53e8b695cdcc8de1b with: toolchain: "1.93.0" - name: Install pnpm uses: pnpm/action-setup@c5ba7f7862a0f64c1b1a05fbac13e0b8e86ba08c - name: Install Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with: node-version: '24' cache: 'pnpm' - name: Install dependencies run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- ci --step install_dependencies - name: Run typecheck run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- ci --step typecheck test: runs-on: ubuntu-24.04 timeout-minutes: 25 steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up Rust toolchain (CI helpers) uses: dtolnay/rust-toolchain@b3b07ba8b418998c39fb20f53e8b695cdcc8de1b with: toolchain: "1.93.0" - name: Install pnpm uses: pnpm/action-setup@c5ba7f7862a0f64c1b1a05fbac13e0b8e86ba08c - name: Install Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with: node-version: '24' cache: 'pnpm' - name: Install dependencies run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- ci --step install_dependencies - name: Run tests run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- ci --step test rust: runs-on: blacksmith-4vcpu-ubuntu-2404 timeout-minutes: 30 steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Install Rust toolchain uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 with: toolchain: stable components: clippy, rustfmt - name: Cache cargo uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 with: path: | ~/.cargo/registry ~/.cargo/git target key: rust-${{ runner.os }}-${{ hashFiles('Cargo.lock') }} restore-keys: | rust-${{ runner.os }}- - name: Check formatting run: cargo fmt --all -- --check - name: Clippy (warnings as errors) run: cargo clippy --workspace -- -D warnings - name: Run tests run: cargo test --workspace marketing-docker: runs-on: blacksmith-4vcpu-ubuntu-2404 timeout-minutes: 45 steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up Rust toolchain (CI helpers) uses: dtolnay/rust-toolchain@b3b07ba8b418998c39fb20f53e8b695cdcc8de1b with: toolchain: "1.93.0" - name: Set up Docker Buildx uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f - name: Build marketing image run: | BUILD_VERSION="$(cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- resolve-calver)" docker build \ -f fluxer_marketing/Dockerfile \ -t "fluxer-marketing:${BUILD_VERSION}" \ --build-arg "BUILD_VERSION=${BUILD_VERSION}" \ . env: DOCKER_BUILD_SUMMARY: false DOCKER_BUILD_RECORD_UPLOAD: false gateway: runs-on: ubuntu-24.04 timeout-minutes: 25 steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up Rust toolchain (CI helpers) uses: dtolnay/rust-toolchain@b3b07ba8b418998c39fb20f53e8b695cdcc8de1b with: toolchain: "1.93.0" - name: Set up Erlang uses: erlef/setup-beam@3559ac3b631a9560f28817e8e7fdde1638664336 with: otp-version: '28' rebar3-version: '3.24.0' - name: Cache rebar3 dependencies uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 with: path: | fluxer_gateway/_build ~/.cache/rebar3 key: rebar3-${{ runner.os }}-${{ hashFiles('fluxer_gateway/rebar.lock') }} restore-keys: | rebar3-${{ runner.os }}- - name: Check formatting run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- ci --step gateway_fmt - name: Compile run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- ci --step gateway_compile - name: Run dialyzer run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- ci --step gateway_dialyzer - name: Run eunit tests run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- ci --step gateway_eunit knip: runs-on: ubuntu-24.04 timeout-minutes: 25 steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up Rust toolchain (CI helpers) uses: dtolnay/rust-toolchain@b3b07ba8b418998c39fb20f53e8b695cdcc8de1b with: toolchain: "1.93.0" - name: Install pnpm uses: pnpm/action-setup@c5ba7f7862a0f64c1b1a05fbac13e0b8e86ba08c - name: Install Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with: node-version: '24' cache: 'pnpm' - name: Install dependencies run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- ci --step install_dependencies - name: Run knip run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- ci --step knip ci-scripts: runs-on: ubuntu-24.04 timeout-minutes: 25 steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Install Rust toolchain uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 with: toolchain: stable components: rustfmt - name: Sync ci helper dependencies run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- ci-scripts --step sync - name: Run ci helper tests run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- ci-scripts --step test helm-and-scripts: runs-on: ubuntu-24.04 timeout-minutes: 10 steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up Rust toolchain (CI helpers) uses: dtolnay/rust-toolchain@b3b07ba8b418998c39fb20f53e8b695cdcc8de1b with: toolchain: "1.93.0" - name: Install helm uses: azure/setup-helm@bf6a7d304bc2fdb57e0331155b7ebf2c504acf0a - name: Resolve Helm test build version run: >- cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- resolve-calver --github-env --env-name HELM_TEST_BUILD_VERSION - name: Helm dependency update (all charts) run: | set -euo pipefail for chart_dir in deploy/helm/*/; do if [[ -f "${chart_dir}Chart.yaml" ]]; then helm dependency update "$chart_dir" fi done - name: Helm lint (all charts) run: | set -euo pipefail FAILED=0 for chart_dir in deploy/helm/*/; do if [[ -f "${chart_dir}Chart.yaml" ]]; then echo "--- Linting ${chart_dir} ---" VALUES_ARGS=() if [[ -f "${chart_dir}values.yaml" ]]; then VALUES_ARGS=(-f "${chart_dir}values.yaml") fi EXTRA_SETS=(--set-string "global.registry=${GHCR_REGISTRY}") case "${chart_dir}" in *gateway*) EXTRA_SETS+=(--set-string "gateway.tag=${HELM_TEST_BUILD_VERSION}" --set-string "gateway.build.version=${HELM_TEST_BUILD_VERSION}") ;; *api*) EXTRA_SETS+=(--set-string app.name=api --set-string "app.tag=${HELM_TEST_BUILD_VERSION}" --set-string app.config=stable --set-string "app.build.version=${HELM_TEST_BUILD_VERSION}") ;; *app-proxy*) EXTRA_SETS+=(--set-string app.name=app-proxy --set-string "app.tag=${HELM_TEST_BUILD_VERSION}" --set-string app.config=stable --set-string "app.build.version=${HELM_TEST_BUILD_VERSION}") ;; *admin*) EXTRA_SETS+=(--set-string app.name=admin --set-string "app.tag=${HELM_TEST_BUILD_VERSION}" --set-string app.config=stable --set-string "app.build.version=${HELM_TEST_BUILD_VERSION}") ;; *marketing*) EXTRA_SETS+=(--set-string app.name=marketing --set-string "app.tag=${HELM_TEST_BUILD_VERSION}" --set-string app.config=stable --set-string "app.build.version=${HELM_TEST_BUILD_VERSION}") ;; *media-proxy*) EXTRA_SETS+=(--set-string "mediaProxy.tag=${HELM_TEST_BUILD_VERSION}" --set-string "staticProxy.tag=${HELM_TEST_BUILD_VERSION}" --set-string "mediaProxy.build.version=${HELM_TEST_BUILD_VERSION}" --set-string "staticProxy.build.version=${HELM_TEST_BUILD_VERSION}") ;; *uploads*) EXTRA_SETS+=(--set-string app.name=uploads --set-string "app.tag=${HELM_TEST_BUILD_VERSION}" --set-string app.config=stable --set-string "app.build.version=${HELM_TEST_BUILD_VERSION}") ;; *worker*) EXTRA_SETS+=(--set-string "workerRealtime.tag=${HELM_TEST_BUILD_VERSION}" --set-string "workerUnfurl.tag=${HELM_TEST_BUILD_VERSION}" --set-string "workerLifecycle.tag=${HELM_TEST_BUILD_VERSION}" --set-string "workerBatch.tag=${HELM_TEST_BUILD_VERSION}" --set-string "workerRealtime.build.version=${HELM_TEST_BUILD_VERSION}" --set-string "workerUnfurl.build.version=${HELM_TEST_BUILD_VERSION}" --set-string "workerLifecycle.build.version=${HELM_TEST_BUILD_VERSION}" --set-string "workerBatch.build.version=${HELM_TEST_BUILD_VERSION}") ;; *member-lists*|*messages*|*presence*|*snowflakes*|*unfurl*|*users*|*voice-states*) EXTRA_SETS+=(--set-string "svc.tag=${HELM_TEST_BUILD_VERSION}" --set-string "svc.build.version=${HELM_TEST_BUILD_VERSION}" --set-string svc.build.channel=stable) ;; esac if ! helm lint "$chart_dir" "${VALUES_ARGS[@]}" "${EXTRA_SETS[@]}" --strict; then FAILED=1 fi fi done if [[ "$FAILED" -ne 0 ]]; then echo "::error::One or more Helm charts failed linting" exit 1 fi - name: Helm template (gateway) run: | set -euo pipefail helm template fluxer-gateway deploy/helm/gateway \ -f deploy/helm/gateway/values.yaml \ --set-string "global.registry=${GHCR_REGISTRY}" \ --set-string "gateway.tag=${HELM_TEST_BUILD_VERSION}" \ --set-string "gateway.build.version=${HELM_TEST_BUILD_VERSION}" \ -n fluxer > /dev/null echo "Gateway chart templates render successfully." - name: Validate gateway manifests with kubeconform run: | set -euo pipefail helm template fluxer-gateway deploy/helm/gateway \ -f deploy/helm/gateway/values.yaml \ --set-string "global.registry=${GHCR_REGISTRY}" \ --set-string "gateway.tag=${HELM_TEST_BUILD_VERSION}" \ --set-string "gateway.build.version=${HELM_TEST_BUILD_VERSION}" \ -n fluxer \ | docker run -i --rm ghcr.io/yannh/kubeconform:v0.6.7 \ -strict -summary -kubernetes-version 1.31.0