aboutsummaryrefslogtreecommitdiffstats
path: root/.github/workflows/kernel.yml
blob: 3aa46f5cd7cacfe983308b2cafb12e2e6da97d2d (plain)
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
name: Build Kernel

on:
  pull_request:
    paths:
      - '.github/workflows/check-kernel-patches.yml'
      - '.github/workflows/build.yml'
      - '.github/workflows/kernel.yml'
      - 'include/kernel*'
      - 'package/kernel/**'
      - 'target/linux/**'
  push:
    paths:
      - '.github/workflows/check-kernel-patches.yml'
      - '.github/workflows/build.yml'
      - '.github/workflows/kernel.yml'
      - 'include/kernel*'
      - 'package/kernel/**'
      - 'target/linux/**'
    branches-ignore:
      - master

permissions:
  contents: read

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
  determine_targets:
    name: Set targets
    runs-on: ubuntu-latest
    outputs:
      targets_subtargets: ${{ steps.find_targets.outputs.targets_subtargets }}
      targets: ${{ steps.find_targets.outputs.targets }}

    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          fetch-depth: 2

      - name: Get changed files
        id: changed-files
        uses: tj-actions/changed-files@v35

      - name: Set targets
        id: find_targets
        run: |
          ALL_TARGETS="$(perl ./scripts/dump-target-info.pl targets 2>/dev/null)"
          CHANGED_FILES="$(echo ${{ steps.changed-files.outputs.all_changed_files }} | tr ' ' '\n')"

          TARGETS_SUBTARGETS="$(echo "$ALL_TARGETS" | sort -u -t '/' -k1 | awk '{ print $1 }')"
          TARGETS="$(echo "$ALL_TARGETS" | sort -u -t '/' -k1,1 | awk '{ print $1 }')"

          # On testing non-specific target, skip testing each subtarget if we are testing pr
          if [ ${{ github.event_name }} != 'push' ]; then
            if echo "$CHANGED_FILES" | grep -v -q target/linux ||
              echo "$CHANGED_FILES" | grep -q target/linux/generic; then
              TARGETS_SUBTARGETS=$TARGETS
            fi
          fi

          JSON_TARGETS_SUBTARGETS='['
          FIRST=1
          for TARGET in $TARGETS_SUBTARGETS; do
            if echo "$CHANGED_FILES" | grep -v -q target/linux ||
              echo "$CHANGED_FILES" | grep -q target/linux/generic ||
              echo "$CHANGED_FILES" | grep -q $(echo $TARGET | cut -d "/" -f 1); then
              TUPLE='{"target":"'"$(echo $TARGET | cut -d "/" -f 1)"'","subtarget":"'"$(echo $TARGET | cut -d "/" -f 2)"'"}'
              [[ $FIRST -ne 1 ]] && JSON_TARGETS_SUBTARGETS="$JSON_TARGETS_SUBTARGETS"','
              JSON_TARGETS_SUBTARGETS="$JSON_TARGETS_SUBTARGETS""$TUPLE"
              FIRST=0
            fi
          done
          JSON_TARGETS_SUBTARGETS="$JSON_TARGETS_SUBTARGETS"']'

          JSON_TARGETS='['
          FIRST=1
          for TARGET in $TARGETS; do
            if echo "$CHANGED_FILES" | grep -v -q target/linux ||
              echo "$CHANGED_FILES" | grep -q target/linux/generic ||
              echo "$CHANGED_FILES" | grep -q $(echo $TARGET | cut -d "/" -f 1); then
              TUPLE='{"target":"'"$(echo $TARGET | cut -d "/" -f 1)"'","subtarget":"'"$(echo $TARGET | cut -d "/" -f 2)"'"}'
              [[ $FIRST -ne 1 ]] && JSON_TARGETS="$JSON_TARGETS"','
              JSON_TARGETS="$JSON_TARGETS""$TUPLE"
              FIRST=0
            fi
          done
          JSON_TARGETS="$JSON_TARGETS"']'

          echo -e "\n---- targets to build ----\n"
          echo "$JSON_TARGETS_SUBTARGETS"
          echo -e "\n---- targets to build ----\n"

          echo -e "\n---- targets to check patch ----\n"
          echo "$JSON_TARGETS"
          echo -e "\n---- targets to check patch ----\n"

          echo "targets_subtargets=$JSON_TARGETS_SUBTARGETS" >> $GITHUB_OUTPUT
          echo "targets=$JSON_TARGETS" >> $GITHUB_OUTPUT

  build:
    name: Build Kernel with external toolchain
    needs: determine_targets
    permissions:
      contents: read
      packages: read
      actions: write
    strategy:
       fail-fast: False
       matrix:
         include: ${{fromJson(needs.determine_targets.outputs.targets_subtargets)}}
    uses: ./.github/workflows/build.yml
    with:
      container_name: toolchain
      target: ${{ matrix.target }}
      subtarget: ${{ matrix.subtarget }}
      build_kernel: true
      build_all_kmods: true
      upload_ccache_cache: ${{ github.repository_owner == 'openwrt' }}

  check-kernel-patches:
    name: Check Kernel patches
    needs: determine_targets
    permissions:
      contents: read
      packages: read
    strategy:
       fail-fast: False
       matrix:
         include: ${{fromJson(needs.determine_targets.outputs.targets)}}
    uses: ./.github/workflows/check-kernel-patches.yml
    with:
      target: ${{ matrix.target }}
      subtarget: ${{ matrix.subtarget }}

  upload-ccache-cache-in-s3:
    if: github.event_name == 'push' && github.repository_owner == 'openwrt'
    name: Upload ccache cache to s3
    needs: [determine_targets, build]
    strategy:
       fail-fast: False
       matrix:
         include: ${{fromJson(needs.determine_targets.outputs.targets_subtargets)}}
    secrets:
      s3_access_key: ${{ secrets.GCS_S3_ACCESS_KEY }}
      s3_secret_key: ${{ secrets.GCS_S3_SECRET_KEY }}
    uses: ./.github/workflows/upload-file-s3.yml
    with:
      endpoint: https://storage.googleapis.com
      bucket: openwrt-ci-cache
      download_id: ${{ matrix.target }}-${{ matrix.subtarget }}-ccache-cache
      filename: ccache-kernel-${{ matrix.target }}-${{ matrix.subtarget }}.tar