CI: kernel: build only changed targets
authorChristian Marangi <ansuelsmth@gmail.com>
Tue, 10 Jan 2023 22:20:07 +0000 (23:20 +0100)
committerChristian Marangi <ansuelsmth@gmail.com>
Wed, 11 Jan 2023 13:28:41 +0000 (14:28 +0100)
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>
.github/workflows/kernel.yml

index d886002ed1641411f777a02db68fe1cb7499c938..6cff102091e27a71f8b2e7cb7321f66d9ead87c4 100644 (file)
@@ -16,7 +16,7 @@ on:
       - '.github/workflows/kernel.yml'
       - 'include/kernel*'
       - 'package/kernel/**'
-      - 'target/linux/generic/**'
+      - 'target/linux/**'
 
 permissions:
   contents: read
@@ -26,33 +26,66 @@ jobs:
     name: Set targets
     runs-on: ubuntu-latest
     outputs:
-      target: ${{ steps.find_targets.outputs.target }}
+      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
+        with:
+          since_last_remote_commit: true
 
       - name: Set targets
         id: find_targets
         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 \
             | sort -u -t '/' -k1,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
           for TARGET in $TARGETS; do
-            [[ $FIRST -ne 1 ]] && JSON="$JSON"','
-            JSON="$JSON"'"'"${TARGET}"'"'
-            FIRST=0
+            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="$JSON_TARGETS"','
+              JSON_TARGETS="$JSON_TARGETS"'"'"${TARGET}"'"'
+              FIRST=0
+            fi
           done
-          JSON="$JSON"']'
+          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 ----\n"
-           echo "$JSON"
-           echo -e "\n---- targets ----\n"
+          echo -e "\n---- targets to check patch ----\n"
+          echo "$JSON_TARGETS"
+          echo -e "\n---- targets to check patch ----\n"
 
-           echo "target=$JSON" >> $GITHUB_OUTPUT
+          echo "targets_subtargets=$JSON_TARGETS_SUBTARGETS" >> $GITHUB_OUTPUT
+          echo "targets=$JSON_TARGETS" >> $GITHUB_OUTPUT
 
   build:
     name: Build Kernel with external toolchain
@@ -63,7 +96,7 @@ jobs:
     strategy:
        fail-fast: False
        matrix:
-         target: ${{fromJson(needs.determine_targets.outputs.target)}}
+         target: ${{fromJson(needs.determine_targets.outputs.targets_subtargets)}}
     uses: ./.github/workflows/build.yml
     with:
       target: ${{ matrix.target }}
@@ -79,7 +112,7 @@ jobs:
     strategy:
        fail-fast: False
        matrix:
-         target: ${{fromJson(needs.determine_targets.outputs.target)}}
+         target: ${{fromJson(needs.determine_targets.outputs.targets)}}
     uses: ./.github/workflows/check-kernel-patches.yml
     with:
       target: ${{ matrix.target }}