github-action: rebuild only if it's required accepted/tizen/unified/20240125.160253 accepted/tizen/unified/20240126.061442 accepted/tizen/unified/20240126.061459 accepted/tizen/unified/toolchain/20240311.070049 accepted/tizen/unified/x/20240205.063851
authorMyungJoo Ham <myungjoo.ham@samsung.com>
Wed, 17 Jan 2024 06:40:06 +0000 (15:40 +0900)
committerjaeyun-jung <39614140+jaeyun-jung@users.noreply.github.com>
Wed, 24 Jan 2024 08:02:24 +0000 (17:02 +0900)
This adds a workflow routine that checks if rebuild is needed.
Then, if there is no changes in source code, skip rebuilding

Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
.github/workflows/check_if_rebuild_requires.sh [new file with mode: 0644]
.github/workflows/gbs_x64.yml
.github/workflows/macos.yaml
.github/workflows/risc-v.yml
.github/workflows/ubuntu_clean_llvm_build.yml
.github/workflows/ubuntu_clean_meson_build.yml

diff --git a/.github/workflows/check_if_rebuild_requires.sh b/.github/workflows/check_if_rebuild_requires.sh
new file mode 100644 (file)
index 0000000..3114c2f
--- /dev/null
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+
+##
+# Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved.
+#
+# @file: check_if_rebuild_requires.sh
+# @brief    Check if rebuild & unit-test is required with the given PR.
+# @see      https://github.com/nnstreamer/nnstreamer
+# @author   MyungJoo Ham <myungjoo.ham@samsung.com>
+#
+# Argument 1 ($1): the file containing list of files to be checked.
+# Argument 2 ($2): build mode to be checked
+#                  gbs: check if Tizen GBS build is required
+#                  debian: check if pdebuild is required
+#                  android: check if jni rebuild is required
+#                  build (default): check if general meson rebuild is required.
+
+if [ -z $1 ]; then
+  echo "::error The argument (file path) is not given."
+  exit 1
+fi
+
+if [ -z $2 ]; then
+  mode="build"
+else
+  mode=$2
+fi
+
+rebuild=0
+regbs=0
+redebian=0
+reandroid=0
+
+for file in `cat $1`; do
+  case $file in
+    *.md|*.png|*.webp|*.css|*.html )
+    ;;
+    packaging/* )
+      regbs='1'
+      ;;
+    debian/* )
+      redebian='1'
+      ;;
+    jni/* )
+      reandroid='1'
+      ;;
+    * )
+      rebuild='1'
+      regbs='1'
+      redebian='1'
+      reandroid='1'
+      ;;
+  esac
+done
+
+case $mode in
+  gbs)
+    if [[ "$regbs" == "1" ]]; then
+      echo "REBUILD=YES"
+      exit 0
+    fi
+    ;;
+  debian)
+    if [[ "$redebian" == "1" ]]; then
+      echo "REBUILD=YES"
+      exit 0
+    fi
+    ;;
+  android)
+    if [[ "$reandroid" == "1" ]]; then
+      echo "REBUILD=YES"
+      exit 0
+    fi
+    ;;
+  *)
+    if [[ "$rebuild" == "1" ]]; then
+      echo "REBUILD=YES"
+      exit 0
+    fi
+    ;;
+esac
+
+echo "REBUILD=NO"
index 5e24be6..c8383ab 100644 (file)
@@ -1,5 +1,8 @@
 name: GBS Tizen build for x64 from Ubuntu
 
+# ${{ github.event.pull_request.commits }} : # commits in this PR
+# - changed_file_list in GITHUB_ENV: the list of files updated in this pull-request.
+
 on:
   pull_request:
     branches: [ main ]
@@ -10,30 +13,48 @@ jobs:
     runs-on: ubuntu-20.04
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
+      with:
+        fetch-depth: 0
+    - name: Check if rebuild required
+      ## @todo This should become a reusable workflow.
+      run: |
+        tmpfile=$(mktemp)
+        git show --pretty="format:" --name-only --diff-filter=AMRC ${{ github.event.pull_request.head.sha}} -${{ github.event.pull_request.commits }} | sort | uniq | awk NF > ${tmpfile}
+        echo "changed_file_list=${tmpfile}" >> "$GITHUB_ENV"
+        rebuild=`bash .github/workflows/check_if_rebuild_requires.sh ${tmpfile} gbs | grep "REBUILD=YES" | wc -l`
+        echo "Rebuild required: ${rebuild}"
+        echo "rebuild=${rebuild}" >> "$GITHUB_ENV"
     - uses: actions/setup-python@v1
-    - name: prepare deb sources for GBS
-      run: echo "deb [trusted=yes] http://download.tizen.org/tools/latest-release/Ubuntu_20.04/ /" | sudo tee /etc/apt/sources.list.d/tizen.list
-    - name: install GBS
-      run: sudo apt-get update && sudo apt-get install -y gbs
-    - name: configure GBS
-      run: cp .github/workflows/tizen.gbs.conf ~/.gbs.conf
+    - name: prepare GBS
+      if: env.rebuild == '1'
+      run: |
+        echo "deb [trusted=yes] http://download.tizen.org/tools/latest-release/Ubuntu_20.04/ /" | sudo tee /etc/apt/sources.list.d/tizen.list
+        sudo apt-get update && sudo apt-get install -y gbs
+        cp .github/workflows/tizen.gbs.conf ~/.gbs.conf
     - name: make cache key
+      if: env.rebuild == '1'
       id: make-key
       run: echo "cache_key=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
       shell: bash
     - name: cache gbs cache
       id: cache-gbs-root
+      if: env.rebuild == '1'
       uses: actions/cache@v3
       with:
         path: ~/GBS-ROOT/local/cache
         key: ${{ steps.make-key.outputs.cache_key }}
     - name: run GBS
-      run: gbs build --skip-srcrpm --define "_skip_debug_rpm 1"
+      if: env.rebuild == '1'
+      run: |
+        gbs build --skip-srcrpm --define "_skip_debug_rpm 1"
     - name: get nntrainer
+      if: env.rebuild == '1'
       uses: actions/checkout@v3
       with:
         repository: nnstreamer/nntrainer
         path: nntrainer
     - name: run nntrainer GBS build
-      run: pushd nntrainer && gbs build --skip-srcrpm --define "unit_test 1" --define "_skip_debug_rpm 1" && popd
+      if: env.rebuild == '1'
+      run: |
+        pushd nntrainer && gbs build --skip-srcrpm --define "unit_test 1" --define "_skip_debug_rpm 1" && popd
index 7b76d12..3f80a28 100644 (file)
@@ -9,16 +9,30 @@ jobs:
     runs-on: macos-latest
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
+      with:
+        fetch-depth: 0
+    - name: Check if rebuild required
+      ## @todo This should become a reusable workflow.
+      run: |
+        tmpfile=$(mktemp)
+        git show --pretty="format:" --name-only --diff-filter=AMRC ${{ github.event.pull_request.head.sha}} -${{ github.event.pull_request.commits }} | sort | uniq | awk NF > ${tmpfile}
+        echo "changed_file_list=${tmpfile}" >> "$GITHUB_ENV"
+        rebuild=`bash .github/workflows/check_if_rebuild_requires.sh ${tmpfile} rebuild | grep "REBUILD=YES" | wc -l`
+        echo "Rebuild required: ${rebuild}"
+        echo "rebuild=${rebuild}" >> "$GITHUB_ENV"
     - uses: actions/setup-python@v1
     - name: homebrew
+      if: env.rebuild == '1'
       run: |
           # temporarily disabled, because it always fails these days.
           # brew update
           brew install cask
     - name: install minimal requirements
+      if: env.rebuild == '1'
       run: brew install meson ninja pkg-config cmake libffi glib gstreamer numpy json-glib
     - uses: BSFishy/meson-build@v1.0.3
+      if: env.rebuild == '1'
       with:
         action: build
 
index ec1eda4..b12ab9e 100644 (file)
@@ -9,9 +9,21 @@ jobs:
     runs-on: ubuntu-20.04
     name: Build on Ubuntu 20.04 RISC-V 64
     steps:
-      - uses: actions/checkout@v2.1.0
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: Check if rebuild required
+        ## @todo This should become a reusable workflow.
+        run: |
+          tmpfile=$(mktemp)
+          git show --pretty="format:" --name-only --diff-filter=AMRC ${{ github.event.pull_request.head.sha}} -${{ github.event.pull_request.commits }} | sort | uniq | awk NF > ${tmpfile}
+          echo "changed_file_list=${tmpfile}" >> "$GITHUB_ENV"
+          rebuild=`bash .github/workflows/check_if_rebuild_requires.sh ${tmpfile} rebuild | grep "REBUILD=YES" | wc -l`
+          echo "Rebuild required: ${rebuild}"
+          echo "rebuild=${rebuild}" >> "$GITHUB_ENV"
       - uses: nnstreamer/run-on-arch-action@master
         name: Run commands
+        if: env.rebuild == '1'
         id: Build
         with:
           arch: riscv64
index dbaae2d..153acf8 100644 (file)
@@ -13,22 +13,38 @@ jobs:
         os: [ ubuntu-22.04 ]
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
+      with:
+        fetch-depth: 0
+    - name: Check if rebuild required
+      ## @todo This should become a reusable workflow.
+      run: |
+        tmpfile=$(mktemp)
+        git show --pretty="format:" --name-only --diff-filter=AMRC ${{ github.event.pull_request.head.sha}} -${{ github.event.pull_request.commits }} | sort | uniq | awk NF > ${tmpfile}
+        echo "changed_file_list=${tmpfile}" >> "$GITHUB_ENV"
+        rebuild=`bash .github/workflows/check_if_rebuild_requires.sh ${tmpfile} rebuild | grep "REBUILD=YES" | wc -l`
+        echo "Rebuild required: ${rebuild}"
+        echo "rebuild=${rebuild}" >> "$GITHUB_ENV"
     - uses: actions/setup-python@v1
       with:
         python-version: '3.x'
     - name: install minimal requirements
+      if: env.rebuild == '1'
       run: |
           sudo apt-get update && \
           sudo apt-get install -y libglib2.0-dev libjson-glib-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libunwind-dev googletest \
             gstreamer1.0-plugins-good clang
     - run: pip install meson ninja
+      if: env.rebuild == '1'
     - run: meson setup build/
+      if: env.rebuild == '1'
       env:
         CC: clang
         CXX: clang++
     - run: meson compile -C build/
+      if: env.rebuild == '1'
     - run: meson test -C build/ -v
+      if: env.rebuild == '1'
     - uses: actions/upload-artifact@v1
       if: failure()
       with:
index 16de549..4c4919e 100644 (file)
@@ -13,32 +13,47 @@ jobs:
         os: [ ubuntu-20.04, ubuntu-22.04 ]
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
+      with:
+        fetch-depth: 0
+    - name: Check if rebuild required
+      ## @todo This should become a reusable workflow.
+      run: |
+        tmpfile=$(mktemp)
+        git show --pretty="format:" --name-only --diff-filter=AMRC ${{ github.event.pull_request.head.sha}} -${{ github.event.pull_request.commits }} | sort | uniq | awk NF > ${tmpfile}
+        echo "changed_file_list=${tmpfile}" >> "$GITHUB_ENV"
+        rebuild=`bash .github/workflows/check_if_rebuild_requires.sh ${tmpfile} rebuild | grep "REBUILD=YES" | wc -l`
+        echo "Rebuild required: ${rebuild}"
+        echo "rebuild=${rebuild}" >> "$GITHUB_ENV"
     - uses: actions/setup-python@v1
       with:
         python-version: '3.x'
-    - name: install minimal requirements
-      run: sudo apt-get update && sudo apt-get install -y libglib2.0-dev libjson-glib-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libunwind-dev googletest
-    - name: install additional packages for features
-      run: sudo apt-get install -y liborc-0.4-dev flex bison libopencv-dev pkg-config python3-dev python3-numpy python3
-    - name: install additional package from PPA for testing
-      run: sudo add-apt-repository -y ppa:nnstreamer/ppa && sudo apt-get update && sudo apt-get install -y ssat libpaho-mqtt-dev
-    - name: install additional package from Ubuntu for testing and valgrind
-      run: sudo apt-get install -y valgrind gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-base libgtest-dev libpng-dev libc6-dbg binutils-x86-64-linux-gnu-dbg valgrind-dbg
-    - run: pip install meson ninja
-    - run: meson setup build/
+    - name: install requirements
+      if: env.rebuild == '1'
+      run: |
+        sudo apt-get update && sudo apt-get install -y libglib2.0-dev libjson-glib-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libunwind-dev googletest
+        sudo apt-get install -y liborc-0.4-dev flex bison libopencv-dev pkg-config python3-dev python3-numpy python3
+        sudo add-apt-repository -y ppa:nnstreamer/ppa && sudo apt-get update && sudo apt-get install -y ssat libpaho-mqtt-dev
+        sudo apt-get install -y valgrind gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-base libgtest-dev libpng-dev libc6-dbg binutils-x86-64-linux-gnu-dbg valgrind-dbg
+        pip install meson ninja
+    - name: build and unit test
+      if: env.rebuild == '1'
+      run: |
+        meson setup build/
+        meson compile -C build/
+        meson test -C build/ -v
       env:
         CC: gcc
-    - run: meson compile -C build/
-    - run: meson test -C build/ -v
     - uses: actions/upload-artifact@v1
       if: failure()
       with:
         name: Meson_Testlog
         path: build/meson-logs/testlog.txt
     - name: SSAT run with Valgrind on decoder-bounding-box
+      if: env.rebuild == '1'
       run: if [ '${{ matrix.os }}' == 'ubuntu-22.04' ]; then export NNSTREAMER_BUILD_ROOT_PATH=`pwd`/build && export NNSTREAMER_FILTERS=`pwd`/build/ext/nnstreamer/tensor_filter && export NNSTREAMER_DECODERS=`pwd`/build/ext/nnstreamer/tensor_decoder && export NNSTREAMER_CONVERTERS=`pwd`/build/ext/nnstreamer/tensor_converter && export GST_PLUGIN_PATH=`pwd`/build/gst && export NNSTREAMER_CONF=`pwd`/build/nnstreamer-test.ini && pushd tests/nnstreamer_decoder_boundingbox && G_SLICE=always-malloc G_DEBUG=gc-friendly ssat -n -p=1 --enable-valgrind --valgrind-suppression ../../tools/debugging/valgrind_suppression --summary summary.txt -cn _n && popd; fi
     - name: GTEST run with Valgrind on a case
+      if: env.rebuild == '1'
       run: if [ '${{ matrix.os }}' == 'ubuntu-22.04' ]; then export NNSTREAMER_BUILD_ROOT_PATH=`pwd`/build && export NNSTREAMER_FILTERS=`pwd`/build/ext/nnstreamer/tensor_filter && export NNSTREAMER_DECODERS=`pwd`/build/ext/nnstreamer/tensor_decoder && export NNSTREAMER_CONVERTERS=`pwd`/build/ext/nnstreamer/tensor_converter && export GST_PLUGIN_PATH=`pwd`/build/gst && export NNSTREAMER_CONF=`pwd`/build/nnstreamer-test.ini && G_SLICE=always-malloc G_DEBUG=gc-friendly ./packaging/run_unittests_binaries.sh --valgrind ./tests/ || echo "There are Valgrind errors. Please fix it. As we have a lot of Valgrind errors from different libraries and possible from nnstreamer itself, we are not halting the build with Valgrind errors until we get them all."; fi
 
 # TODO: add more subplugins to be built