mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-04-14 10:07:39 +08:00
299 lines
12 KiB
YAML
299 lines
12 KiB
YAML
# NOTE: this workflow is now running on Dronecode / PX4 AWS account.
|
|
# - If you want to keep the tests running in GitHub Actions you need to uncomment the "runs-on: ubuntu-latest" lines
|
|
# and comment the "runs-on: [runs-on,runner=..." lines.
|
|
# - If you would like to duplicate this setup try setting up "RunsOn" on your own AWS account try https://runs-on.com
|
|
#
|
|
# ===================================================================================
|
|
# RELEASE UPLOAD LOGIC
|
|
# ===================================================================================
|
|
# This workflow handles building firmware and uploading to S3 + GitHub Releases.
|
|
#
|
|
# S3 Bucket Structure (s3://px4-travis/Firmware/):
|
|
# - master/ <- Latest main branch build (for QGC compatibility)
|
|
# - stable/ <- Latest stable release, controlled by 'stable' branch
|
|
# - beta/ <- Latest pre-release, controlled by 'beta' branch
|
|
# - vX.Y.Z/ <- Archived stable release
|
|
# - vX.Y.Z-beta1/ <- Archived pre-release
|
|
#
|
|
# Trigger Behavior:
|
|
# - Tag v1.16.1 -> Upload to: v1.16.1/ only (versioned archive)
|
|
# - Tag v1.17.0-beta1 -> Upload to: v1.17.0-beta1/ only (versioned archive)
|
|
# - Branch main -> Upload to: master/ (for QGC compatibility)
|
|
# - Branch stable -> Upload to: stable/ (QGC stable firmware)
|
|
# - Branch beta -> Upload to: beta/ (QGC beta firmware)
|
|
# - Branch release/** -> Build only, no S3 upload (CI validation)
|
|
# - Pull requests -> Build only, no S3 upload (CI validation)
|
|
#
|
|
# GitHub Releases:
|
|
# - All version tags create a draft GitHub Release
|
|
# - Pre-releases (alpha/beta/rc suffixes) are automatically marked as such
|
|
#
|
|
# IMPORTANT: Version tags do NOT upload to stable/ or beta/. Only the
|
|
# corresponding branch pushes control those directories. This prevents
|
|
# pre-release tags from accidentally overwriting stable firmware (#26340)
|
|
# and avoids race conditions between tag and branch builds.
|
|
# ===================================================================================
|
|
|
|
name: Build all targets
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*'
|
|
branches:
|
|
- 'main'
|
|
- 'stable'
|
|
- 'beta'
|
|
- 'release/**'
|
|
paths-ignore:
|
|
- 'docs/**'
|
|
pull_request:
|
|
branches:
|
|
- '**'
|
|
paths-ignore:
|
|
- 'docs/**'
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
permissions:
|
|
contents: write
|
|
actions: read
|
|
packages: read
|
|
|
|
jobs:
|
|
group_targets:
|
|
name: Scan for Board Targets
|
|
# runs-on: ubuntu-latest
|
|
runs-on: [runs-on,runner=1cpu-linux-x64,image=ubuntu24-full-x64,"run-id=${{ github.run_id }}",spot=false]
|
|
outputs:
|
|
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
|
seeders: ${{ steps.set-seeders.outputs.seeders }}
|
|
timestamp: ${{ steps.set-timestamp.outputs.timestamp }}
|
|
branchname: ${{ steps.set-branch.outputs.branchname }}
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
|
|
- name: Cache Python pip
|
|
uses: actions/cache@v5
|
|
with:
|
|
path: ~/.cache/pip
|
|
key: ${{ runner.os }}-pip-${{ hashFiles('**./Tools/setup/requirements.txt') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-pip-
|
|
|
|
- name: Install Python Dependencies
|
|
run: pip3 install -U packaging -r ./Tools/setup/requirements.txt
|
|
|
|
- id: set-matrix
|
|
name: Generate Build Matrix
|
|
run: echo "matrix=$(./Tools/ci/generate_board_targets_json.py --group)" >> $GITHUB_OUTPUT
|
|
|
|
- id: set-seeders
|
|
name: Generate Seeder Matrix
|
|
run: echo "seeders=$(./Tools/ci/generate_board_targets_json.py --group --seeders)" >> $GITHUB_OUTPUT
|
|
|
|
- id: set-timestamp
|
|
name: Save Current Timestamp
|
|
run: echo "timestamp=$(date +"%Y%m%d%H%M%S")" >> $GITHUB_OUTPUT
|
|
|
|
- id: set-branch
|
|
name: Save Current Branch Name
|
|
run: |
|
|
echo "branchname=${{
|
|
github.event_name == 'pull_request' &&
|
|
format('pr-{0}', github.event.pull_request.number) ||
|
|
github.head_ref ||
|
|
github.ref_name
|
|
}}" >> $GITHUB_OUTPUT
|
|
|
|
- name: Debug Matrix Output
|
|
if: runner.debug == '1'
|
|
run: |
|
|
echo "${{ steps.set-timestamp.outputs.timestamp }}"
|
|
echo "${{ steps.set-branch.outputs.branchname }}"
|
|
echo "$(./Tools/ci/generate_board_targets_json.py --group --verbose)"
|
|
|
|
# ===========================================================================
|
|
# CACHE SEEDER JOBS
|
|
# ===========================================================================
|
|
# Build one representative target per chip family to warm the ccache.
|
|
# Matrix jobs fall back to these caches via restore-keys when no
|
|
# group-specific cache exists yet. If any seeder fails, the build matrix
|
|
# does not start, catching common build errors early.
|
|
# ===========================================================================
|
|
|
|
seed:
|
|
name: Seed [${{ matrix.chip_family }}]
|
|
needs: group_targets
|
|
runs-on: [runs-on,"runner=8cpu-linux-${{ matrix.runner }}","image=ubuntu24-full-${{ matrix.runner }}","run-id=${{ github.run_id }}",spot=false,extras=s3-cache]
|
|
strategy:
|
|
matrix: ${{ fromJson(needs.group_targets.outputs.seeders) }}
|
|
fail-fast: false
|
|
container:
|
|
image: ${{ matrix.container }}
|
|
credentials:
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
steps:
|
|
- uses: runs-on/action@v2
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
fetch-depth: 1
|
|
- name: Configure Git Safe Directory
|
|
run: git config --system --add safe.directory '*'
|
|
- uses: ./.github/actions/setup-ccache
|
|
id: ccache
|
|
with:
|
|
cache-key-prefix: ccache-${{ matrix.chip_family }}-${{ matrix.runner }}-seeder
|
|
max-size: 400M
|
|
- name: Build seed target
|
|
run: make ${{ matrix.target }}
|
|
- uses: ./.github/actions/save-ccache
|
|
if: always()
|
|
with:
|
|
cache-primary-key: ${{ steps.ccache.outputs.cache-primary-key }}
|
|
|
|
setup:
|
|
name: Build [${{ matrix.runner }}][${{ matrix.group }}]
|
|
# runs-on: ubuntu-latest
|
|
runs-on: [runs-on,"runner=4cpu-linux-${{ matrix.runner }}","image=ubuntu24-full-${{ matrix.runner }}","run-id=${{ github.run_id }}",spot=false,extras=s3-cache]
|
|
needs: [group_targets, seed]
|
|
if: "!failure() && !cancelled()"
|
|
strategy:
|
|
matrix: ${{ fromJson(needs.group_targets.outputs.matrix) }}
|
|
fail-fast: false
|
|
container:
|
|
image: ${{ matrix.container }}
|
|
credentials:
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
steps:
|
|
- uses: runs-on/action@v2
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
fetch-depth: 0
|
|
- name: Configure Git Safe Directory
|
|
run: git config --system --add safe.directory '*'
|
|
|
|
- name: Cache - Restore ccache
|
|
id: ccache-restore
|
|
uses: actions/cache/restore@v5
|
|
with:
|
|
path: ~/.ccache
|
|
key: ccache-${{ matrix.chip_family }}-${{ matrix.runner }}-${{ matrix.group }}-${{ github.ref_name }}-${{ github.sha }}
|
|
restore-keys: |
|
|
ccache-${{ matrix.chip_family }}-${{ matrix.runner }}-${{ matrix.group }}-${{ github.ref_name }}-
|
|
ccache-${{ matrix.chip_family }}-${{ matrix.runner }}-${{ matrix.group }}-${{ github.base_ref || 'main' }}-
|
|
ccache-${{ matrix.chip_family }}-${{ matrix.runner }}-${{ matrix.group }}-
|
|
ccache-${{ matrix.chip_family }}-${{ matrix.runner }}-
|
|
|
|
- name: Cache - Configure ccache
|
|
run: |
|
|
mkdir -p ~/.ccache
|
|
echo "base_dir = ${GITHUB_WORKSPACE}" > ~/.ccache/ccache.conf
|
|
echo "compression = true" >> ~/.ccache/ccache.conf
|
|
echo "compression_level = 6" >> ~/.ccache/ccache.conf
|
|
echo "max_size = ${{ matrix.cache_size }}" >> ~/.ccache/ccache.conf
|
|
echo "hash_dir = false" >> ~/.ccache/ccache.conf
|
|
echo "compiler_check = content" >> ~/.ccache/ccache.conf
|
|
ccache -s
|
|
ccache -z
|
|
|
|
- name: Building Artifacts for [${{ matrix.targets }}]
|
|
run: |
|
|
./Tools/ci/build_all_runner.sh ${{matrix.targets}} ${{matrix.arch}}
|
|
|
|
- name: Arrange Build Artifacts
|
|
run: |
|
|
./Tools/ci/package_build_artifacts.sh
|
|
|
|
- name: Upload Build Artifacts
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: px4_${{matrix.group}}_build_artifacts
|
|
path: artifacts/
|
|
|
|
- uses: ./.github/actions/save-ccache
|
|
if: success()
|
|
with:
|
|
cache-primary-key: ${{ steps.ccache-restore.outputs.cache-primary-key }}
|
|
|
|
# ===========================================================================
|
|
# ARTIFACT UPLOAD JOB
|
|
# ===========================================================================
|
|
# Uploads build artifacts to S3 and creates GitHub Releases.
|
|
# Runs for version tags (v*), main, stable, and beta branch pushes.
|
|
# See header comments for full upload logic documentation.
|
|
# ===========================================================================
|
|
artifacts:
|
|
name: Upload Artifacts
|
|
# runs-on: ubuntu-latest
|
|
runs-on: [runs-on,runner=1cpu-linux-x64,image=ubuntu24-full-x64,"run-id=${{ github.run_id }}",spot=false]
|
|
needs: [setup, group_targets]
|
|
if: startsWith(github.ref, 'refs/tags/v') || contains(fromJSON('["main","stable","beta"]'), needs.group_targets.outputs.branchname)
|
|
outputs:
|
|
uploadlocation: ${{ steps.upload-location.outputs.uploadlocation }}
|
|
steps:
|
|
- name: Download Artifacts
|
|
uses: actions/download-artifact@v8
|
|
with:
|
|
path: artifacts/
|
|
merge-multiple: true
|
|
|
|
- name: Choose Upload Location
|
|
id: upload-location
|
|
run: |
|
|
set -euo pipefail
|
|
|
|
ref="${GITHUB_REF}"
|
|
branch=${{ needs.group_targets.outputs.branchname }}
|
|
location="$branch"
|
|
is_prerelease="false"
|
|
|
|
# Main branch uploads to "master" for QGC backward compatibility
|
|
if [[ "$branch" == "main" ]]; then
|
|
location="master"
|
|
fi
|
|
|
|
# Version tags: upload to versioned directory (e.g., v1.16.1/)
|
|
if [[ "$ref" == refs/tags/v[0-9]* ]]; then
|
|
tag="${ref#refs/tags/}"
|
|
location="$tag"
|
|
|
|
# Pre-release tags contain -alpha, -beta, or -rc suffix
|
|
if [[ "$tag" =~ -(alpha|beta|rc) ]]; then
|
|
is_prerelease="true"
|
|
fi
|
|
fi
|
|
|
|
echo "uploadlocation=$location" >> $GITHUB_OUTPUT
|
|
echo "is_prerelease=$is_prerelease" >> $GITHUB_OUTPUT
|
|
|
|
- name: Uploading Artifacts to S3 [${{ steps.upload-location.outputs.uploadlocation }}]
|
|
uses: jakejarvis/s3-sync-action@master
|
|
with:
|
|
args: --acl public-read
|
|
env:
|
|
AWS_S3_BUCKET: 'px4-travis'
|
|
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
AWS_REGION: 'us-west-1'
|
|
SOURCE_DIR: artifacts/
|
|
DEST_DIR: Firmware/${{ steps.upload-location.outputs.uploadlocation }}/
|
|
|
|
# Create a draft GitHub Release for all version tags
|
|
# Pre-releases are automatically marked as such
|
|
- name: Upload Artifacts to GitHub Release
|
|
uses: softprops/action-gh-release@v2
|
|
if: startsWith(github.ref, 'refs/tags/v')
|
|
with:
|
|
draft: true
|
|
prerelease: ${{ steps.upload-location.outputs.is_prerelease == 'true' }}
|
|
files: |
|
|
artifacts/*.px4
|
|
artifacts/*.deb
|
|
artifacts/**/*.sbom.spdx.json
|
|
name: ${{ steps.upload-location.outputs.uploadlocation }}
|