You are viewing a plain text version of this content. The canonical link for it is here.
Posted to gitbox@yetus.apache.org by aw...@apache.org on 2022/04/29 16:23:41 UTC

[yetus] branch main updated: YETUS-1060. github status should use htmlreport (#261)

This is an automated email from the ASF dual-hosted git repository.

aw pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/yetus.git


The following commit(s) were added to refs/heads/main by this push:
     new 03fdf8c3 YETUS-1060. github status should use htmlreport (#261)
03fdf8c3 is described below

commit 03fdf8c32805f1e9e5c5fe2687e04461a4c778b7
Author: Allen Wittenauer <aw...@apache.org>
AuthorDate: Fri Apr 29 09:23:36 2022 -0700

    YETUS-1060. github status should use htmlreport (#261)
---
 .../in-progress/precommit/plugins/github.html.md   |  8 +++
 .../in-progress/precommit/plugins/htmlout.html.md  |  1 +
 precommit/src/main/shell/plugins.d/github.sh       | 45 ++++++++++++--
 precommit/src/main/shell/plugins.d/htmlout.sh      | 68 +++++++++++++++++++---
 precommit/src/main/shell/robots.d/buildkite.sh     |  2 +
 precommit/src/main/shell/robots.d/githubactions.sh |  3 +
 precommit/src/main/shell/robots.d/jenkins.sh       |  1 +
 7 files changed, 115 insertions(+), 13 deletions(-)

diff --git a/asf-site-src/source/documentation/in-progress/precommit/plugins/github.html.md b/asf-site-src/source/documentation/in-progress/precommit/plugins/github.html.md
index 6b97d69c..7599f8a3 100644
--- a/asf-site-src/source/documentation/in-progress/precommit/plugins/github.html.md
+++ b/asf-site-src/source/documentation/in-progress/precommit/plugins/github.html.md
@@ -41,8 +41,16 @@ None
 | `--github-api-url=<url>` | REST API URL (for GitHub Enterprise) |
 | `--github-base-url=<url>` | Non-REST API URL (for GitHub Enterprise) |
 | `--github-repo=<repo>` | `username/repository` identifier |
+| `--github-status-use-htmlreport=<bool>` | Use htmlout for Github Status 'Details' link |
 | `--github-token=<token>` | Token used to perform read and write operations |
 
+## HTML Details LInk
+
+By default, if Apache Yetus is under conditions when it would normally write a Github Status (e.g., Jenkins processing
+a GitHub PR using the Github Multibranch Plug-in), the Details will link to the [htmlout](../htmlout) report rather than
+the robot's console after the run is complete. The report file must either be relative to the normal `--patch-dir` or
+be forcibly set using the `--html-report-url`.
+
 # Docker Notes
 
 None
diff --git a/asf-site-src/source/documentation/in-progress/precommit/plugins/htmlout.html.md b/asf-site-src/source/documentation/in-progress/precommit/plugins/htmlout.html.md
index ce284229..ede214ce 100644
--- a/asf-site-src/source/documentation/in-progress/precommit/plugins/htmlout.html.md
+++ b/asf-site-src/source/documentation/in-progress/precommit/plugins/htmlout.html.md
@@ -39,6 +39,7 @@ None
 | Option | Notes |
 |:---------|:------|
 | `--html-report-file=<file>` | Name of the output file |
+| `--html-report-url=<url>` | Override the default URL for using the HTML report |
 
 # Docker Notes
 
diff --git a/precommit/src/main/shell/plugins.d/github.sh b/precommit/src/main/shell/plugins.d/github.sh
index a3853736..75651154 100755
--- a/precommit/src/main/shell/plugins.d/github.sh
+++ b/precommit/src/main/shell/plugins.d/github.sh
@@ -40,6 +40,7 @@ GITHUB_STATUS_RECOVERY_COUNTER=1
 GITHUB_STATUS_RECOVER_TOOL=false
 GITHUB_WRITE_COMMENT=false
 GITHUB_ANNOTATION_LIMIT=50
+GITHUB_STATUS_USE_HTMLREPORT=${GITHUB_STATUS_USE_HTMLREPORT:-true}
 declare -a GITHUB_AUTH
 
 # private globals...
@@ -54,6 +55,7 @@ function github_usage
   yetus_add_option "--github-token=<token>" "The token to use to read/write to github"
   yetus_add_option "--github-write-comment" "Write final report as github comment (default: '${GITHUB_WRITE_COMMENT}')"
   yetus_add_option "--github-use-emoji-vote" "Whether to use emoji to represent the vote result on github [default: ${GITHUB_USE_EMOJI_VOTE}]"
+  yetus_add_option "--github-status-use-htmlreport=<bool>" "Use htmlout for Github Status 'Details' link [default: ${GITHUB_STATUS_USE_HTMLREPORT}]"
 }
 
 function github_parse_args
@@ -90,6 +92,10 @@ function github_parse_args
         delete_parameter "${i}"
         GITHUB_USE_EMOJI_VOTE=true
       ;;
+      --github-status-use-htmlreport=*)
+        delete_parameter "${i}"
+        GITHUB_STATUS_USE_HTMLREPORT=${i#*=}
+      ;;
     esac
   done
 }
@@ -184,6 +190,8 @@ function github_brute_force_repo_on_remote
 ## @description initialize github
 function github_initialize
 {
+  declare url
+
   if [[ -n "${GITHUB_TOKEN}" ]]; then
     GITHUB_AUTH=(-H "Authorization: token ${GITHUB_TOKEN}") # pragma: allowlist secret
   fi
@@ -208,6 +216,19 @@ function github_initialize
     fi
   fi
 
+  if [[ ${GITHUB_STATUS_USE_HTMLREPORT} == true ]]; then
+    if ! verify_plugin_enabled htmlout; then
+      GITHUB_STATUS_USE_HTMLREPORT=false
+      yetus_error "WARNING: Disabling --github-status-use-htmlreport. htmlout plug-in is not enabled."
+    else
+      url=$(htmlout_reportname)
+      if [[ -z ${url} ]]; then
+        GITHUB_STATUS_USE_HTMLREPORT=false
+        yetus_error "WARNING: Disabling --github-status-use-htmlreport. Artifacts URL does not resolve/report is not relative."
+      fi
+    fi
+  fi
+
   # if the default branch hasn't been set yet, ask GitHub
   if [[ -z "${PATCH_BRANCH_DEFAULT}"  && -n "${GITHUB_REPO}" && "${OFFLINE}" == false ]]; then
     if [[ ! -f "${PATCH_DIR}/github-repo.json" ]]; then
@@ -582,6 +603,7 @@ function github_end_checkrun
   declare tempfile="${PATCH_DIR}/ghcheckrun.$$.${RANDOM}"
   declare output="${PATCH_DIR}/ghcheckrun-final.json"
   declare conclusion
+  declare detailslink
 
   # don't need this under GHA
   if [[ "${ROBOTTYPE}" == 'githubactions' ]]; then
@@ -604,10 +626,18 @@ function github_end_checkrun
 
   finishdate=$(date +"%Y-%m-%dT%H:%M:%SZ")
 
+  # link to the html report if possible
+  if [[ ${GITHUB_STATUS_USE_HTMLREPORT} == true ]]; then
+    detailslink=$(htmlout_reportname)
+  else
+    detailslink="${BUILD_URL}${BUILD_URL_CONSOLE}"
+  fi
+
   {
     printf "{"
     echo "\"conclusion\":\"${conclusion}\","
     echo "\"status\": \"completed\","
+    echo "\"details_url\": \"${detailslink}\","
     echo "\"completed_at\": \"${finishdate}\""
     echo "}"
   } > "${tempfile}"
@@ -1054,6 +1084,7 @@ function github_finalreport
   declare ourstring
   declare -i i=0
   declare header
+  declare detailslink
 
   if [[ "${OFFLINE}" == true ]]; then
     return 0
@@ -1082,8 +1113,6 @@ function github_finalreport
 
   github_end_checkrun "${result}"
 
-  url=$(get_artifact_url)
-
   if [[ "${ROBOTTYPE}" ]]; then
     header="Apache Yetus(${ROBOTTYPE})"
   else
@@ -1112,13 +1141,20 @@ function github_finalreport
       ((i=i+1))
     done
 
+    # link to the html report if possible
+    if [[ ${GITHUB_STATUS_USE_HTMLREPORT} == true ]]; then
+      detailslink=$(htmlout_reportname)
+    else
+      detailslink="${BUILD_URL}${BUILD_URL_CONSOLE}"
+    fi
+
     # did not find any logs, so just give a simple success status
     if [[ ${foundlogs} == false ]]; then
       if [[ ${warnings} == false ]]; then
         # build our REST post
         {
           echo "{\"state\": \"success\", "
-          echo "\"target_url\": \"${BUILD_URL}${BUILD_URL_CONSOLE}\","
+          echo "\"target_url\": \"${detailslink}\","
           echo "\"description\": \"passed\","
           echo "\"context\":\"${header}\"}"
         } > "${tempfile}"
@@ -1126,7 +1162,7 @@ function github_finalreport
         # build our REST post
         {
           echo "{\"state\": \"success\", "
-          echo "\"target_url\": \"${BUILD_URL}${BUILD_URL_CONSOLE}\","
+          echo "\"target_url\": \"${detailslink}\","
           echo "\"description\": \"passed with warnings\","
           echo "\"context\":\"${header}\"}"
         } > "${tempfile}"
@@ -1143,6 +1179,7 @@ function github_finalreport
   # - failure w/log
   # - success w/warning log
 
+  url=$(get_artifact_url)
   i=0
   until [[ ${i} -eq ${#TP_VOTE_TABLE[@]} ]]; do
     ourstring=$(echo "${TP_VOTE_TABLE[${i}]}" | tr -s ' ')
diff --git a/precommit/src/main/shell/plugins.d/htmlout.sh b/precommit/src/main/shell/plugins.d/htmlout.sh
index 7555ccfd..89afbe4b 100755
--- a/precommit/src/main/shell/plugins.d/htmlout.sh
+++ b/precommit/src/main/shell/plugins.d/htmlout.sh
@@ -16,6 +16,8 @@
 
 add_bugsystem htmlout
 
+HTMLOUT_REPORTFILE_URL=""
+
 ## @description  Usage info for htmlout plugin
 ## @audience     private
 ## @stability    evolving
@@ -23,6 +25,7 @@ add_bugsystem htmlout
 function htmlout_usage
 {
   yetus_add_option "--html-report-file=<file>" "Save the final report to an HTML-formated file"
+  yetus_add_option "--html-report-url=<url>" "Override the default URL for using the HTML report"
 }
 
 ## @description  Option parsing for htmlout plugin
@@ -41,6 +44,10 @@ function htmlout_parse_args
         delete_parameter "${i}"
         fn=${i#*=}
       ;;
+      --html-report-url=*)
+        delete_parameter "${i}"
+        HTMLOUT_REPORTFILE_URL=${i#*=}
+      ;;
     esac
   done
 
@@ -52,6 +59,16 @@ function htmlout_parse_args
       yetus_error "WARNING: cannot create HTML report file ${fn}. Ignoring."
     fi
   fi
+
+  if [[ -z "${HTMLOUT_REPORTFILE_URL}" ]]; then
+    filepath=$(yetus_relative_dir "${PATCH_DIR}" "${HTMLOUT_REPORTFILE}")
+    url=$(get_artifact_url)
+
+    if [[ "${filepath}" != "${HTMLOUT_REPORTFILE}" ]]; then
+      HTMLOUT_REPORTFILE_URL="${url}/${filepath}"
+      USER_PARAMS+=("--html-report-url=${HTMLOUT_REPORTFILE_URL}")
+    fi
+  fi
 }
 
 ## @description  Give access to the HTML report file in docker mode
@@ -60,23 +77,26 @@ function htmlout_parse_args
 ## @replaceable  no
 function htmlout_docker_support
 {
+  # if for some reason the report file is in PATCH_DIR, then if
+  # PATCH_DIR gets cleaned out we lose access to the file on the 'outside'
+  # so we put it into the workdir which never gets cleaned.
+
   if [[ -n ${HTMLOUT_REPORTFILE} ]]; then
     DOCKER_EXTRAARGS+=("-v" "${HTMLOUT_REPORTFILE}:${DOCKER_WORK_DIR}/report.htm")
     USER_PARAMS+=("--html-report-file=${DOCKER_WORK_DIR}/report.htm")
   fi
 }
 
-
 ## @description  Write out an HTML version of the final report to a file
 ## @audience     private
 ## @stability    evolving
 ## @replaceable  no
 ## @param        runresult
-function htmlout_finalreport
+function htmlout_report_writer
 {
   declare result=$1
+  declare commentfile=$2
   declare i
-  declare commentfile="${HTMLOUT_REPORTFILE}"
   declare comment
   declare vote
   declare ourstring
@@ -92,12 +112,6 @@ function htmlout_finalreport
 
   rm "${commentfile}" 2>/dev/null
 
-  if [[ -z "${HTMLOUT_REPORTFILE}" ]]; then
-    return
-  fi
-
-  big_console_header "Writing HTML to ${commentfile}"
-
   {
     echo "<table><tbody>"
 
@@ -283,3 +297,39 @@ function htmlout_finalreport
 
   printf "<p>This message was automatically generated.</p>" >> "${commentfile}"
 }
+
+
+## @description  Write out an HTML version of the final report to a file
+## @audience     private
+## @stability    evolving
+## @replaceable  no
+## @param        runresult
+function htmlout_finalreport
+{
+  declare result=$1
+
+  rm "${commentfile}" 2>/dev/null
+
+  if [[ -z "${HTMLOUT_REPORTFILE}" ]]; then
+    return
+  fi
+
+  big_console_header "Writing HTML to ${commentfile}"
+
+  htmlout_report_writer "${result}" "${HTMLOUT_REPORTFILE}"
+}
+
+## @description  Write out an HTML version of the final report to a file
+## @audience     private
+## @stability    evolving
+## @replaceable  no
+## @return       url or empty string
+function htmlout_reportname
+{
+  if [[ -n "${HTMLOUT_REPORTFILE_URL}" ]]; then
+    echo "${HTMLOUT_REPORTFILE_URL}"
+    return
+  fi
+
+  echo ""
+}
diff --git a/precommit/src/main/shell/robots.d/buildkite.sh b/precommit/src/main/shell/robots.d/buildkite.sh
index f52c5155..3edd672f 100755
--- a/precommit/src/main/shell/robots.d/buildkite.sh
+++ b/precommit/src/main/shell/robots.d/buildkite.sh
@@ -34,6 +34,8 @@ if [[ "${BUILDKITE}" == true ]] &&
   ROBOTTYPE=buildkite
   # shellcheck disable=SC2034
   BUILD_URL="${BUILDKITE_BUILD_URL}"
+  # shellcheck disable=SC2034
+  GITHUB_STATUS_USE_HTMLREPORT="false"
 
   # shellcheck disable=SC2034
   if [[ "${BUILDKITE_PULL_REQUEST}" == false ]]; then
diff --git a/precommit/src/main/shell/robots.d/githubactions.sh b/precommit/src/main/shell/robots.d/githubactions.sh
index 970d836a..461cb362 100755
--- a/precommit/src/main/shell/robots.d/githubactions.sh
+++ b/precommit/src/main/shell/robots.d/githubactions.sh
@@ -46,6 +46,9 @@ if [[ "${GITHUB_ACTIONS}" == true ]] &&
   # shellcheck disable=SC2034
   GITHUB_REPO="${GITHUB_REPOSITORY}"
 
+  # shellcheck disable=SC2034
+  GITHUB_STATUS_USE_HTMLREPORT="false"
+
   if [[ "${GITHUB_EVENT_NAME}" == push ]]; then
     # shellcheck disable=SC2034
     PATCH_OR_ISSUE=""
diff --git a/precommit/src/main/shell/robots.d/jenkins.sh b/precommit/src/main/shell/robots.d/jenkins.sh
index 1be0bfb8..ef6b728e 100755
--- a/precommit/src/main/shell/robots.d/jenkins.sh
+++ b/precommit/src/main/shell/robots.d/jenkins.sh
@@ -30,6 +30,7 @@ if [[ -n "${JENKINS_URL}" && -n "${EXECUTOR_NUMBER}" ]] &&
   JENKINS_CUSTOM_HOMEDIR=false
   BUILDMODE=full
   USER_PARAMS+=("--empty-patch")
+  GITHUB_STATUS_USE_HTMLREPORT=true
 
   # if we are running in an Jenkins docker container
   # spawned by using agent, then there is a good chance