fix: add building static vppctl as part of the CI for VPP
[ci-management.git] / jjb / scripts / vpp / build.sh
index 68fa30d..94aa136 100644 (file)
 #!/bin/bash
-# basic build script example
-set -xe -o pipefail
 
-OS_ID=$(grep '^ID=' /etc/os-release | cut -f2- -d= | sed -e 's/\"//g')
-OS_VERSION_ID=$(grep '^VERSION_ID=' /etc/os-release | cut -f2- -d= | sed -e 's/\"//g')
+# Copyright (c) 2021 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 
-echo OS_ID: $OS_ID
-echo OS_VERSION_ID: $OS_VERSION_ID
+echo "---> jjb/scripts/vpp/build.sh"
 
-# do nothing but print the current slave hostname
-hostname
-export CCACHE_DIR=/tmp/ccache
-if [ -d $CCACHE_DIR ];then
-    echo $CCACHE_DIR exists
-    du -sk $CCACHE_DIR
-else
-    echo $CCACHE_DIR does not exist.  This must be a new slave.
-fi
-
-echo "cat /etc/bootstrap.sha"
-if [ -f /etc/bootstrap.sha ];then
-    cat /etc/bootstrap.sha
-else
-    echo "Cannot find cat /etc/bootstrap.sha"
-fi
+set -euxo pipefail
 
-echo "cat /etc/bootstrap-functions.sha"
-if [ -f /etc/bootstrap-functions.sha ];then
-    cat /etc/bootstrap-functions.sha
-else
-    echo "Cannot find cat /etc/bootstrap-functions.sha"
+line="*************************************************************************"
+# Don't build anything if this is a merge job being run when
+# the git HEAD id is not the same as the Gerrit New Revision id.
+if [[ ${JOB_NAME} == *merge* ]] && [ -n "${GERRIT_NEWREV:-}" ] &&
+       [ "$GERRIT_NEWREV" != "$GIT_COMMIT" ] ; then
+    echo -e "\n$line\nSkipping build. A newer patch has been merged.\n$line\n"
+    exit 0
 fi
 
-echo "sha1sum of this script: ${0}"
-sha1sum $0
-
-echo "CC=${CC}"
-echo "IS_CSIT_VPP_JOB=${IS_CSIT_VPP_JOB}"
-# If and only if we are doing verify *after* make verify was made to work
-# and we are not a CSIT job just building packages, then use make verify,
-# else use make pkg-verify.
+OS_ID=$(grep '^ID=' /etc/os-release | cut -f2- -d= | sed -e 's/\"//g')
+OS_VERSION_ID=$(grep '^VERSION_ID=' /etc/os-release | cut -f2- -d= | sed -e 's/\"//g')
+OS_ARCH=$(uname -m)
+DRYRUN="${DRYRUN:-}"
+IS_CSIT_VPP_JOB="${IS_CSIT_VPP_JOB:-}"
+MAKE_PARALLEL_FLAGS="${MAKE_PARALLEL_FLAGS:-}"
+MAKE_PARALLEL_JOBS="${MAKE_PARALLEL_JOBS:-}"
+MAKE_TEST_OS="${MAKE_TEST_OS:-ubuntu-22.04}"
+MAKE_TEST_MULTIWORKER_OS="${MAKE_TEST_MULTIWORKER_OS:-debian-11}"
+VPPAPIGEN_TEST_OS="${VPPAPIGEN_TEST_OS:-${MAKE_TEST_OS}}"
+BUILD_RESULT="SUCCESSFULLY COMPLETED"
+BUILD_ERROR=""
+RETVAL="0"
 
-if [ "x${MAKE_PARALLEL_FLAGS}" != "x" ]
-then
+if [ -n "${MAKE_PARALLEL_FLAGS}" ] ; then
   echo "Building VPP. Number of cores for build set with" \
        "MAKE_PARALLEL_FLAGS='${MAKE_PARALLEL_FLAGS}'."
-elif [ "x${MAKE_PARALLEL_JOBS}" != "x" ]
-then
+elif [ -n "${MAKE_PARALLEL_JOBS}" ] ; then
   echo "Building VPP. Number of cores for build set with" \
        "MAKE_PARALLEL_JOBS='${MAKE_PARALLEL_JOBS}'."
 else
-  echo "Building VPP. Number of cores not set, " \
-       "using build default ($(grep -c ^processor /proc/cpuinfo))."
+    echo "Building VPP. Number of cores not set," \
+         "using build default ($(grep -c ^processor /proc/cpuinfo))."
 fi
 
