Add workaround for broken git repo polling by Jenkins 56/94756/2
authorArtem Naluzhnyy <A.Naluzhnyy@samsung.com>
Mon, 2 Sep 2019 12:27:36 +0000 (14:27 +0200)
committerArtem Naluzhnyy <a.naluzhnyy@samsung.com>
Tue, 3 Sep 2019 09:43:32 +0000 (09:43 +0000)
To save our Jenkins lab resources and Coverity Scan submission quota we
can run the scan if there were recent commits only.

At the moment the following JJB configuration does not work properly for
ONAP repositories:
  triggers:
    - pollscm:
        cron: '@daily'

As a workaround a new job build parameter is introduced -
'max-git-repo-age-hours'. If set to non-zero run the code scan only if
there were no git repository commits last max-git-repo-age-hours hours.
It makes sense to set the value twice the 'cron' interval for the job
(e.g. if 'cron: @daily', then max-git-repo-age-hours=48).

Issue-ID: CIMAN-260
Signed-off-by: Artem Naluzhnyy <A.Naluzhnyy@samsung.com>
Change-Id: I82ce092e9b8bb423e9db8b3958d6cfa3b527b33b

jjb/ci-management/ci-management-coverity.yaml
shell/maven-coverity.sh

index fadea88..6003bf2 100644 (file)
@@ -41,6 +41,7 @@
     coverity-user-email: ''
     coverity-search-paths: ''
     coverity-search-exclude-regexs: ''
+    max-git-repo-age-hours: 0
     stream: master
     submodule-recursive: true
     submodule-timeout: 10
           name: DRY_RUN
           default: '{dry-run}'
           description: Do not submit results to Coverity Scan server at the end of the build.
+      - string:
+          name: 'MAX_GIT_REPO_AGE_HOURS'
+          default: '{max-git-repo-age-hours}'
+          description: >
+            If set to non-zero run the code scan only if there were no git
+            repository commits last MAX_GIT_REPO_AGE_HOURS hours.
+            It makes sense to set the value twice the 'cron' interval for the
+            job (e.g. if 'cron: @daily', then MAX_GIT_REPO_AGE_HOURS=48)
 
     triggers:
       - timed: '{obj:cron}'
index 5db7f33..af5422e 100644 (file)
@@ -22,6 +22,29 @@ echo '---> maven-coverity.sh'
 SUBMISSION_ATTEMPTS=5
 SUBMISSION_INITIAL_REST_INTERVAL=30 # seconds, will be doubled after each attempt
 
+#-----------------------------------------------------------------------------
+# Check for git repo changes within the last $MAX_GIT_REPO_AGE_HOURS hours
+#
+# It makes sense to set the value twice the 'cron' interval for the job (e.g.
+# if 'cron: @daily', then MAX_GIT_REPO_AGE_HOURS=48)
+
+if ! [[ "${MAX_GIT_REPO_AGE_HOURS:=0}" =~ ^[0-9]+$ ]]; then
+  echo '[ERROR] MAX_GIT_REPO_AGE_HOURS must be non-negative integer.' \
+    >&2
+  exit 1
+fi
+
+if [ ${MAX_GIT_REPO_AGE_HOURS:=0} -ne 0 ]; then
+  LAST_COMMIT_AGE=$(( $(date +%s) - $(git log -1 --pretty=format:%ct) ))
+
+  if [ $LAST_COMMIT_AGE -le $(( MAX_GIT_REPO_AGE_HOURS *60*60 )) ]; then
+    echo '[NOTICE] Git repository did not have any commits last' \
+      "${MAX_GIT_REPO_AGE_HOURS} hours - no need to re-analyse it." \
+      >&2
+    exit 0
+  fi
+fi
+
 #-----------------------------------------------------------------------------
 # Process parameters for JS/TS/Python/Ruby/PHP files analysis
 
@@ -30,7 +53,9 @@ if [ -n "${SEARCH_PATHS:=}" ]; then
     if [ -d "${SEARCH_PATH}" ]; then
       FS_CAPTURE_SEARCH_PARAMS="${FS_CAPTURE_SEARCH_PARAMS:=} --fs-capture-search '${SEARCH_PATH}'"
     else
-      echo "'${SEARCH_PATH}' from \$SEARCH_PATHS is not an existing directory." >&2
+      echo "[ERROR] '${SEARCH_PATH}' from \$SEARCH_PATHS is not an" \
+        "existing directory." \
+        >&2
       exit 1
     fi
   done
@@ -69,7 +94,9 @@ if [ "${DRY_RUN}" != 'true' ]; then
     | jq '.upload_permitted'
   )
   if [ x"${IS_COVERITY_UPLOAD_PERMITTED}" != x'true' ]; then
-    echo "Upload quota reached. Next upload permitted at "$(echo "${CURL_OUTPUT}" | jq '.next_upload_permitted_at') >&2
+    echo "[WARNING] Upload quota reached. Next upload permitted at" \
+      $(echo "${CURL_OUTPUT}" | jq '.next_upload_permitted_at') \
+      >&2
     exit 1
   fi
 fi
@@ -220,11 +247,14 @@ if [ "${DRY_RUN}" != 'true' ]; then
 
   HTTP_RESPONSE=$(echo -n "${CURL_OUTPUT}" | head -n -1 | tr -d '\n')
   if [ x"${HTTP_RESPONSE}" != x"Build successfully submitted." ]; then
-    echo "Coverity Scan service responded with '${HTTP_RESPONSE}' while 'Build successfully submitted.' expected." >&2
+    echo "[ERROR] Coverity Scan service responded with '${HTTP_RESPONSE}'" \
+      "while 'Build successfully submitted.' expected." \
+      >&2
     exit 1
   fi
+
+  echo "[INFO] Build successfully submitted to Coverity Scan server." >&2
 fi
 
 #-----------------------------------------------------------------------------
-
 exit 0