name: CI on: push: branches: [main] permissions: contents: write jobs: Check: strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] item: [ build, clippy, test, markdown-code, examples, docs-refresh, api-docs, ] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v7 - uses: actions-rust-lang/setup-rust-toolchain@v1 - name: Configure git identity run: | git config --global user.email "foo@bar.sqz" git config --global user.name "foo" # Every check runs inside a git-lock / git-unlock pair: the final unlock # doubles as the idempotency check, failing the job when the check left # the working tree dirty (e.g. generated docs are out of date). - name: Lock workspace for CI run: cargo ci git-lock - name: Run check id: check shell: bash run: | case "${{ matrix.item }}" in build) cargo ci build-check ;; clippy) cargo ci clippy-check ;; test) cargo ci test-all ;; # markdown-code also verifies the translated docs structure. markdown-code) cargo ci markdown-check-all && cargo ci markdown-compare-all ;; examples) cargo ci example-check ;; docs-refresh) cargo ci example-refresh cargo ci docsify-refresh cargo ci features-refresh ;; api-docs) cargo ci docs-check ;; esac continue-on-error: true - name: Unlock workspace (idempotency check) if: always() run: cargo ci git-unlock --show-diff - name: Fail when the check failed if: steps.check.outcome == 'failure' run: exit 1 - name: Upload collect reports if: always() uses: actions/upload-artifact@v4 with: name: ci-collect-${{ matrix.os }}-${{ matrix.item }} path: .temp/reports/collect/ if-no-files-found: ignore # Build the distributable packages in parallel with the checks, so that the # `unreleased` tag and the Pages deployment always publish fresh artifacts. Build: strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v7 - uses: actions-rust-lang/setup-rust-toolchain@v1 - name: Compute package metadata id: metadata shell: bash run: | case "$RUNNER_OS" in Windows) os="win" ;; Linux) os="linux" ;; macOS) os="mac" ;; esac echo "os=$os" >> "$GITHUB_OUTPUT" - name: Install mling shell: bash run: | if [ "$RUNNER_OS" = "Windows" ]; then powershell -ExecutionPolicy Bypass -File .run/src/bin/install-mling.ps1 else bash .run/src/bin/install-mling.sh fi - name: Package mling shell: bash run: | mkdir -p dist name="mling-${{ steps.metadata.outputs.os }}.tar.gz" tar -czf "dist/$name" -C .temp/mling . if command -v sha256sum >/dev/null 2>&1; then (cd dist && sha256sum "$name" > "$name.sha256") else (cd dist && shasum -a 256 "$name" > "$name.sha256") fi - name: Upload mling package uses: actions/upload-artifact@v4 with: name: mling-${{ steps.metadata.outputs.os }}-pkg path: dist/mling-* if-no-files-found: error Move-Unreleased-Tag: if: github.ref == 'refs/heads/main' needs: [Check, Build] runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 with: fetch-depth: 0 - run: | git tag -f unreleased git push origin unreleased --force # Collects every matrix run's reports and renders the consolidated result.md # into the job summary. Runs even when some checks failed, so the failures # are still reported. Report: needs: [Check] if: always() runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - uses: actions-rust-lang/setup-rust-toolchain@v1 - name: Download collect reports uses: actions/download-artifact@v4 with: path: .temp/reports/collect pattern: ci-collect-* merge-multiple: true - name: Generate report run: cargo ci report-collect - name: Publish report to step summary run: cat .temp/reports/result.md >> "$GITHUB_STEP_SUMMARY" Deploy-Github-Pages: needs: [Move-Unreleased-Tag] permissions: contents: read pages: write id-token: write environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v7 - uses: actions-rust-lang/setup-rust-toolchain@v1 - name: Install nightly toolchain run: rustup toolchain install nightly - name: Build API docs run: cargo +nightly run --manifest-path .run/Cargo.toml --bin deploy-api-docs -- --docsrs - name: Install cargo-llvm-cov run: cargo install --git https://github.com/Weicao-CatilGrass/cargo-llvm-cov cargo-llvm-cov - name: Run cov-test run: cargo run --manifest-path .run/Cargo.toml --bin cov-test - name: Delete .temp directory before deployment run: rm -rf .temp - name: Download mling packages uses: actions/download-artifact@v4 with: path: dist merge-multiple: true - name: Setup Pages uses: actions/configure-pages@v5 - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: path: "." - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v5