CI: build: add support for external toolchains from stable branch
[openwrt/staging/jow.git] / .github / workflows / build.yml
1 name: Build sub target
2
3 on:
4 workflow_call:
5 inputs:
6 target:
7 required: true
8 type: string
9 testing:
10 type: boolean
11 build_toolchain:
12 type: boolean
13 include_feeds:
14 type: boolean
15 build_full:
16 type: boolean
17 build_all_modules:
18 type: boolean
19 build_all_kmods:
20 type: boolean
21 build_all_boards:
22 type: boolean
23
24 permissions:
25 contents: read
26
27 jobs:
28 setup_build:
29 name: Setup build
30 runs-on: ubuntu-latest
31 outputs:
32 owner_lc: ${{ steps.lower_owner.outputs.owner_lc }}
33 ccache_hash: ${{ steps.ccache_hash.outputs.ccache_hash }}
34 container_tag: ${{ steps.determine_tools_container.outputs.container_tag }}
35
36 steps:
37 - name: Checkout
38 uses: actions/checkout@v3
39
40 - name: Set lower case owner name
41 id: lower_owner
42 run: |
43 OWNER_LC=$(echo "${{ github.repository_owner }}" \
44 | tr '[:upper:]' '[:lower:]')
45 echo "owner_lc=$OWNER_LC" >> $GITHUB_OUTPUT
46
47 - name: Generate ccache hash
48 id: ccache_hash
49 run: |
50 CCACHE_HASH=$(md5sum include/kernel-* | awk '{ print $1 }' \
51 | md5sum | awk '{ print $1 }')
52 echo "ccache_hash=$CCACHE_HASH" >> $GITHUB_OUTPUT
53
54 # Per branch tools container tag
55 # By default stick to latest
56 # For official test targetting openwrt stable branch
57 # Get the branch or parse the tag and push dedicated tools containers
58 # For local test to use the correct container for stable release testing
59 # you need to use for the branch name a prefix of openwrt-[0-9][0-9].[0-9][0-9]-
60 - name: Determine tools container tag
61 id: determine_tools_container
62 run: |
63 CONTAINER_TAG=latest
64 if [ -n "${{ github.base_ref }}" ]; then
65 if echo "${{ github.base_ref }}" | grep -q -E 'openwrt-[0-9][0-9]\.[0-9][0-9]'; then
66 CONTAINER_TAG="${{ github.base_ref }}"
67 fi
68 elif [ ${{ github.ref_type }} == "branch" ]; then
69 if echo "${{ github.ref_name }}" | grep -q -E 'openwrt-[0-9][0-9]\.[0-9][0-9]-'; then
70 CONTAINER_TAG="$(echo ${{ github.ref_name }} | sed 's/^\(openwrt-[0-9][0-9]\.[0-9][0-9]\)-.*/\1/')"
71 fi
72 elif [ ${{ github.ref_type }} == "tag" ]; then
73 if echo "${{ github.ref_name }}" | grep -q -E 'v[0-9][0-9]\.[0-9][0-9]\..+'; then
74 CONTAINER_TAG=openwrt-"$(echo ${{ github.ref_name }} | sed 's/v\([0-9][0-9]\.[0-9][0-9]\)\..\+/\1/')"
75 fi
76 fi
77 echo "Tools container to use tools:$CONTAINER_TAG"
78 echo "container_tag=$CONTAINER_TAG" >> $GITHUB_OUTPUT
79
80 build:
81 name: Build with external toolchain
82 needs: setup_build
83 runs-on: ubuntu-latest
84
85 container: ghcr.io/${{ needs.setup_build.outputs.owner_lc }}/tools:${{ needs.setup_build.outputs.container_tag }}
86
87 permissions:
88 contents: read
89 packages: read
90
91 steps:
92 - name: Checkout master directory
93 uses: actions/checkout@v3
94 with:
95 path: openwrt
96
97 - name: Checkout packages feed
98 if: inputs.include_feeds == true
99 uses: actions/checkout@v3
100 with:
101 repository: openwrt/packages
102 path: openwrt/feeds/packages
103
104 - name: Checkout luci feed
105 if: inputs.include_feeds == true
106 uses: actions/checkout@v3
107 with:
108 repository: openwrt/luci
109 path: openwrt/feeds/luci
110
111 - name: Checkout routing feed
112 if: inputs.include_feeds == true
113 uses: actions/checkout@v3
114 with:
115 repository: openwrt/routing
116 path: openwrt/feeds/routing
117
118 - name: Checkout telephony feed
119 if: inputs.include_feeds == true
120 uses: actions/checkout@v3
121 with:
122 repository: openwrt/telephony
123 path: openwrt/feeds/telephony
124
125 - name: Fix permission
126 run: |
127 chown -R buildbot:buildbot openwrt
128
129 - name: Initialization environment
130 run: |
131 TARGET=$(echo ${{ inputs.target }} | cut -d "/" -f 1)
132 SUBTARGET=$(echo ${{ inputs.target }} | cut -d "/" -f 2)
133 echo "TARGET=$TARGET" >> "$GITHUB_ENV"
134 echo "SUBTARGET=$SUBTARGET" >> "$GITHUB_ENV"
135
136 - name: Update & Install feeds
137 if: inputs.include_feeds == true
138 shell: su buildbot -c "sh -e {0}"
139 working-directory: openwrt
140 run: |
141 ./scripts/feeds update -a
142 ./scripts/feeds install -a
143
144 - name: Parse toolchain file
145 if: inputs.build_toolchain == false
146 working-directory: openwrt
147 run: |
148 TOOLCHAIN_PATH=snapshots
149
150 if [ -n "${{ github.base_ref }}" ]; then
151 if echo "${{ github.base_ref }}" | grep -q -E 'openwrt-[0-9][0-9]\.[0-9][0-9]'; then
152 major_ver="$(echo ${{ github.base_ref }} | sed 's/openwrt-/v/')"
153 fi
154 elif [ "${{ github.ref_type }}" = "branch" ]; then
155 if echo "${{ github.ref_name }}" | grep -q -E 'openwrt-[0-9][0-9]\.[0-9][0-9]-'; then
156 major_ver="$(echo ${{ github.ref_name }} | sed 's/openwrt-\([0-9][0-9]\.[0-9][0-9]\)-.*/v\1/')"
157 fi
158 elif [ "${{ github.ref_type }}" = "tag" ]; then
159 if echo "${{ github.ref_name }}" | grep -q -E 'v[0-9][0-9]\.[0-9][0-9]\..+'; then
160 major_ver="$(sed 's/\(v[0-9][0-9]\.[0-9][0-9]\)\..\+/\1/')"
161 fi
162 fi
163
164 if [ -n "$major_ver" ]; then
165 git fetch --tags
166 latest_tag="$(git tag --sort=-creatordate -l $major_ver* | head -n1)"
167 if [ -n "$latest_tag" ]; then
168 TOOLCHAIN_PATH=releases/$(echo $latest_tag | sed 's/^v//')
169 fi
170 fi
171
172 TOOLCHAIN_STRING="$(curl "https://downloads.cdn.openwrt.org/$TOOLCHAIN_PATH/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}/sha256sums" \
173 | grep ".*openwrt-toolchain.*tar.xz")"
174 TOOLCHAIN_FILE=$(echo "$TOOLCHAIN_STRING" | sed -n -e 's/.*\(openwrt-toolchain.*\).tar.xz/\1/p')
175 TOOLCHAIN_SHA256=$(echo "$TOOLCHAIN_STRING" | cut -d ' ' -f 1)
176
177 echo "TOOLCHAIN_FILE=$TOOLCHAIN_FILE" >> "$GITHUB_ENV"
178 echo "TOOLCHAIN_SHA256=$TOOLCHAIN_SHA256" >> "$GITHUB_ENV"
179 echo "TOOLCHAIN_PATH=$TOOLCHAIN_PATH" >> "$GITHUB_ENV"
180
181 - name: Cache external toolchain
182 if: inputs.build_toolchain == false
183 id: cache-external-toolchain
184 uses: actions/cache@v3
185 with:
186 path: openwrt/${{ env.TOOLCHAIN_FILE }}
187 key: ${{ env.TOOLCHAIN_FILE }}-${{ env.TOOLCHAIN_SHA256 }}
188
189 - name: Cache ccache
190 uses: actions/cache@v3
191 with:
192 path: openwrt/.ccache
193 key: ccache-kernel-${{ env.TARGET }}/${{ env.SUBTARGET }}-${{ needs.setup_build.outputs.ccache_hash }}
194 restore-keys: |
195 ccache-kernel-${{ env.TARGET }}/${{ env.SUBTARGET }}-
196
197 - name: Download external toolchain
198 if: inputs.build_toolchain == false && steps.cache-external-toolchain.outputs.cache-hit != 'true'
199 shell: su buildbot -c "sh -e {0}"
200 working-directory: openwrt
201 run: |
202 wget -O - https://downloads.cdn.openwrt.org/${{ env.TOOLCHAIN_PATH }}/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}/${{ env.TOOLCHAIN_FILE }}.tar.xz \
203 | tar --xz -xf -
204
205 - name: Extract prebuilt tools
206 shell: su buildbot -c "sh -e {0}"
207 working-directory: openwrt
208 run: ./scripts/ext-tools.sh --tools /tools.tar
209
210 - name: Configure testing kernel
211 if: inputs.testing == true
212 shell: su buildbot -c "sh -e {0}"
213 working-directory: openwrt
214 run: |
215 echo CONFIG_TESTING_KERNEL=y >> .config
216
217 - name: Configure all kernel modules
218 if: inputs.build_all_kmods == true
219 shell: su buildbot -c "sh -e {0}"
220 working-directory: openwrt
221 run: |
222 echo CONFIG_ALL_KMODS=y >> .config
223
224 - name: Configure all modules
225 if: inputs.build_all_modules == true
226 shell: su buildbot -c "sh -e {0}"
227 working-directory: openwrt
228 run: |
229 echo CONFIG_ALL=y >> .config
230
231 - name: Configure all boards
232 if: inputs.build_all_boards == true
233 shell: su buildbot -c "sh -e {0}"
234 working-directory: openwrt
235 run: |
236 echo CONFIG_TARGET_MULTI_PROFILE=y >> .config
237 echo CONFIG_TARGET_PER_DEVICE_ROOTFS=y >> .config
238 echo CONFIG_TARGET_ALL_PROFILES=y >> .config
239
240 - name: Configure external toolchain
241 if: inputs.build_toolchain == false
242 shell: su buildbot -c "sh -e {0}"
243 working-directory: openwrt
244 run: |
245 echo CONFIG_DEVEL=y >> .config
246 echo CONFIG_AUTOREMOVE=y >> .config
247 echo CONFIG_CCACHE=y >> .config
248
249 ./scripts/ext-toolchain.sh \
250 --toolchain ${{ env.TOOLCHAIN_FILE }}/toolchain-* \
251 --overwrite-config \
252 --config ${{ env.TARGET }}/${{ env.SUBTARGET }}
253
254 - name: Configure internal toolchain
255 if: inputs.build_toolchain == true
256 shell: su buildbot -c "sh -e {0}"
257 working-directory: openwrt
258 run: |
259 echo CONFIG_DEVEL=y >> .config
260 echo CONFIG_AUTOREMOVE=y >> .config
261 echo CONFIG_CCACHE=y >> .config
262
263 echo "CONFIG_TARGET_${{ env.TARGET }}=y" >> .config
264 echo "CONFIG_TARGET_${{ env.TARGET }}_${{ env.SUBTARGET }}=y" >> .config
265
266 make defconfig
267
268 - name: Show configuration
269 shell: su buildbot -c "sh -e {0}"
270 working-directory: openwrt
271 run: ./scripts/diffconfig.sh
272
273 - name: Build tools
274 shell: su buildbot -c "sh -e {0}"
275 working-directory: openwrt
276 run: make tools/install -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
277
278 - name: Build toolchain
279 shell: su buildbot -c "sh -e {0}"
280 working-directory: openwrt
281 run: make toolchain/install -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
282
283 - name: Build Kernel
284 shell: su buildbot -c "sh -e {0}"
285 working-directory: openwrt
286 run: make target/compile -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
287
288 - name: Build Kernel Kmods
289 shell: su buildbot -c "sh -e {0}"
290 working-directory: openwrt
291 run: make package/linux/compile -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
292
293 - name: Build everything
294 if: inputs.build_full == true
295 shell: su buildbot -c "sh -e {0}"
296 working-directory: openwrt
297 run: make -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
298
299 - name: Upload logs
300 if: failure()
301 uses: actions/upload-artifact@v3
302 with:
303 name: ${{ env.TARGET }}-${{ env.SUBTARGET }}-logs
304 path: "openwrt/logs"