# SPDX-License-Identifier: AGPL-3.0-or-later name: Tests on: pull_request: push: branches: - main permissions: contents: read concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} env: GHCR_REGISTRY: ghcr.io/${{ github.repository_owner }} CARGO_PROFILE_DEV_DEBUG: none CARGO_PROFILE_TEST_DEBUG: none CARGO_INCREMENTAL: '0' jobs: typecheck: runs-on: ubuntu-24.04 timeout-minutes: 25 env: FLUXER_CI_BIN: ${{ github.workspace }}/target/debug/fluxer-ci steps: - name: Checkout code uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 - name: Set up Rust toolchain (CI helpers) uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 with: toolchain: "1.93.0" targets: wasm32-unknown-unknown - name: Restore ci helper id: ci-helper uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 with: path: target/debug/fluxer-ci key: >- fluxer-ci-bin-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'Cargo.toml', 'tools/ci/Cargo.toml', 'tools/ci/src/**', 'tools/ci/templates/**') }} - name: Build ci helper if: steps.ci-helper.outputs.cache-hit != 'true' run: cargo build --locked --package fluxer-ci - name: Save ci helper if: github.ref == 'refs/heads/main' && steps.ci-helper.outputs.cache-hit != 'true' uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 with: path: target/debug/fluxer-ci key: >- fluxer-ci-bin-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'Cargo.toml', 'tools/ci/Cargo.toml', 'tools/ci/src/**', 'tools/ci/templates/**') }} - name: Install pnpm uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 - name: Install Node.js uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e with: node-version: '24' cache: 'pnpm' - name: Install dependencies run: | "$FLUXER_CI_BIN" ci --step install_dependencies - name: Run typecheck run: | "$FLUXER_CI_BIN" ci --step typecheck test: runs-on: ubuntu-24.04 timeout-minutes: 25 env: FLUXER_CI_BIN: ${{ github.workspace }}/target/debug/fluxer-ci PNPM_TEST_WORKSPACE_CONCURRENCY: '2' steps: - name: Checkout code uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 - name: Set up Rust toolchain (CI helpers) uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 with: toolchain: "1.93.0" targets: wasm32-unknown-unknown - name: Restore ci helper id: ci-helper uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 with: path: target/debug/fluxer-ci key: >- fluxer-ci-bin-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'Cargo.toml', 'tools/ci/Cargo.toml', 'tools/ci/src/**', 'tools/ci/templates/**') }} - name: Build ci helper if: steps.ci-helper.outputs.cache-hit != 'true' run: cargo build --locked --package fluxer-ci - name: Install pnpm uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 - name: Install Node.js uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e with: node-version: '24' cache: 'pnpm' - name: Install dependencies run: | "$FLUXER_CI_BIN" ci --step install_dependencies - name: Restore fluxer_app wasm artifacts id: app-wasm uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 with: path: | fluxer_app/pkgs/libfluxcore fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts key: >- app-wasm-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs', 'tools/ci/templates/libfluxcore_wrapper.js', 'tools/ci/templates/libfluxcore_wrapper.d.ts', 'fluxer_app/rust/libfluxcore/Cargo.toml', 'fluxer_app/rust/libfluxcore/Cargo.lock', 'fluxer_app/rust/libfluxcore/.cargo/config.toml', 'fluxer_app/rust/libfluxcore/src/**', 'packages/markdown_parser/rust/Cargo.toml', 'packages/markdown_parser/rust/.cargo/config.toml', 'packages/markdown_parser/rust/src/**') }} - name: Run tests run: | "$FLUXER_CI_BIN" ci --step test - name: Save fluxer_app wasm artifacts if: always() && github.ref == 'refs/heads/main' && steps.app-wasm.outputs.cache-hit != 'true' uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 with: path: | fluxer_app/pkgs/libfluxcore fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts key: >- app-wasm-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs', 'tools/ci/templates/libfluxcore_wrapper.js', 'tools/ci/templates/libfluxcore_wrapper.d.ts', 'fluxer_app/rust/libfluxcore/Cargo.toml', 'fluxer_app/rust/libfluxcore/Cargo.lock', 'fluxer_app/rust/libfluxcore/.cargo/config.toml', 'fluxer_app/rust/libfluxcore/src/**', 'packages/markdown_parser/rust/Cargo.toml', 'packages/markdown_parser/rust/.cargo/config.toml', 'packages/markdown_parser/rust/src/**') }} rust: runs-on: ubuntu-24.04 timeout-minutes: 30 steps: - name: Checkout code uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 with: toolchain: "1.93.0" components: clippy, rustfmt - name: Install pnpm uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 - name: Install Node.js uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e with: node-version: '24' cache: 'pnpm' - name: Cache cargo uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 with: workspaces: | . -> target fluxer_desktop/native/rust -> target save-if: ${{ github.ref == 'refs/heads/main' }} - name: Install native dependencies run: | sudo apt-get update sudo apt-get install -y --no-install-recommends \ pkg-config \ build-essential \ libcurl4-openssl-dev \ libvips-dev \ libavfilter-dev \ libheif-dev \ libwebp-dev - name: Install Node.js dependencies run: pnpm --filter fluxer_admin install - name: Check formatting run: cargo fmt --all -- --check - name: Check formatting (desktop native) run: cargo fmt --manifest-path fluxer_desktop/native/rust/Cargo.toml --all -- --check - name: Clippy (warnings as errors) run: cargo clippy --workspace -- -D warnings - name: Run tests run: cargo test --workspace - name: Run desktop native tests run: cargo test --manifest-path fluxer_desktop/native/rust/Cargo.toml gateway: runs-on: ubuntu-24.04 timeout-minutes: 25 env: FLUXER_CI_BIN: ${{ github.workspace }}/target/debug/fluxer-ci steps: - name: Checkout code uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 - name: Set up Rust toolchain (CI helpers) uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 with: toolchain: "1.93.0" - name: Cache cargo (gateway NIFs) uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 with: workspaces: | fluxer_gateway/native/guild_member_list_oset_nif -> target fluxer_gateway/native/push_markdown_plaintext_nif -> target save-if: ${{ github.ref == 'refs/heads/main' }} - name: Restore ci helper id: ci-helper uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 with: path: target/debug/fluxer-ci key: >- fluxer-ci-bin-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'Cargo.toml', 'tools/ci/Cargo.toml', 'tools/ci/src/**', 'tools/ci/templates/**') }} - name: Build ci helper if: steps.ci-helper.outputs.cache-hit != 'true' run: cargo build --locked --package fluxer-ci - name: Set up Erlang uses: erlef/setup-beam@54075bcc5e249e4758d363f27d099f55d843f124 with: otp-version: '28' rebar3-version: '3.24.0' - name: Restore rebar3 dependencies id: rebar3-cache uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 with: path: | ~/.cache/rebar3 fluxer_gateway/_build !fluxer_gateway/_build/default/lib/fluxer_gateway !fluxer_gateway/_build/test/lib/fluxer_gateway key: >- rebar3-${{ runner.os }}-otp28-rebar3.24.0-${{ hashFiles('fluxer_gateway/rebar.lock', 'fluxer_gateway/rebar.config') }} restore-keys: | rebar3-${{ runner.os }}-otp28-rebar3.24.0- - name: Check formatting run: | "$FLUXER_CI_BIN" ci --step gateway_fmt - name: Compile run: | "$FLUXER_CI_BIN" ci --step gateway_compile - name: Run dialyzer run: | "$FLUXER_CI_BIN" ci --step gateway_dialyzer - name: Run eunit tests run: | "$FLUXER_CI_BIN" ci --step gateway_eunit - name: Save rebar3 dependencies if: always() && github.ref == 'refs/heads/main' && steps.rebar3-cache.outputs.cache-hit != 'true' uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 with: path: | ~/.cache/rebar3 fluxer_gateway/_build !fluxer_gateway/_build/default/lib/fluxer_gateway !fluxer_gateway/_build/test/lib/fluxer_gateway key: >- rebar3-${{ runner.os }}-otp28-rebar3.24.0-${{ hashFiles('fluxer_gateway/rebar.lock', 'fluxer_gateway/rebar.config') }} knip: runs-on: ubuntu-24.04 timeout-minutes: 25 env: FLUXER_CI_BIN: ${{ github.workspace }}/target/debug/fluxer-ci steps: - name: Checkout code uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 - name: Set up Rust toolchain (CI helpers) uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 with: toolchain: "1.93.0" targets: wasm32-unknown-unknown - name: Restore ci helper id: ci-helper uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 with: path: target/debug/fluxer-ci key: >- fluxer-ci-bin-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'Cargo.toml', 'tools/ci/Cargo.toml', 'tools/ci/src/**', 'tools/ci/templates/**') }} - name: Build ci helper if: steps.ci-helper.outputs.cache-hit != 'true' run: cargo build --locked --package fluxer-ci - name: Install pnpm uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 - name: Install Node.js uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e with: node-version: '24' cache: 'pnpm' - name: Install dependencies run: | "$FLUXER_CI_BIN" ci --step install_dependencies - name: Restore fluxer_app wasm artifacts id: app-wasm uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 with: path: | fluxer_app/pkgs/libfluxcore fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts key: >- app-wasm-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs', 'tools/ci/templates/libfluxcore_wrapper.js', 'tools/ci/templates/libfluxcore_wrapper.d.ts', 'fluxer_app/rust/libfluxcore/Cargo.toml', 'fluxer_app/rust/libfluxcore/Cargo.lock', 'fluxer_app/rust/libfluxcore/.cargo/config.toml', 'fluxer_app/rust/libfluxcore/src/**', 'packages/markdown_parser/rust/Cargo.toml', 'packages/markdown_parser/rust/.cargo/config.toml', 'packages/markdown_parser/rust/src/**') }} - name: Run knip run: | "$FLUXER_CI_BIN" ci --step knip - name: Save fluxer_app wasm artifacts if: always() && github.ref == 'refs/heads/main' && steps.app-wasm.outputs.cache-hit != 'true' uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 with: path: | fluxer_app/pkgs/libfluxcore fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts key: >- app-wasm-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs', 'tools/ci/templates/libfluxcore_wrapper.js', 'tools/ci/templates/libfluxcore_wrapper.d.ts', 'fluxer_app/rust/libfluxcore/Cargo.toml', 'fluxer_app/rust/libfluxcore/Cargo.lock', 'fluxer_app/rust/libfluxcore/.cargo/config.toml', 'fluxer_app/rust/libfluxcore/src/**', 'packages/markdown_parser/rust/Cargo.toml', 'packages/markdown_parser/rust/.cargo/config.toml', 'packages/markdown_parser/rust/src/**') }} i18n: runs-on: ubuntu-24.04 timeout-minutes: 25 steps: - name: Checkout code uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 - name: Install pnpm uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 - name: Install Node.js uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e with: node-version: '24' cache: 'pnpm' - name: Install dependencies run: pnpm install --frozen-lockfile - name: Compile locale catalogs run: pnpm i18n:compile - name: Check drift of compiled locale modules run: | if ! git diff --exit-code -- \ packages/errors/src/i18n/locales \ packages/errors/src/i18n/ErrorI18nTypes.generated.ts \ fluxer_api/pkgs/email/src/email_i18n/locales \ fluxer_api/pkgs/email/src/email_i18n/EmailI18nTypes.generated.ts \ fluxer_api/src/api/content_i18n/locales; then echo "::error::Compiled locale modules are outdated. Run 'pnpm i18n:compile' and commit the result. Translations belong in the weblate/ catalogs, not in the generated locales/ modules." exit 1 fi fonts: runs-on: ubuntu-24.04 timeout-minutes: 10 steps: - name: Checkout code uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 - name: Set up Python uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 with: python-version: "3.13" - name: Install font tooling run: python3 -m pip install -r tools/fonts/requirements.txt - name: Verify shipped fonts match the lockfile run: python3 tools/fonts/build_fonts.py --verify