-if [ "x${MAKE_PARALLEL_JOBS}" != "x" ]
-then
-  export TEST_JOBS="${MAKE_PARALLEL_JOBS}"
-  echo "Testing VPP with ${TEST_JOBS} cores."
-else
-  export TEST_JOBS="auto"
-  echo "Testing VPP with automatically calculated number of cores. " \
-       "See test logs for the exact number."
-fi
+make_build_test() {
+    if ! make UNATTENDED=yes install-dep ; then
+        BUILD_ERROR="FAILED 'make install-dep'"
+        return
+    fi
+    if ! make UNATTENDED=yes install-ext-deps ; then
+        BUILD_ERROR="FAILED 'make install-ext-deps'"
+        return
+    fi
+    if [ -f extras/scripts/build_static_vppctl.sh ]; then
+       if ! extras/scripts/build_static_vppctl.sh ; then
+        BUILD_ERROR="FAILED 'extras/scripts/build_static_vppctl.sh'"
+       return
+    fi
+    if ! make UNATTENDED=yes test-dep ; then
+        BUILD_ERROR="FAILED 'make test-dep'"
+        return
+    fi
+    if ! make UNATTENDED=yes pkg-verify ; then
+        BUILD_ERROR="FAILED 'make pkg-verify'"
+           return
+    fi
+    if [ "${IS_CSIT_VPP_JOB,,}" == "true" ] ; then
+           # CSIT jobs don't need to run make test
+           return
+    fi
+    if [ -n "${MAKE_PARALLEL_JOBS}" ] ; then
+        TEST_JOBS="${MAKE_PARALLEL_JOBS}"
+        echo "Testing VPP with ${TEST_JOBS} cores."
+    else
+        TEST_JOBS="auto"
+        echo "Testing VPP with automatically calculated number of cores. " \
+             "See test logs for the exact number."
+    fi
+    if grep -q "${OS_ID}-${OS_VERSION_ID}" <<< "${VPPAPIGEN_TEST_OS}"; then
+        if ! src/tools/vppapigen/test_vppapigen.py ; then
+            BUILD_ERROR="FAILED src/tools/vppapigen/test_vppapigen.py"
+            return
+        fi
+    fi
+    if grep -q "${OS_ID}-${OS_VERSION_ID}" <<< "${MAKE_TEST_OS}"; then
+        if ! make COMPRESS_FAILED_TEST_LOGS=yes TEST_JOBS="$TEST_JOBS" RETRIES=3 test ; then
+            BUILD_ERROR="FAILED 'make test'"
+            return
+        fi
+    else
+        echo "Skip running 'make test' on ${OS_ID}-${OS_VERSION_ID}"
+    fi
+    if grep -q "${OS_ID}-${OS_VERSION_ID}" <<< "${MAKE_TEST_MULTIWORKER_OS}"; then
+        if git grep -q VPP_WORKER_CONFIG ; then
+            if ! make VPP_WORKER_CONFIG="workers 2" COMPRESS_FAILED_TEST_LOGS=yes \
+                    RETRIES=3 TEST_JOBS="$TEST_JOBS" test ; then
+                BUILD_ERROR="FAILED 'make test' with VPP_WORKER_CONFIG='workers 2'"
+                return
+            else
+                echo -e "\n* VPP ${OS_ID^^}-${OS_VERSION_ID}-${OS_ARCH^^}" \
+                        "MULTIWORKER MAKE TEST SUCCESSFULLY COMPLETED\n"
+            fi
+        elif git grep -q VPP_WORKER_COUNT ; then
+            if ! make VPP_WORKER_COUNT="2" COMPRESS_FAILED_TEST_LOGS=yes \
+                    RETRIES=3 TEST_JOBS="$TEST_JOBS" test ; then
+                BUILD_ERROR="FAILED 'make test' with VPP_WORKER_CONFIG='workers 2'"
+                return
+            else
+                echo -e "\n* VPP ${OS_ID^^}-${OS_VERSION_ID}-${OS_ARCH^^}" \
+                        "MULTIWORKER MAKE TEST SUCCESSFULLY COMPLETED\n"
+            fi
+        else
+            echo "Skip running MULTIWORKER MAKE TEST on ${OS_ID}-${OS_VERSION_ID}"
+        fi
+    else
+        echo "Skip running MULTIWORKER MAKE TEST on ${OS_ID}-${OS_VERSION_ID}"
+    fi
+}
 
-if (git log --oneline | grep 37682e1 > /dev/null 2>&1) && \
-        [ "x${IS_CSIT_VPP_JOB}" != "xTrue" ]
-then
-    echo "Building using \"make verify\""
-    [ "x${DRYRUN}" == "xTrue" ] || make UNATTENDED=yes verify
-else
-    echo "Building using \"make pkg-verify\""
-    [ "x${DRYRUN}" == "xTrue" ] || make UNATTENDED=yes pkg-verify
+if [ "${DRYRUN,,}" != "true" ] ; then
+    make_build_test
 fi
-
-if [ "x${VPP_REPO}" == "x1" ]; then
-    if [ "x${REBASE_NEEDED}" == "x1" ]; then
-        echo "This patch to vpp is based on an old point in the tree that is likely"
-        echo "to fail verify."
-        echo "PLEASE REBASE PATCH ON THE CURRENT HEAD OF THE VPP REPO"
-        exit 1
-    fi
+if [ -n "$BUILD_ERROR" ] ; then
+    BUILD_RESULT="$BUILD_ERROR"
+    RETVAL="1"
 fi
-
-local_arch=$(uname -m)
-
-echo "*******************************************************************"
-echo "* VPP ${local_arch^^} BUILD SUCCESSFULLY COMPLETED"
-echo "*******************************************************************"
+echo -e "\n$line\n* VPP ${OS_ID^^}-${OS_VERSION_ID}-${OS_ARCH^^}" \
+        "BUILD $BUILD_RESULT\n$line\n"
+exit $RETVAL