CI: kernel: build only changed targets

Detect changes in commit and build only changed targets.
If a change is related to the generic target, build test each target.

The matrix json is split. For target check patch only the first
subtarget is selected, for build test each target subtarget is built.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
This commit is contained in:
Christian Marangi 2023-01-10 23:20:07 +01:00
parent 895f38ca1e
commit 04ada8bc41
No known key found for this signature in database
GPG Key ID: AC001D09ADBFEAD7

View File

@ -16,7 +16,7 @@ on:
- '.github/workflows/kernel.yml' - '.github/workflows/kernel.yml'
- 'include/kernel*' - 'include/kernel*'
- 'package/kernel/**' - 'package/kernel/**'
- 'target/linux/generic/**' - 'target/linux/**'
permissions: permissions:
contents: read contents: read
@ -26,33 +26,66 @@ jobs:
name: Set targets name: Set targets
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs: outputs:
target: ${{ steps.find_targets.outputs.target }} targets_subtargets: ${{ steps.find_targets.outputs.targets_subtargets }}
targets: ${{ steps.find_targets.outputs.targets }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v35
with:
since_last_remote_commit: true
- name: Set targets - name: Set targets
id: find_targets id: find_targets
run: | run: |
export TARGETS_SUBTARGETS="$(perl ./scripts/dump-target-info.pl targets 2>/dev/null \
| sort -u -t '/' -k1 \
| awk '{ print $1 }')"
export TARGETS="$(perl ./scripts/dump-target-info.pl targets 2>/dev/null \ export TARGETS="$(perl ./scripts/dump-target-info.pl targets 2>/dev/null \
| sort -u -t '/' -k1,1 \ | sort -u -t '/' -k1,1 \
| awk '{ print $1 }')" | awk '{ print $1 }')"
JSON='[' JSON_TARGETS_SUBTARGETS='['
FIRST=1
for TARGET in $TARGETS_SUBTARGETS; do
if echo ${{ steps.changed-files.outputs.all_changed_files }} | grep -q target/linux/generic ||
echo ${{ steps.changed-files.outputs.all_changed_files }} | grep -q $(echo $TARGET | cut -d "/" -f 1); then
[[ $FIRST -ne 1 ]] && JSON_TARGETS_SUBTARGETS="$JSON_TARGETS_SUBTARGETS"','
JSON_TARGETS_SUBTARGETS="$JSON_TARGETS_SUBTARGETS"'"'"${TARGET}"'"'
FIRST=0
fi
done
JSON_TARGETS_SUBTARGETS="$JSON_TARGETS_SUBTARGETS"']'
JSON_TARGETS='['
FIRST=1 FIRST=1
for TARGET in $TARGETS; do for TARGET in $TARGETS; do
[[ $FIRST -ne 1 ]] && JSON="$JSON"',' if echo ${{ steps.changed-files.outputs.all_changed_files }} | grep -q target/linux/generic ||
JSON="$JSON"'"'"${TARGET}"'"' echo ${{ steps.changed-files.outputs.all_changed_files }} | grep -q $(echo $TARGET | cut -d "/" -f 1); then
FIRST=0 [[ $FIRST -ne 1 ]] && JSON_TARGETS="$JSON_TARGETS"','
JSON_TARGETS="$JSON_TARGETS"'"'"${TARGET}"'"'
FIRST=0
fi
done done
JSON="$JSON"']' JSON_TARGETS="$JSON_TARGETS"']'
echo -e "\n---- targets ----\n" echo -e "\n---- targets to build ----\n"
echo "$JSON" echo "$JSON_TARGETS_SUBTARGETS"
echo -e "\n---- targets ----\n" echo -e "\n---- targets to build ----\n"
echo "target=$JSON" >> $GITHUB_OUTPUT 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: build:
name: Build Kernel with external toolchain name: Build Kernel with external toolchain
@ -63,7 +96,7 @@ jobs:
strategy: strategy:
fail-fast: False fail-fast: False
matrix: matrix:
target: ${{fromJson(needs.determine_targets.outputs.target)}} target: ${{fromJson(needs.determine_targets.outputs.targets_subtargets)}}
uses: ./.github/workflows/build.yml uses: ./.github/workflows/build.yml
with: with:
target: ${{ matrix.target }} target: ${{ matrix.target }}
@ -79,7 +112,7 @@ jobs:
strategy: strategy:
fail-fast: False fail-fast: False
matrix: matrix:
target: ${{fromJson(needs.determine_targets.outputs.target)}} target: ${{fromJson(needs.determine_targets.outputs.targets)}}
uses: ./.github/workflows/check-kernel-patches.yml uses: ./.github/workflows/check-kernel-patches.yml
with: with:
target: ${{ matrix.target }} target: ${{ matrix.target }}