CI: kernel: use ccache to speedup workflow
[openwrt/staging/hauke.git] / .github / workflows / kernel.yml
1 name: Build Kernel
2
3 on:
4 pull_request:
5 paths:
6 - '.github/workflows/kernel.yml'
7 - 'include/kernel-*'
8 - 'package/kernel/**'
9 - 'target/linux/generic/**'
10
11 permissions:
12 contents: read
13
14 jobs:
15 determine_targets:
16 name: Set targets
17 runs-on: ubuntu-latest
18 outputs:
19 target: ${{ steps.find_targets.outputs.target }}
20 owner_lc: ${{ steps.lower_owner.outputs.owner_lc }}
21 ccache_hash: ${{ steps.ccache_hash.outputs.ccache_hash }}
22
23 steps:
24 - name: Checkout
25 uses: actions/checkout@v2
26
27 - name: Set lower case owner name
28 id: lower_owner
29 run: |
30 OWNER_LC=$(echo "${{ github.repository_owner }}" \
31 | tr '[:upper:]' '[:lower:]')
32 echo "::set-output name=owner_lc::$OWNER_LC"
33
34 - name: Generate ccache hash
35 id: ccache_hash
36 run: |
37 CCACHE_HASH=$(md5sum include/kernel-* | awk '{ print $1 }' \
38 | md5sum | awk '{ print $1 }')
39 echo "::set-output name=ccache_hash::$CCACHE_HASH"
40
41 - name: Set targets
42 id: find_targets
43 run: |
44 export TARGETS="$(perl ./scripts/dump-target-info.pl targets 2>/dev/null \
45 | sort -u -t '/' -k1,1 \
46 | awk '{ print $1 }')"
47
48 JSON='['
49 FIRST=1
50 for TARGET in $TARGETS; do
51 [[ $FIRST -ne 1 ]] && JSON="$JSON"','
52 JSON="$JSON"'"'"${TARGET}"'"'
53 FIRST=0
54 done
55 JSON="$JSON"']'
56
57 echo -e "\n---- targets ----\n"
58 echo "$JSON"
59 echo -e "\n---- targets ----\n"
60
61 echo "::set-output name=target::$JSON"
62
63 build:
64 name: Build Kernel with external toolchain
65 needs: determine_targets
66 runs-on: ubuntu-latest
67 strategy:
68 fail-fast: False
69 matrix:
70 target: ${{fromJson(needs.determine_targets.outputs.target)}}
71
72 container: ghcr.io/${{ needs.determine_targets.outputs.owner_lc }}/tools:latest
73
74 permissions:
75 contents: read
76 packages: read
77
78 steps:
79 - name: Checkout master directory
80 uses: actions/checkout@v2
81 with:
82 path: openwrt
83
84 - name: Checkout packages feed
85 uses: actions/checkout@v2
86 with:
87 repository: openwrt/packages
88 path: openwrt/feeds/packages
89
90 - name: Checkout luci feed
91 uses: actions/checkout@v2
92 with:
93 repository: openwrt/luci
94 path: openwrt/feeds/luci
95
96 - name: Checkout routing feed
97 uses: actions/checkout@v2
98 with:
99 repository: openwrt/routing
100 path: openwrt/feeds/routing
101
102 - name: Checkout telephony feed
103 uses: actions/checkout@v2
104 with:
105 repository: openwrt/telephony
106 path: openwrt/feeds/telephony
107
108 - name: Fix permission
109 run: |
110 chown -R buildbot:buildbot openwrt
111
112 - name: Initialization environment
113 run: |
114 TARGET=$(echo ${{ matrix.target }} | cut -d "/" -f 1)
115 SUBTARGET=$(echo ${{ matrix.target }} | cut -d "/" -f 2)
116 echo "TARGET=$TARGET" >> "$GITHUB_ENV"
117 echo "SUBTARGET=$SUBTARGET" >> "$GITHUB_ENV"
118
119 - name: Update & Install feeds
120 shell: su buildbot -c "sh -e {0}"
121 working-directory: openwrt
122 run: |
123 ./scripts/feeds update -a
124 ./scripts/feeds install -a
125
126 - name: Parse toolchain file
127 working-directory: openwrt
128 run: |
129 TOOLCHAIN_STRING="$(curl "https://downloads.cdn.openwrt.org/snapshots/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}/sha256sums" \
130 | grep ".*openwrt-toolchain.*tar.xz")"
131 TOOLCHAIN_FILE=$(echo "$TOOLCHAIN_STRING" | sed -n -e 's/.*\(openwrt-toolchain.*\).tar.xz/\1/p')
132 TOOLCHAIN_SHA256=$(echo "$TOOLCHAIN_STRING" | cut -d ' ' -f 1)
133
134 echo "TOOLCHAIN_FILE=$TOOLCHAIN_FILE" >> "$GITHUB_ENV"
135 echo "TOOLCHAIN_SHA256=$TOOLCHAIN_SHA256" >> "$GITHUB_ENV"
136
137 - name: Cache external toolchain
138 id: cache-external-toolchain
139 uses: actions/cache@v3
140 with:
141 path: openwrt/${{ env.TOOLCHAIN_FILE }}
142 key: ${{ env.TOOLCHAIN_FILE }}-${{ env.TOOLCHAIN_SHA256 }}
143
144 - name: Cache ccache
145 uses: actions/cache@v3
146 with:
147 path: openwrt/.ccache
148 key: ccache-kernel-${{ env.TARGET }}/${{ env.SUBTARGET }}-${{ needs.determine_targets.outputs.ccache_hash }}
149 restore-keys: |
150 ccache-kernel-${{ env.TARGET }}/${{ env.SUBTARGET }}-
151
152 - name: Download external toolchain
153 if: ${{ steps.cache-external-toolchain.outputs.cache-hit != 'true' }}
154 shell: su buildbot -c "sh -e {0}"
155 working-directory: openwrt
156 run: |
157 wget -O - https://downloads.cdn.openwrt.org/snapshots/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}/${TOOLCHAIN_FILE}.tar.xz \
158 | tar --xz -xf -
159
160 - name: Extract prebuilt tools
161 shell: su buildbot -c "sh -e {0}"
162 working-directory: openwrt
163 run: ./scripts/ext-tools.sh --tools /tools.tar
164
165 - name: Configure external toolchain
166 shell: su buildbot -c "sh -e {0}"
167 working-directory: openwrt
168 run: |
169 echo CONFIG_ALL_KMODS=y >> .config
170 echo CONFIG_DEVEL=y >> .config
171 echo CONFIG_AUTOREMOVE=y >> .config
172 echo CONFIG_CCACHE=y >> .config
173
174 ./scripts/ext-toolchain.sh \
175 --toolchain ${{ env.TOOLCHAIN_FILE }}/toolchain-* \
176 --overwrite-config \
177 --config ${{ env.TARGET }}/${{ env.SUBTARGET }}
178
179 - name: Show configuration
180 shell: su buildbot -c "sh -e {0}"
181 working-directory: openwrt
182 run: ./scripts/diffconfig.sh
183
184 - name: Build tools
185 shell: su buildbot -c "sh -e {0}"
186 working-directory: openwrt
187 run: make tools/install -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
188
189 - name: Build toolchain
190 shell: su buildbot -c "sh -e {0}"
191 working-directory: openwrt
192 run: make toolchain/install -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
193
194 - name: Build Kernel
195 shell: su buildbot -c "sh -e {0}"
196 working-directory: openwrt
197 run: make target/compile -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
198
199 - name: Build Kernel Kmods
200 shell: su buildbot -c "sh -e {0}"
201 working-directory: openwrt
202 run: make package/linux/compile -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
203
204 - name: Upload logs
205 if: failure()
206 uses: actions/upload-artifact@v2
207 with:
208 name: ${{ env.TARGET }}-${{ env.SUBTARGET }}-logs
209 path: "openwrt/logs"