mirror of
https://github.com/apache/nuttx.git
synced 2026-02-06 04:22:26 +08:00
CI: Apply the Refactored Build Rules based on Arch Labels
This PR continues to enhance the CI Workflow, to skip the unnecessary NuttX Builds. The PR will update the CI Build Workflow `build.yml`, to call the Refactored Build Rules in `arch.yml` (which is a Reusable Workflow). The original rules were migrated from `build.yml` to `arch.yml`: - We target only the Simple PRs: One Arch Label + One Size Label (e.g. "Arch: risc-v, Size: XS") - For "Arch: risc-v": Build `risc-v-01`, `risc-v-02` - For "Arch: xtensa": Build `xtensa-01`, `xtensa-02` - The above rules apply when the PR is Created or Modified - When the PR is Merged: All targets shall be built This PR applies the New and Updated Rules defined in `arch.yml`: - For "Arch: arm": Build `arm-01`, `arm-02`, ... - For "Arch: arm64": Build `other` - For "Arch: simulator": Build `sim-01`, `sim-02` - For "Arch: x86_64": Build `other` - For Simple PRs (One Arch Label + One Size Label): Skip the macOS and Windows builds (`macos`, `macos/sim-*`, `msys2`) since these builds are costly and slow - Except for "Arch: Simulator", which will enable the macOS Builds for `sim-01` and `sim-02` - If GitHub CLI Fails: Build all targets The code is explained here: https://github.com/apache/nuttx/issues/13775
This commit is contained in:
124
.github/workflows/build.yml
vendored
124
.github/workflows/build.yml
vendored
@@ -33,6 +33,8 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
|
||||
# Fetch the source from nuttx and nuttx-apps repos
|
||||
Fetch-Source:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
@@ -115,8 +117,23 @@ jobs:
|
||||
name: source-bundle
|
||||
path: sources.tar.gz
|
||||
|
||||
Linux:
|
||||
# Select the Linux Builds based on PR Arch Label
|
||||
Linux-Arch:
|
||||
uses: apache/nuttx/.github/workflows/arch.yml@master
|
||||
needs: Fetch-Source
|
||||
with:
|
||||
os: Linux
|
||||
boards: |
|
||||
[
|
||||
"arm-01", "other", "risc-v-01", "sim-01", "xtensa-01",
|
||||
"arm-02", "risc-v-02", "sim-02", "xtensa-02",
|
||||
"arm-03", "arm-04", "arm-05", "arm-06", "arm-07", "arm-08", "arm-09", "arm-10", "arm-11", "arm-12", "arm-13"
|
||||
]
|
||||
|
||||
# Run the selected Linux Builds
|
||||
Linux:
|
||||
needs: Linux-Arch
|
||||
if: ${{ needs.Linux-Arch.outputs.skip_all_builds != '1' }}
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
DOCKER_BUILDKIT: 1
|
||||
@@ -124,90 +141,20 @@ jobs:
|
||||
strategy:
|
||||
max-parallel: 12
|
||||
matrix:
|
||||
boards: [
|
||||
arm-01, other, risc-v-01, sim-01, xtensa-01,
|
||||
arm-02, risc-v-02, sim-02, xtensa-02,
|
||||
arm-03, arm-04, arm-05, arm-06, arm-07, arm-08, arm-09, arm-10, arm-11, arm-12, arm-13
|
||||
]
|
||||
boards: ${{ fromJSON(needs.Linux-Arch.outputs.selected_builds) }}
|
||||
|
||||
steps:
|
||||
|
||||
# Get the Arch for the PR: arm, arm64, risc-v, xtensa, ...
|
||||
- name: Get arch
|
||||
id: get-arch
|
||||
run: |
|
||||
# Get the Labels for the PR: "Arch: risc-v \n Size: XS"
|
||||
pr=${{github.event.pull_request.number}}
|
||||
if [[ "$pr" == "" ]]; then
|
||||
exit
|
||||
fi
|
||||
numlabels=$(gh pr view $pr --repo $GITHUB_REPOSITORY --json labels --jq '.[] | length')
|
||||
labels=$(gh pr view $pr --repo $GITHUB_REPOSITORY --json labels --jq '.labels[] | .name')
|
||||
|
||||
# Identify the Size and Arch Labels
|
||||
if [[ "$labels" == *"Size: "* ]]; then
|
||||
labels_contain_size=1
|
||||
fi
|
||||
if [[ "$labels" == *"Arch: arm"* ]]; then
|
||||
arch_contains_arm_arm64=1
|
||||
fi
|
||||
if [[ "$labels" == *"Arch: risc-v"* ]]; then
|
||||
arch_contains_riscv=1
|
||||
fi
|
||||
if [[ "$labels" == *"Arch: xtensa"* ]]; then
|
||||
arch_contains_xtensa=1
|
||||
fi
|
||||
|
||||
# We consider only PRs with 2 labels, including size
|
||||
if [ $numlabels -ne 2 ] || [ $labels_contain_size -ne 1 ]; then
|
||||
exit
|
||||
fi
|
||||
|
||||
# If "Arch: arm / arm64" is the only non-size label, then build other, arm-01, arm-02, ...
|
||||
if [[ "$arch_contains_arm_arm64" == "1" ]]; then
|
||||
if [[ "${{matrix.boards}}" == "arm"* ]] || [[ "${{matrix.boards}}" == "other"* ]]; then
|
||||
echo Allow build: ${{matrix.boards}}
|
||||
else
|
||||
echo Skip build: ${{matrix.boards}}
|
||||
echo "skip_build=1" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
fi
|
||||
|
||||
# If "Arch: risc-v" is the only non-size label, then build risc-v-01, risc-v-02
|
||||
if [[ "$arch_contains_riscv" == "1" ]]; then
|
||||
if [[ "${{matrix.boards}}" == "risc-v"* ]]; then
|
||||
echo Allow build: ${{matrix.boards}}
|
||||
else
|
||||
echo Skip build: ${{matrix.boards}}
|
||||
echo "skip_build=1" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
fi
|
||||
|
||||
# If "Arch: xtensa" is the only non-size label, then build xtensa-01, xtensa-02
|
||||
if [[ "$arch_contains_xtensa" == "1" ]]; then
|
||||
if [[ "${{matrix.boards}}" == "xtensa"* ]]; then
|
||||
echo Allow build: ${{matrix.boards}}
|
||||
else
|
||||
echo Skip build: ${{matrix.boards}}
|
||||
echo "skip_build=1" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
fi
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Download Source Artifact
|
||||
if: ${{ steps.get-arch.outputs.skip_build != '1' }}
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: source-bundle
|
||||
path: .
|
||||
|
||||
- name: Extract sources
|
||||
if: ${{ steps.get-arch.outputs.skip_build != '1' }}
|
||||
run: tar zxf sources.tar.gz
|
||||
|
||||
- name: Docker Login
|
||||
if: ${{ steps.get-arch.outputs.skip_build != '1' }}
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
@@ -215,15 +162,12 @@ jobs:
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Docker Pull
|
||||
if: ${{ steps.get-arch.outputs.skip_build != '1' }}
|
||||
run: docker pull ghcr.io/apache/nuttx/apache-nuttx-ci-linux
|
||||
|
||||
- name: Export NuttX Repo SHA
|
||||
if: ${{ steps.get-arch.outputs.skip_build != '1' }}
|
||||
run: echo "nuttx_sha=`git -C sources/nuttx rev-parse HEAD`" >> $GITHUB_ENV
|
||||
|
||||
- name: Run builds
|
||||
if: ${{ steps.get-arch.outputs.skip_build != '1' }}
|
||||
uses: ./sources/nuttx/.github/actions/ci-container
|
||||
env:
|
||||
BLOBDIR: /tools/blobs
|
||||
@@ -247,15 +191,26 @@ jobs:
|
||||
path: buildartifacts/
|
||||
continue-on-error: true
|
||||
|
||||
# Select the macOS Builds based on PR Arch Label
|
||||
macOS-Arch:
|
||||
uses: apache/nuttx/.github/workflows/arch.yml@master
|
||||
needs: Fetch-Source
|
||||
with:
|
||||
os: Linux
|
||||
boards: |
|
||||
["macos", "sim-01", "sim-02"]
|
||||
|
||||
# Run the selected macOS Builds
|
||||
macOS:
|
||||
permissions:
|
||||
contents: none
|
||||
runs-on: macos-13
|
||||
needs: Fetch-Source
|
||||
needs: macOS-Arch
|
||||
if: ${{ needs.macOS-Arch.outputs.skip_all_builds != '1' }}
|
||||
strategy:
|
||||
max-parallel: 2
|
||||
matrix:
|
||||
boards: [macos, sim-01, sim-02]
|
||||
boards: ${{ fromJSON(needs.macOS-Arch.outputs.selected_builds) }}
|
||||
steps:
|
||||
- name: Download Source Artifact
|
||||
uses: actions/download-artifact@v4
|
||||
@@ -296,14 +251,25 @@ jobs:
|
||||
path: buildartifacts/
|
||||
continue-on-error: true
|
||||
|
||||
msys2:
|
||||
# Select the msys2 Builds based on PR Arch Label
|
||||
msys2-Arch:
|
||||
uses: apache/nuttx/.github/workflows/arch.yml@master
|
||||
needs: Fetch-Source
|
||||
with:
|
||||
os: Linux
|
||||
boards: |
|
||||
["msys2"]
|
||||
|
||||
# Run the selected msys2 Builds
|
||||
msys2:
|
||||
needs: msys2-Arch
|
||||
if: ${{ needs.msys2-Arch.outputs.skip_all_builds != '1' }}
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
max-parallel: 1
|
||||
matrix:
|
||||
boards: [msys2]
|
||||
boards: ${{ fromJSON(needs.msys2-Arch.outputs.selected_builds) }}
|
||||
|
||||
defaults:
|
||||
run:
|
||||
|
||||
Reference in New Issue
Block a user