wangzhibo
2026-08-26 70481429367ca00144b24f118cbfdfb28b02967d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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@v6
        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.full_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:v5.5.2
    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.full_name }}_${{ github.sha }}
          path: build/merged-binary.bin
          if-no-files-found: error