name: Build Boards on: push: branches: - main - ci/* # for ci test pull_request: branches: - main permissions: contents: read jobs: prepare: name: Determine variants to build runs-on: ubuntu-latest outputs: variants: ${{ steps.select.outputs.variants }} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install jq run: sudo apt-get update && sudo apt-get install -y jq - id: list name: Get all variant list run: | echo "all_variants=$(python scripts/release.py --list-boards --json)" >> $GITHUB_OUTPUT - id: select name: Select variants based on changes env: ALL_VARIANTS: ${{ steps.list.outputs.all_variants }} run: | EVENT_NAME="${{ github.event_name }}" # push 到 main 分支,编译全部变体 if [[ "$EVENT_NAME" == "push" ]]; then echo "variants=$ALL_VARIANTS" >> $GITHUB_OUTPUT exit 0 fi # pull_request 场景 BASE_SHA="${{ github.event.pull_request.base.sha }}" HEAD_SHA="${{ github.event.pull_request.head.sha }}" echo "Base: $BASE_SHA, Head: $HEAD_SHA" CHANGED=$(git diff --name-only $BASE_SHA $HEAD_SHA || true) echo -e "Changed files:\n$CHANGED" NEED_ALL=0 declare -A AFFECTED while IFS= read -r file; do if [[ "$file" == main/* && "$file" != main/boards/* ]]; then NEED_ALL=1 fi if [[ "$file" == main/boards/common/* ]]; then NEED_ALL=1 fi if [[ "$file" == main/boards/* ]]; then board=$(echo "$file" | cut -d '/' -f3) AFFECTED[$board]=1 fi done <<< "$CHANGED" if [[ "$NEED_ALL" -eq 1 ]]; then echo "variants=$ALL_VARIANTS" >> $GITHUB_OUTPUT else if [[ ${#AFFECTED[@]} -eq 0 ]]; then echo "variants=[]" >> $GITHUB_OUTPUT else BOARDS_JSON=$(printf '%s\n' "${!AFFECTED[@]}" | sort -u | jq -R -s -c 'split("\n")[:-1]') FILTERED=$(echo "$ALL_VARIANTS" | jq -c --argjson boards "$BOARDS_JSON" 'map(select(.board as $b | $boards | index($b)))') echo "variants=$FILTERED" >> $GITHUB_OUTPUT fi fi build: name: Build ${{ matrix.name }} needs: prepare if: ${{ needs.prepare.outputs.variants != '[]' }} strategy: fail-fast: false # 单个变体失败不影响其它变体 matrix: include: ${{ fromJson(needs.prepare.outputs.variants) }} runs-on: ubuntu-latest container: image: espressif/idf:release-v5.5 steps: - name: Checkout uses: actions/checkout@v4 - name: Build current variant shell: bash run: | source $IDF_PATH/export.sh python scripts/release.py ${{ matrix.board }} --name ${{ matrix.name }} - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: xiaozhi_${{ matrix.name }}_${{ github.sha }}.bin path: build/merged-binary.bin if-no-files-found: error