From 9b935f1b3d63c9bdac9c55e1c4a496cd2d27abbc Mon Sep 17 00:00:00 2001 From: Jan-Erik Rediger Date: Mon, 27 Jul 2026 13:18:47 +0200 Subject: [PATCH 1/3] CI: Run doc lints on GitHub Actions --- .github/workflows/test.yml | 74 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 021ecec9d3..fc1281cb93 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,6 +26,7 @@ jobs: permissions: contents: read outputs: + docs-changed: ${{ steps.set-flags.outputs.docs-changed }} rust-changed: ${{ steps.set-flags.outputs.rust-changed }} steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -34,6 +35,12 @@ jobs: filter: blob:none fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha || github.sha }} + - id: changed-files-docs + uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 # v47.0.6 + with: + files: | + **/*.md + base_sha: ${{ github.event.pull_request.base.sha || github.event.before }} - id: changed-files-rust uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 # v47.0.6 with: @@ -45,8 +52,10 @@ jobs: - name: Decide which jobs to run id: set-flags env: + DOCS_CHANGED: ${{ steps.changed-files-docs.outputs.any_changed }} RUST_CHANGED: ${{ steps.changed-files-rust.outputs.any_changed }} run: | + echo "docs-changed=$DOCS_CHANGED" >> $GITHUB_OUTPUT echo "rust-changed=$RUST_CHANGED" >> $GITHUB_OUTPUT test-rust: @@ -94,3 +103,68 @@ jobs: echo "::add-matcher::.github/rust.json" make test-rust + + spelling: + runs-on: ubuntu-latest + needs: [decide-runs] + if: needs.decide-runs.outputs.docs-changed == 'true' + steps: + - *checkout + + - name: Install aspell + run: | + sudo apt update + sudo apt install aspell aspell-en + + - name: Check documentation spelling + run: bin/spellcheck.sh list + + docs: + runs-on: ubuntu-latest + needs: [decide-runs] + if: needs.decide-runs.outputs.docs-changed == 'true' + steps: + - *checkout + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 + with: + cache-bin: true + + - name: Set up Python + id: setup_python + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + with: + python-version: "3.10" + cache: 'pip' + cache-dependency-path: | + glean-core/python/requirements_dev.txt + + - name: Install mdbook-dtmo + run: | + cargo install mdbook-dtmo --version 0.15.2 + cp ~/.cargo/bin/mdbook-dtmo ~/.cargo/bin/mdbook + + - name: Version information + run: | + rustc --version + cargo --version + rustup --version + mdbook --version + + - name: Build Rust documentation + run: | + bin/build-rust-docs.sh + + - name: Generate Python docs + run: | + make docs-python + + - name: Install linkchecker + run: | + npm install link-checker + + - name: Check internal documentation links + run: | + make linkcheck-raw From c43c6a846ab328f13ff18c0df2daac9a288233b9 Mon Sep 17 00:00:00 2001 From: Jan-Erik Rediger Date: Mon, 27 Jul 2026 13:20:46 +0200 Subject: [PATCH 2/3] CI: Run YAML linter on GitHub Actions --- .github/workflows/test.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fc1281cb93..2e5e69dcda 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -27,6 +27,7 @@ jobs: contents: read outputs: docs-changed: ${{ steps.set-flags.outputs.docs-changed }} + yaml-changed: ${{ steps.set-flags.outputs.yaml-changed }} rust-changed: ${{ steps.set-flags.outputs.rust-changed }} steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -41,6 +42,13 @@ jobs: files: | **/*.md base_sha: ${{ github.event.pull_request.base.sha || github.event.before }} + - id: changed-files-yaml + uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 # v47.0.6 + with: + files: | + glean-core/**/*.yml + glean-core/**/*.yaml + base_sha: ${{ github.event.pull_request.base.sha || github.event.before }} - id: changed-files-rust uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 # v47.0.6 with: @@ -53,9 +61,11 @@ jobs: id: set-flags env: DOCS_CHANGED: ${{ steps.changed-files-docs.outputs.any_changed }} + YAML_CHANGED: ${{ steps.changed-files-yaml.outputs.any_changed }} RUST_CHANGED: ${{ steps.changed-files-rust.outputs.any_changed }} run: | echo "docs-changed=$DOCS_CHANGED" >> $GITHUB_OUTPUT + echo "yaml-changed=$YAML_CHANGED" >> $GITHUB_OUTPUT echo "rust-changed=$RUST_CHANGED" >> $GITHUB_OUTPUT test-rust: @@ -168,3 +178,26 @@ jobs: - name: Check internal documentation links run: | make linkcheck-raw + + lint-yaml: + runs-on: ubuntu-latest + needs: [decide-runs] + if: needs.decide-runs.outputs.yaml-changed == 'true' + steps: + - &checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + filter: blob:none + ref: ${{ github.event.pull_request.head.sha || github.sha }} + + - name: Install the latest version of uv + uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0 + + - name: Install yamllint + run: | + uv tool install yamllint + + - name: Lint YAML + run: | + make lint-yaml From e403b137c41d6d7ab027151809f4b568d6de167e Mon Sep 17 00:00:00 2001 From: Jan-Erik Rediger Date: Mon, 27 Jul 2026 13:22:15 +0200 Subject: [PATCH 3/3] CI: Run all lint tasks on GitHub Actions --- .github/ktlint.json | 17 +++ .github/workflows/test.yml | 207 +++++++++++++++++++++++++++++++++++++ 2 files changed, 224 insertions(+) create mode 100644 .github/ktlint.json diff --git a/.github/ktlint.json b/.github/ktlint.json new file mode 100644 index 0000000000..67c71200eb --- /dev/null +++ b/.github/ktlint.json @@ -0,0 +1,17 @@ +{ + "problemMatcher": [ + { + "owner": "ktlint", + "pattern": [ + { + "regexp": "(.*?):(\\d+):(\\d+): (.*?) \\(([-:\\w]+)\\)$", + "file": 1, + "line": 2, + "column": 3, + "code": 5, + "message": 4 + } + ] + } + ] +} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2e5e69dcda..c5093e2fe2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -28,7 +28,11 @@ jobs: outputs: docs-changed: ${{ steps.set-flags.outputs.docs-changed }} yaml-changed: ${{ steps.set-flags.outputs.yaml-changed }} + cargo-changed: ${{ steps.set-flags.outputs.cargo-changed }} + metrics-changed: ${{ steps.set-flags.outputs.metrics-changed }} rust-changed: ${{ steps.set-flags.outputs.rust-changed }} + kotlin-changed: ${{ steps.set-flags.outputs.kotlin-changed }} + python-changed: ${{ steps.set-flags.outputs.python-changed }} steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: @@ -49,6 +53,20 @@ jobs: glean-core/**/*.yml glean-core/**/*.yaml base_sha: ${{ github.event.pull_request.base.sha || github.event.before }} + - id: changed-files-cargo + uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 # v47.0.6 + with: + files: | + **/Cargo.toml + Cargo.lock + base_sha: ${{ github.event.pull_request.base.sha || github.event.before }} + - id: changed-files-metrics + uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 # v47.0.6 + with: + files: | + glean-core/**/pings.yaml + glean-core/**/metrics.yaml + base_sha: ${{ github.event.pull_request.base.sha || github.event.before }} - id: changed-files-rust uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 # v47.0.6 with: @@ -57,16 +75,39 @@ jobs: **/Cargo.lock **/*.rs base_sha: ${{ github.event.pull_request.base.sha || github.event.before }} + - id: changed-files-kotlin + uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 # v47.0.6 + with: + files: | + **/*.kt + **/*.gradle + gradle-wrapper/** + **/*.groovy + base_sha: ${{ github.event.pull_request.base.sha || github.event.before }} + - id: changed-files-python + uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 # v47.0.6 + with: + files: | + glean-core/**/*.py + base_sha: ${{ github.event.pull_request.base.sha || github.event.before }} - name: Decide which jobs to run id: set-flags env: DOCS_CHANGED: ${{ steps.changed-files-docs.outputs.any_changed }} YAML_CHANGED: ${{ steps.changed-files-yaml.outputs.any_changed }} + CARGO_CHANGED: ${{ steps.changed-files-cargo.outputs.any_changed }} + METRICS_CHANGED: ${{ steps.changed-files-metrics.outputs.any_changed }} RUST_CHANGED: ${{ steps.changed-files-rust.outputs.any_changed }} + KOTLIN_CHANGED: ${{ steps.changed-files-kotlin.outputs.any_changed }} + PYTHON_CHANGED: ${{ steps.changed-files-python.outputs.any_changed }} run: | echo "docs-changed=$DOCS_CHANGED" >> $GITHUB_OUTPUT echo "yaml-changed=$YAML_CHANGED" >> $GITHUB_OUTPUT + echo "cargo-changed=$CARGO_CHANGED" >> $GITHUB_OUTPUT + echo "metrics-changed=$METRICS_CHANGED" >> $GITHUB_OUTPUT echo "rust-changed=$RUST_CHANGED" >> $GITHUB_OUTPUT + echo "kotlin-changed=$KOTLIN_CHANGED" >> $GITHUB_OUTPUT + echo "python-changed=$PYTHON_CHANGED" >> $GITHUB_OUTPUT test-rust: runs-on: ubuntu-latest @@ -201,3 +242,169 @@ jobs: - name: Lint YAML run: | make lint-yaml + + lint-licenses: + runs-on: ubuntu-latest + needs: [decide-runs] + if: needs.decide-runs.outputs.cargo-changed == 'true' + steps: + - *checkout + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 + with: + cache-bin: true + + - name: Install cargo-deny + run: cargo install cargo-deny --version 0.19.9 + + - name: Run license check + run: cargo deny check licenses + + - name: Run dependency ban check + run: cargo deny check bans + + lint-schema: + runs-on: ubuntu-latest + needs: [decide-runs] + steps: + - *checkout + + - name: Check vendored schema for upstream updates + run: | + bin/update-schema.sh HEAD + if ! git diff --exit-code HEAD -- glean-core/preview/tests/glean.1.schema.json; then + echo "====================================" + echo "Latest schema from upstream changed." + echo "Please regenerate the file using:" + echo " bin/update-schema.sh latest" + echo "Commit the modified files and push." + echo "====================================" + exit 1 + fi + + lint-rust: + runs-on: ubuntu-latest + needs: [decide-runs] + if: needs.decide-runs.outputs.rust-changed == 'true' + steps: + - *checkout + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: "${{ env.MSRV }}" + components: clippy + + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 + + - run: cargo clippy --version + + - name: Clippy + run: | + echo "::add-matcher::.github/rust.json" + make lint-rust + + lint-python: + runs-on: ubuntu-latest + needs: [decide-runs] + if: needs.decide-runs.outputs.python-changed == 'true' + steps: + - *checkout + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: "stable" + + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 + + - name: Install the latest version of uv + uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0 + + - name: Lint Python + run: make lint-python + + lint-internal-metrics: + runs-on: ubuntu-latest + needs: [decide-runs] + if: needs.decide-runs.outputs.metrics-changed == 'true' + steps: + - *checkout + + - name: Install the latest version of uv + uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0 + + - name: Internal metrics docs consistency check + run: | + make docs-metrics + if ! git diff --exit-code HEAD -- docs/user/collected-metrics/metrics.md; then + echo "==================================================" + echo "metrics.md is different from what's stored in git." + echo "Please regenerate the file using:" + echo " make docs-metrics" + echo "Commit the modified file and push." + echo "==================================================" + exit 1 + fi + + lint-kotlin: + runs-on: ubuntu-latest + needs: [decide-runs] + if: needs.decide-runs.outputs.kotlin-changed == 'true' + steps: + - *checkout + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 + + - name: Set up JDK 17 + uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0 + with: + java-version: '17' + distribution: 'temurin' + + - name: Setup Android SDK + uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1 + with: + accept-android-sdk-licenses: true + log-accepted-android-sdk-licenses: false + + - name: Install Android NDK + run: | + sdkmanager "ndk;29.0.14206865" + + - name: Restrict to Linux builds only + run: | + echo "rust.targets=linux-x86-64" > local.properties + + - name: Gradle lint + run: | + echo "::add-matcher::.github/ktlint.json" + ./gradlew --no-daemon lint ktlint detekt + + fmt-rust: + runs-on: ubuntu-latest + needs: [decide-runs] + if: needs.decide-runs.outputs.rust-changed == 'true' + steps: + - *checkout + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: "${{ env.MSRV }}" + components: rustfmt + + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 + + - run: rustfmt --version + + - name: cargo fmt + run: | + echo "::add-matcher::.github/rust.json" + cargo fmt -- --check