# PX4 Continuous Integration PX4 uses GitHub Actions for continuous integration, with different workflows handling code builds, testing, and documentation. ## Documentation CI The documentation pipeline handles building, deploying, and translating the PX4 User Guide. All documentation CI is consolidated into a single orchestrator workflow organized in tiers. ### Docs Orchestrator **Workflow file:** [`docs-orchestrator.yml`](https://github.com/PX4/PX4-Autopilot/blob/main/.github/workflows/docs-orchestrator.yml) This is the main documentation workflow. It runs on pull requests, pushes to `main` and `release/**` branches, and manual `workflow_dispatch` triggers, performing different jobs depending on the trigger event. Jobs are organized in tiers, where each tier depends on the previous one completing successfully. #### Tier Structure | Tier | Job | PR | Push / Dispatch | Description | | ---- | -------------- | ---------------------------- | --------------- | ------------------------------------------------------------- | | T1 | Detect Changes | Yes | — | Checks if source code files changed (triggers metadata regen) | | T2 | PR Metadata | Yes (conditional) | — | Builds PX4 SITL and regenerates all auto-generated docs | | T2 | Metadata Sync | — | Yes | Builds PX4 SITL, regenerates metadata, auto-commits | | T2 | Link Check | Yes | — | Checks for broken links in changed files, posts PR comment | | T3 | Build Site | Yes (if docs/source changed) | Yes (after T2) | Builds the VitePress documentation site | | T4 | Deploy | — | Yes | Deploys to AWS S3 | #### Pull Request Flow When a PR modifies files in `docs/**` or the orchestrator workflow file itself, the workflow validates the changes: ```txt PR Event │ ▼ ┌─────────────────────────────────────┐ │ T1: Detect Changes │ │ • Checks if src/msg/ROMFS changed │ └─────────────────┬───────────────────┘ │ ┌───────┴───────┐ ▼ ▼ ┌──────────────────┐ ┌─────────────────────────┐ │ T2: PR Metadata │ │ T2: Link Check (~30s) │ │ (conditional) │ │ • Detects changed .md │ │ • Builds SITL │ │ • Runs filtered check │ │ • Generates │ │ • Posts PR comment │ │ metadata │ │ • Runs full check │ │ • Builds │ └────────────┬────────────┘ │ failsafe web │ │ └────────┬─────────┘ │ └───────────┬────────────┘ ▼ ┌─────────────────────────────────────┐ │ T3: Build Site (~7-10 min) │ │ (skipped if only workflow YAML │ │ changed — no docs/source changes) │ │ • Builds VitePress site │ │ • Verifies no build errors │ └─────────────────┬───────────────────┘ │ ▼ DONE ``` | Job | Duration | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------- | | **T1: Detect Changes** | ~10s | Determines if metadata regeneration is needed | | **T2: PR Metadata** | ~10-15m | Rebuilds PX4 SITL and regenerates all metadata (only if source files changed) | | **T2: Link Check** | ~30s | Checks for broken links in changed markdown files and posts a sticky comment to the PR (skipped on fork PRs) | | **T3: Build Site** | ~7-10m | Builds the VitePress site to verify there are no build errors. Skipped when only the workflow YAML changed (no docs or source changes). | #### Push / Dispatch Flow (main/release branches) When changes are pushed to `main` or `release/**` branches (or a `workflow_dispatch` is triggered), the workflow regenerates metadata, builds, and deploys. Only `main` and `release/*` branches are accepted for deploy — other branches will fail with a clear error. ```txt Push / Dispatch Event │ ▼ ┌─────────────────────────────────────┐ │ T2: Metadata Sync (~10-15 min) │ │ • Builds px4_sitl_default │ │ • Generates parameter/airframe/ │ │ module documentation │ │ • Builds failsafe web simulator │ │ • Formats with Prettier │ │ • Auto-commits if changes detected │ │ (with [skip ci]) │ └─────────────────┬───────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ T3: Build Site (~7-10 min) │ │ • Builds VitePress site │ │ • Uploads build artifact │ └─────────────────┬───────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ T4: Deploy (~3 min) │ │ • Syncs to AWS S3 │ │ • HTML: 60s cache │ │ • Assets: 24h immutable cache │ └─────────────────────────────────────┘ ``` | Job | Duration | Description | | --------------------- | -------- | ------------------------------------------------------------------------------------------------- | | **T2: Metadata Sync** | ~10-15m | Rebuilds PX4 SITL, regenerates all metadata, formats with Prettier, auto-commits with `[skip ci]` | | **T3: Build Site** | ~7-10m | Builds the VitePress documentation site | | **T4: Deploy** | ~3m | Syncs built site to AWS S3 (HTML: 60s cache, assets: 24h cache) | Crowdin upload is handled by a separate workflow (see below). #### Generated Metadata The metadata regeneration job creates the following auto-generated documentation: | Type | Output | Description | | ------------------ | ------------------------------------------------ | -------------------------------------------- | | Parameters | `docs/en/advanced_config/parameter_reference.md` | Complete parameter reference | | Airframes | `docs/en/airframes/airframe_reference.md` | Airframe configurations | | Modules | `docs/en/modules/*.md` | Module documentation | | Messages | `docs/en/msg_docs/*.md` | uORB message documentation | | uORB Graphs | `docs/public/middleware/*.json` | Topic dependency graphs | | Failsafe Simulator | `docs/public/config/failsafe/*` | Interactive failsafe simulator (WebAssembly) | ::: warning Do not manually edit the auto-generated files listed above. They are overwritten on every push to main. ::: #### Path Triggers The workflow triggers on different paths depending on the event: **Push** (main/release branches): | Path | Reason | | ------------------------ | ------------------------------------- | | `docs/**` | Documentation source files | | `src/**` | Source code changes affect metadata | | `msg/**` | Message definitions affect metadata | | `ROMFS/**` | ROMFS files affect metadata | | `Tools/module_config/**` | Module configuration affects metadata | **Pull Request:** | Path | Reason | | ----------------------------------------- | ------------------------------ | | `docs/**` | Documentation source files | | `.github/workflows/docs-orchestrator.yml` | Changes to the workflow itself | Source-only changes on PRs are detected at runtime by the T1: Detect Changes job using [dorny/paths-filter](https://github.com/dorny/paths-filter), which conditionally triggers the T2: PR Metadata job. ### Crowdin Download Workflow **Workflow file:** [`docs_crowdin_download.yml`](https://github.com/PX4/PX4-Autopilot/blob/main/.github/workflows/docs_crowdin_download.yml) This scheduled workflow downloads completed translations from Crowdin and creates pull requests. | Setting | Value | | -------------------- | ------------------------------------------------------- | | **Schedule** | Every Sunday at 00:00 UTC | | **Target Languages** | Korean (ko), Ukrainian (uk), Chinese Simplified (zh-CN) | **Process:** 1. Downloads translations for each target language from Crowdin 2. Creates a separate PR for each language with new translations 3. PRs are labeled "Documentation" and assigned for review ### Caching Strategy The workflows use caching to speed up builds: | Cache | Size | Purpose | | ------------ | ----- | ------------------------------------- | | ccache | 1GB | C++ compilation cache for SITL builds | | node_modules | ~26MB | Node.js dependencies for VitePress | ### Infrastructure Jobs run on [runs-on](https://runs-on.com/) self-hosted runners with S3 cache: | Job | Runner | | ------------------ | ------------------------------ | | T1: Detect Changes | ubuntu-latest | | T2: PR Metadata | 4 CPU (with px4-dev container) | | T2: Metadata Sync | 4 CPU (with px4-dev container) | | T2: Link Check | ubuntu-latest | | T3: Build Site | 4 CPU | | T4: Deploy | ubuntu-latest |