Continuous Integration
Relevant source files
This document covers the automated continuous integration and deployment pipeline for the axconfig-gen repository. The CI system ensures code quality, runs comprehensive tests, and automatically deploys documentation. For information about manual testing procedures, see Testing. For details about the build system configuration, see Build System and Dependencies.
Pipeline Overview
The CI system is implemented using GitHub Actions with a workflow defined in .github/workflows/ci.yml(L1 - L53) The pipeline consists of two primary jobs that run on every push and pull request event.
CI Workflow Structure
flowchart TD subgraph Outputs["Outputs"] QUALITY["Code Quality Validation"] ARTIFACTS["Build Artifacts"] DOCS["Published Documentation"] PAGES["GitHub Pages Deployment"] end subgraph subGraph3["GitHub Actions Workflow"] WORKFLOW["ci.yml workflow"] subgraph subGraph2["doc job"] CHECKOUT_DOC["actions/checkout@v4"] RUST_SETUP_DOC["dtolnay/rust-toolchain@nightly"] BUILD_DOCS["cargo doc --no-deps --all-features"] DEPLOY["JamesIves/github-pages-deploy-action@v4"] end subgraph subGraph1["ci job"] CHECKOUT_CI["actions/checkout@v4"] RUST_SETUP["dtolnay/rust-toolchain@nightly"] VERSION_CHECK["rustc --version --verbose"] FORMAT_CHECK["cargo fmt --all -- --check"] CLIPPY["cargo clippy --target x86_64-unknown-linux-gnu --all-features"] BUILD["cargo build --target x86_64-unknown-linux-gnu --all-features"] TEST["cargo test --target x86_64-unknown-linux-gnu -- --nocapture"] end end subgraph subGraph0["Trigger Events"] PUSH["push event"] PR["pull_request event"] end BUILD --> ARTIFACTS BUILD --> TEST BUILD_DOCS --> DEPLOY BUILD_DOCS --> DOCS CHECKOUT_CI --> RUST_SETUP CHECKOUT_DOC --> RUST_SETUP_DOC CLIPPY --> BUILD DEPLOY --> PAGES FORMAT_CHECK --> CLIPPY PR --> WORKFLOW PUSH --> WORKFLOW RUST_SETUP --> VERSION_CHECK RUST_SETUP_DOC --> BUILD_DOCS TEST --> QUALITY VERSION_CHECK --> FORMAT_CHECK WORKFLOW --> CHECKOUT_CI WORKFLOW --> CHECKOUT_DOC
Sources: .github/workflows/ci.yml(L1 - L53)
Job Definitions and Matrix Strategy
The CI workflow uses a matrix strategy for the ci
job to support multiple Rust toolchains and target architectures, though currently configured for a single combination.
CI Job Configuration
Parameter | Value |
---|---|
runs-on | ubuntu-latest |
rust-toolchain | nightly |
targets | x86_64-unknown-linux-gnu |
fail-fast | false |
The job includes comprehensive Rust toolchain setup with required components:
flowchart TD subgraph subGraph1["Setup Action"] DTOLNAY["dtolnay/rust-toolchain@nightly"] end subgraph subGraph0["Rust Toolchain Components"] TOOLCHAIN["nightly toolchain"] RUST_SRC["rust-src component"] CLIPPY_COMP["clippy component"] RUSTFMT_COMP["rustfmt component"] TARGET["x86_64-unknown-linux-gnu target"] end DTOLNAY --> CLIPPY_COMP DTOLNAY --> RUSTFMT_COMP DTOLNAY --> RUST_SRC DTOLNAY --> TARGET DTOLNAY --> TOOLCHAIN
Sources: .github/workflows/ci.yml(L8 - L19)
Quality Assurance Process
The CI pipeline implements a multi-stage quality assurance process that validates code formatting, performs static analysis, builds the project, and runs tests.
Quality Gates Sequence
Stage | Command | Purpose |
---|---|---|
Version Check | rustc --version --verbose | Verify toolchain installation |
Format Check | cargo fmt --all -- --check | Enforce code formatting standards |
Static Analysis | cargo clippy --target x86_64-unknown-linux-gnu --all-features | Detect potential issues and style violations |
Build | cargo build --target x86_64-unknown-linux-gnu --all-features | Ensure compilation succeeds |
Test | cargo test --target x86_64-unknown-linux-gnu -- --nocapture | Execute unit and integration tests |
The pipeline uses the --all-features
flag to ensure both axconfig-gen
and axconfig-macros
packages are tested with all feature combinations enabled.
Sources: .github/workflows/ci.yml(L20 - L29)
Documentation Pipeline
The doc
job handles automated documentation generation and deployment to GitHub Pages with conditional execution based on the repository branch.
Documentation Workflow
flowchart TD subgraph subGraph3["GitHub Pages"] GH_PAGES["gh-pages branch"] SINGLE_COMMIT["single-commit: true"] end subgraph subGraph2["Deployment Logic"] BRANCH_CHECK["github.ref == refs/heads/main"] CONTINUE_ERROR["continue-on-error for non-main branches"] DEPLOY_ACTION["JamesIves/github-pages-deploy-action@v4"] end subgraph subGraph1["Documentation Generation"] CARGO_DOC["cargo doc --no-deps --all-features"] TARGET_DOC["target/doc output directory"] end subgraph subGraph0["Documentation Environment"] ENV_VAR["default-branch environment variable"] RUSTDOCFLAGS["RUSTDOCFLAGS with unstable options"] PERMISSIONS["contents: write permissions"] end BRANCH_CHECK --> DEPLOY_ACTION CARGO_DOC --> TARGET_DOC DEPLOY_ACTION --> GH_PAGES DEPLOY_ACTION --> SINGLE_COMMIT ENV_VAR --> BRANCH_CHECK RUSTDOCFLAGS --> CARGO_DOC TARGET_DOC --> DEPLOY_ACTION
The documentation build uses specific RUSTDOCFLAGS
configuration:
-Zunstable-options --enable-index-page
: Enables unstable documentation features-D rustdoc::broken_intra_doc_links
: Treats broken internal links as errors-D missing-docs
: Treats missing documentation as errors
Sources: .github/workflows/ci.yml(L31 - L53)
Deployment and Automation
The CI system implements conditional deployment logic that ensures documentation is only published from the main branch while allowing documentation builds to continue on other branches for validation.
Deployment Configuration
Setting | Value | Purpose |
---|---|---|
single-commit | true | Maintains clean gh-pages history |
branch | gh-pages | Target branch for documentation |
folder | target/doc | Source directory for documentation files |
The deployment uses the JamesIves/github-pages-deploy-action@v4
action with conditional execution based on github.ref == env.default-branch
to ensure only main branch changes trigger actual deployment.
Sources: .github/workflows/ci.yml(L46 - L52)