name: CI - Rust permissions: contents: read on: push: paths: # NOTE: GitHub Actions do not allow using YAML references, the same path # list is used below for the pull request event. Keep both lists in sync!! # this file as well - .github/workflows/ci-rust.yml # any change in the rust subfolder - rust/** # except Markdown documentation - "!rust/**.md" # except the packaging - "!rust/package/**" # except the DBus configuration - "!rust/share/**" pull_request: paths: # NOTE: GitHub Actions do not allow using YAML references, the same path # list is used above for the push event. Keep both lists in sync!! # this file as well - .github/workflows/ci-rust.yml # any change in the rust subfolder - rust/** # except Markdown documentation - "!rust/**.md" # except the packaging - "!rust/package/**" # except the DBus configuration - "!rust/share/**" # allow running manually workflow_dispatch: env: CARGO_TERM_COLOR: always # this makes the build slightly faster and the saved cache smaller CARGO_INCREMENTAL: 0 jobs: fmt: # the default timeout is 6 hours, that's too much if the job gets stuck timeout-minutes: 10 runs-on: ubuntu-latest defaults: run: working-directory: ./rust steps: - name: Git Checkout uses: actions/checkout@v4 - name: Rust toolchain run: | rustup show cargo --version - name: Run rustfmt run: cargo fmt --all -- --check clippy: # the default timeout is 6 hours, that's too much if the job gets stuck timeout-minutes: 20 runs-on: ubuntu-latest defaults: run: working-directory: ./rust steps: - name: Git Checkout uses: actions/checkout@v4 - name: Rust toolchain run: | rustup show cargo --version - name: Install packages run: | sudo apt-get update sudo apt-get -y install libclang-18-dev libpam0g-dev - name: Installed packages run: apt list --installed - name: Rust cache uses: actions/cache@v4 with: path: | ~/.cargo rust/target key: ${{ runner.os }}-cargo-clippy-${{ hashFiles('**/Cargo.lock') }} - name: Run clippy linter run: cargo clippy tests: # the default timeout is 6 hours, that's too much if the job gets stuck timeout-minutes: 30 runs-on: ubuntu-latest env: COVERAGE: 1 defaults: run: working-directory: ./rust steps: - name: Git Checkout uses: actions/checkout@v4 - name: Rust toolchain run: | rustup show cargo --version - name: Install packages run: | sudo apt-get update sudo apt-get -y install libclang-18-dev libpam0g-dev python3-langtable jsonnet - name: Prepare for tests run: | # the langtable data location is different in SUSE/openSUSE, create a symlink sudo mkdir -p /usr/share/langtable sudo ln -s /usr/lib/python3/dist-packages/langtable/data /usr/share/langtable/data # create the /etc/agama.d/locales file with list of locales sudo mkdir /etc/agama.d sudo bash -c 'ls -1 -d /usr/share/i18n/locales/* | sed -e "s#/usr/share/i18n/locales/##" >/etc/agama.d/locales' - name: Installed packages run: apt list --installed - name: Rust cache id: cache-tests uses: actions/cache@v4 with: path: | ~/.cargo rust/target-coverage key: ${{ runner.os }}-cargo-tests-${{ hashFiles('**/Cargo.lock') }} - name: Install Tarpaulin (for code coverage) # skip the step completely if the cache has been restored # this avoids refreshing the crates index and saves few seconds if: steps.cache-tests.outputs.cache-hit != 'true' run: cargo install cargo-tarpaulin - name: Run the tests # Compile into the ./target-coverage directory because tarpaulin uses special compilation # flags, to avoid reusing the previous builds it always starts from scratch. # The --skip-clean skips the cleanup and allows using the cached results. # See https://github.com/xd009642/tarpaulin/discussions/772 run: cargo tarpaulin --workspace --all-targets --doc --out xml --target-dir target-coverage --skip-clean -- --nocapture env: # use the "stable" tool chain (installed by default) instead of the "nightly" default in tarpaulin RUSTC_BOOTSTRAP: 1 RUSTUP_TOOLCHAIN: stable RUST_BACKTRACE: 1 RUSTFLAGS: --cfg ci # send the code coverage for the Rust part to the coveralls.io - name: Send coverage data to Coveralls timeout-minutes: 10 # ignore errors in this step continue-on-error: true uses: coverallsapp/github-action@v2 with: flag-name: rust base-path: ./rust format: cobertura # Close the parallel build and inherit the Web parts (it needs a separate step, the "carryforward" flag can be used # only with the "parallel-finished: true" option) - name: Close the Coveralls build timeout-minutes: 10 # ignore errors in this step continue-on-error: true uses: coverallsapp/github-action@v2 with: parallel-finished: true carryforward: "rust,service,web" openapi: # the default timeout is 6 hours, that's too much if the job gets stuck timeout-minutes: 30 runs-on: ubuntu-latest defaults: run: working-directory: ./rust steps: - name: Git Checkout uses: actions/checkout@v4 - name: Rust toolchain run: | rustup show cargo --version - name: Configure system # disable updating initramfs (the system is not booted again) # disable updating man db (to save some time) run: | sudo sed -i "s/yes/no/g" /etc/initramfs-tools/update-initramfs.conf sudo rm -f /var/lib/man-db/auto-update - name: Install packages run: | sudo apt-get update sudo apt-get -y install libclang-18-dev libpam0g-dev # uninstall the python3-jsonschema package, openapi-spec-validator wants # to install a newer version which would conflict with that sudo apt-get purge python3-jsonschema sudo pip install openapi-spec-validator - name: Installed packages run: apt list --installed - name: Rust cache uses: actions/cache@v4 with: path: | ~/.cargo rust/target key: ${{ runner.os }}-cargo-openapi-${{ hashFiles('**/Cargo.lock') }} - name: Generate the OpenAPI specification run: cargo xtask openapi - name: Validate the OpenAPI specification run: openapi-spec-validator out/openapi/*