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 ea9a42d YETUS-994. Add GitHub Status as a report type (#128) ea9a42d is described below commit ea9a42d1d57b2b49abd459d937e436eb9cb5ab71 Author: Allen Wittenauer <a...@apache.org> AuthorDate: Wed Sep 23 07:18:49 2020 -0700 YETUS-994. Add GitHub Status as a report type (#128) --- .github/workflows/yetus.yml | 2 + precommit/src/main/shell/robots.d/circleci.sh | 12 +- precommit/src/main/shell/robots.d/cirrusci.sh | 12 +- precommit/src/main/shell/robots.d/githubactions.sh | 28 +- precommit/src/main/shell/robots.d/jenkins.sh | 7 + precommit/src/main/shell/robots.d/travisci.sh | 4 + precommit/src/main/shell/test-patch.d/github.sh | 381 +++++++++++++++------ 7 files changed, 327 insertions(+), 119 deletions(-) diff --git a/.github/workflows/yetus.yml b/.github/workflows/yetus.yml index 1b76f06..7948808 100644 --- a/.github/workflows/yetus.yml +++ b/.github/workflows/yetus.yml @@ -44,10 +44,12 @@ jobs: --junit-report-xml="${GITHUB_WORKSPACE}/out/junit-report.xml" --linecomments='' --proclimit=2000 + --bugcomments=console,briefreport,github,htmlout,junit --archive-list="checkstyle-errors.xml,spotbugsXml.xml" --plugins=all --tests-filter=checkstyle,javadoc,rubocop,test4tests --docker-cache-from=apache/yetus-base:main + --github-token="${{ secrets.GITHUB_TOKEN }}" - name: Artifact output if: ${{ always() }} uses: actions/upload-artifact@v2 diff --git a/precommit/src/main/shell/robots.d/circleci.sh b/precommit/src/main/shell/robots.d/circleci.sh index 3e74d34..b5b6153 100755 --- a/precommit/src/main/shell/robots.d/circleci.sh +++ b/precommit/src/main/shell/robots.d/circleci.sh @@ -49,15 +49,19 @@ if [[ "${CIRCLECI}" = true ]] && fi add_docker_env \ - CIRCLECI \ CIRCLE_BRANCH \ CIRCLE_BUILD_NUM \ + CIRCLE_PROJECT_REPONAME \ + CIRCLE_PROJECT_USERNAME \ CIRCLE_PULL_REQUEST \ CIRCLE_PULL_REQUESTS \ - CIRCLE_PROJECT_USERNAME \ - CIRCLE_PROJECT_REPONAME \ CIRCLE_REPOSITORY_URL \ - CIRCLE_TOKEN + CIRCLE_SHA1 \ + CIRCLE_TOKEN \ + CIRCLECI + + # shellcheck disable=SC2034 + GITHUB_SHA=${CIRCLE_SHA1} yetus_add_array_element EXEC_MODES Circle_CI fi diff --git a/precommit/src/main/shell/robots.d/cirrusci.sh b/precommit/src/main/shell/robots.d/cirrusci.sh index e1421d2..a5e6aab 100755 --- a/precommit/src/main/shell/robots.d/cirrusci.sh +++ b/precommit/src/main/shell/robots.d/cirrusci.sh @@ -48,14 +48,18 @@ if [[ "${CIRRUS_CI}" == true ]] && add_docker_env \ CI \ + CIRRUS_BASE_SHA \ + CIRRUS_BRANCH \ + CIRRUS_BUILD_ID + CIRRUS_BUILD_ID \ CIRRUS_CI \ CIRRUS_DEFAULT_BRANCH \ - CIRRUS_BUILD_ID \ CIRRUS_PR \ - CIRRUS_BRANCH \ CIRRUS_REPO_FULL_NAME \ - CIRRUS_TASK_ID \ - CIRRUS_BUILD_ID + CIRRUS_TASK_ID + + # shellcheck disable=SC2034 + GITHUB_SHA=${CIRRUS_BASE_SHA} # shellcheck disable=SC2034 BUILD_URL="https://cirrus-ci.com/task/${CIRRUS_TASK_ID}" diff --git a/precommit/src/main/shell/robots.d/githubactions.sh b/precommit/src/main/shell/robots.d/githubactions.sh index f59eb85..f8ef479 100755 --- a/precommit/src/main/shell/robots.d/githubactions.sh +++ b/precommit/src/main/shell/robots.d/githubactions.sh @@ -32,6 +32,15 @@ if [[ "${GITHUB_ACTIONS}" == true ]] && ROBOTTYPE=githubactions # shellcheck disable=SC2034 + BUILD_URL="https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" + + # shellcheck disable=SC2034 + BUILD_URL_CONSOLE=/ + + # shellcheck disable=SC2034 + CONSOLE_USE_BUILD_URL=true + + # shellcheck disable=SC2034 GITHUB_REPO="${GITHUB_REPOSITORY}" if [[ "${GITHUB_EVENT_NAME}" == push ]]; then @@ -51,20 +60,15 @@ if [[ "${GITHUB_ACTIONS}" == true ]] && fi add_docker_env \ - GITHUB_WORKSPACE \ - GITHUB_SHA \ - GITHUB_REPOSITORY \ - GITHUB_RUN_NUMBER \ - GITHUB_REF \ GITHUB_ACTIONS \ + GITHUB_BASE_REF \ GITHUB_EVENT_NAME \ - GITHUB_BASE_REF - - # shellcheck disable=SC2034 - BUILD_URL_CONSOLE=console - - # shellcheck disable=SC2034 - CONSOLE_USE_BUILD_URL=true + GITHUB_REF \ + GITHUB_REPOSITORY \ + GITHUB_RUN_NUMBER \ + GITHUB_SHA \ + GITHUB_TOKEN \ + GITHUB_WORKSPACE if [[ -d ${BASEDIR}/.git ]]; then echo "Updating the local git repo to include all branches/tags:" diff --git a/precommit/src/main/shell/robots.d/jenkins.sh b/precommit/src/main/shell/robots.d/jenkins.sh index 2d52945..813655c 100755 --- a/precommit/src/main/shell/robots.d/jenkins.sh +++ b/precommit/src/main/shell/robots.d/jenkins.sh @@ -99,9 +99,16 @@ if [[ -n "${JENKINS_URL}" && -n "${EXECUTOR_NUMBER}" ]] && EXECUTOR_NUMBER \ ghprbPullId \ ghprbPullLink \ + GIT_COMMIT \ GIT_URL \ JENKINS_URL + # Enable writes to GitHub Statuses + if [[ -z "${GITHUB_SHA}" ]]; then + # shellcheck disable=SC2034 + GITHUB_SHA=${GIT_COMMIT} + fi + yetus_add_array_element EXEC_MODES Jenkins fi diff --git a/precommit/src/main/shell/robots.d/travisci.sh b/precommit/src/main/shell/robots.d/travisci.sh index 7b230b0..7f306fd 100755 --- a/precommit/src/main/shell/robots.d/travisci.sh +++ b/precommit/src/main/shell/robots.d/travisci.sh @@ -46,12 +46,16 @@ if [[ "${TRAVIS}" == true ]] && # shellcheck disable=SC2034 GITHUB_REPO=${TRAVIS_REPO_SLUG} + # shellcheck disable=SC2034 + GITHUB_SHA=${TRAVIS_PULL_REQUEST_SHA} + add_docker_env \ TRAVIS \ TRAVIS_BRANCH \ TRAVIS_BUILD_ID \ TRAVIS_BUILD_WEB_URL \ TRAVIS_PULL_REQUEST \ + TRAVIS_PULL_REQUEST_SHA \ TRAVIS_REPO_SLUG # shellcheck disable=SC2034 diff --git a/precommit/src/main/shell/test-patch.d/github.sh b/precommit/src/main/shell/test-patch.d/github.sh index 95c0ef3..b7a3308 100755 --- a/precommit/src/main/shell/test-patch.d/github.sh +++ b/precommit/src/main/shell/test-patch.d/github.sh @@ -594,6 +594,177 @@ function github_write_comment return ${retval} } +# @description Print out the finished details to the Github PR +# @audience private +# @stability evolving +# @replaceable no +# @param runresult +# function github_finalreport +# { +# declare result=$1 +# declare i +# declare commentfile=${PATCH_DIR}/gitcommentfile.$$ +# declare comment +# declare url +# declare ela +# declare subs +# declare logfile +# declare calctime +# declare vote +# declare emoji + +# rm "${commentfile}" 2>/dev/null + +# if [[ ${ROBOT} = "false" +# || -z ${GITHUB_ISSUE} ]] ; then +# return 0 +# fi + +# url=$(get_artifact_url) + +# big_console_header "Adding comment to Github" + +# if [[ ${result} == 0 ]]; then +# echo ":confetti_ball: **+1 overall**" >> "${commentfile}" +# else +# echo ":broken_heart: **-1 overall**" >> "${commentfile}" +# fi +# printf '\n\n\n\n' >> "${commentfile}" + +# i=0 +# until [[ ${i} -ge ${#TP_HEADER[@]} ]]; do +# printf '%s\n\n' "${TP_HEADER[${i}]}" >> "${commentfile}" +# ((i=i+1)) +# done + +# { +# printf '\n\n' +# echo "| Vote | Subsystem | Runtime | Logfile | Comment |" +# echo "|:----:|----------:|--------:|:--------:|:-------:|" +# } >> "${commentfile}" + +# i=0 +# until [[ ${i} -ge ${#TP_VOTE_TABLE[@]} ]]; do +# ourstring=$(echo "${TP_VOTE_TABLE[${i}]}" | tr -s ' ') +# vote=$(echo "${ourstring}" | cut -f2 -d\| | tr -d ' ') +# subs=$(echo "${ourstring}" | cut -f3 -d\|) +# ela=$(echo "${ourstring}" | cut -f4 -d\|) +# calctime=$(clock_display "${ela}") +# logfile=$(echo "${ourstring}" | cut -f5 -d\| | tr -d ' ') +# comment=$(echo "${ourstring}" | cut -f6 -d\|) + +# if [[ "${vote}" = "H" ]]; then +# echo "|||| _${comment}_ |" >> "${commentfile}" +# ((i=i+1)) +# continue +# fi + +# if [[ ${GITHUB_USE_EMOJI_VOTE} == true ]]; then +# emoji="" +# case ${vote} in +# 1|"+1") +# emoji="+1 :green_heart:" +# ;; +# -1) +# emoji="-1 :x:" +# ;; +# 0) +# emoji="+0 :ok:" +# ;; +# -0) +# emoji="-0 :warning:" +# ;; +# H) +# # this never gets called (see above) but this is here so others know the color is taken +# emoji="" +# ;; +# *) +# # usually this should not happen but let's keep the old vote result if it happens +# emoji=${vote} +# ;; +# esac +# else +# emoji="${vote}" +# fi + +# if [[ -n "${logfile}" ]]; then +# t1=${logfile/@@BASE@@/} +# t2=$(echo "${logfile}" | "${SED}" -e "s,@@BASE@@,${url},g") +# t2="[${t1}](${t2})" +# else +# t2="" +# fi + +# printf '| %s | %s | %s | %s | %s |\n' \ +# "${emoji}" \ +# "${subs}" \ +# "${calctime}" \ +# "${t2}" \ +# "${comment}" \ +# >> "${commentfile}" + +# ((i=i+1)) +# done + +# if [[ ${#TP_TEST_TABLE[@]} -gt 0 ]]; then +# { +# printf '\n\n' +# echo "| Reason | Tests |" +# echo "|-------:|:------|" +# } >> "${commentfile}" +# i=0 +# until [[ ${i} -ge ${#TP_TEST_TABLE[@]} ]]; do +# echo "${TP_TEST_TABLE[${i}]}" >> "${commentfile}" +# ((i=i+1)) +# done +# fi + +# { +# printf '\n\n' +# echo "| Subsystem | Report/Notes |" +# echo "|----------:|:-------------|" +# } >> "${commentfile}" + +# i=0 +# until [[ $i -ge ${#TP_FOOTER_TABLE[@]} ]]; do +# comment=$(echo "${TP_FOOTER_TABLE[${i}]}" | "${SED}" -e "s,@@BASE@@,${url},g") +# printf '%s\n' "${comment}" >> "${commentfile}" +# ((i=i+1)) +# done +# printf '\n\nThis message was automatically generated.\n\n' >> "${commentfile}" + +# github_write_comment "${commentfile}" +# } + +## @description Write a github status +## @audience private +## @stability evolving +## @replaceable no +## @param runresult +function github_status_write() +{ + declare filename=$1 + declare -a githubauth + + if [[ -n "${GITHUB_TOKEN}" ]]; then + githubauth=(-H "Authorization: token ${GITHUB_TOKEN}") + elif [[ -n "${GITHUB_USER}" + && -n "${GITHUB_PASSWD}" ]]; then + githubauth=(-u "${GITHUB_USER}:${GITHUB_PASSWD}") + else + echo "githubstatus-report: no credentials provided to write statuses." + return 0 + fi + + "${CURL}" --silent --fail -X POST \ + -H "Accept: application/vnd.github.v3.full+json" \ + -H "Content-Type: application/json" \ + "${githubauth[@]}" \ + -d @"${filename}" \ + --location \ + "${GITHUB_API_URL}/repos/${GITHUB_REPO}/statuses/${GITHUB_SHA}" +} + ## @description Print out the finished details to the Github PR ## @audience private ## @stability evolving @@ -602,136 +773,148 @@ function github_write_comment function github_finalreport { declare result=$1 - declare i - declare commentfile=${PATCH_DIR}/gitcommentfile.$$ + declare tempfile="${PATCH_DIR}/ghstatus.$$.${RANDOM}" + declare warnings=false + declare foundlogs=false + declare url + declare logurl declare comment declare url - declare ela declare subs declare logfile - declare calctime declare vote - declare emoji + declare ourstring + declare -a githubauth + declare -i i=0 + declare header + + big_console_header "Adding GitHub Statuses" - rm "${commentfile}" 2>/dev/null + if [[ -n "${GITHUB_TOKEN}" ]]; then + githubauth=(-H "Authorization: token ${GITHUB_TOKEN}") + elif [[ -n "${GITHUB_USER}" + && -n "${GITHUB_PASSWD}" ]]; then + githubauth=(-u "${GITHUB_USER}:${GITHUB_PASSWD}") + else + echo "githubstatus-report: no credentials provided to write statuses." + return 0 + fi - if [[ ${ROBOT} = "false" - || -z ${GITHUB_ISSUE} ]] ; then + if [[ -z "${GITHUB_SHA}" ]]; then + echo "Unknown GITHUB_SHA defined. Skipping." return 0 fi url=$(get_artifact_url) - big_console_header "Adding comment to Github" - - if [[ ${result} == 0 ]]; then - echo ":confetti_ball: **+1 overall**" >> "${commentfile}" + if [[ "${ROBOTTYPE}" ]]; then + header="Apache Yetus(${ROBOTTYPE})" else - echo ":broken_heart: **-1 overall**" >> "${commentfile}" + header="Apache Yetus" fi - printf '\n\n\n\n' >> "${commentfile}" - i=0 - until [[ ${i} -ge ${#TP_HEADER[@]} ]]; do - printf '%s\n\n' "${TP_HEADER[${i}]}" >> "${commentfile}" - ((i=i+1)) - done + # Customize the message based upon type of passing: + # - if there were no warnings, then just put a single message + # - if there were warningss, but no logs, then just mention warnings + # - if there were warnings and logs, handle in the next section + if [[ "${result}" == 0 ]]; then + i=0 + until [[ ${i} -eq ${#TP_VOTE_TABLE[@]} ]]; do + ourstring=$(echo "${TP_VOTE_TABLE[${i}]}" | tr -s ' ') + vote=$(echo "${ourstring}" | cut -f2 -d\| | tr -d ' ') + + if [[ "${vote}" == "-0" ]]; then + warnings=true + logfile=$(echo "${ourstring}" | cut -f5 -d\| | tr -d ' ') + + if [[ -n "${logfile}" ]]; then + foundlogs=true + break + fi + fi + ((i=i+1)) + done - { - printf '\n\n' - echo "| Vote | Subsystem | Runtime | Logfile | Comment |" - echo "|:----:|----------:|--------:|:--------:|:-------:|" - } >> "${commentfile}" + # 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 "\"description\": \"passed\"," + echo "\"context\":\"${header}\"}" + } > "${tempfile}" + elif [[ ${warnings} == true ]]; then + # build our REST post + { + echo "{\"state\": \"success\", " + echo "\"target_url\": \"${BUILD_URL}${BUILD_URL_CONSOLE}\"," + echo "\"description\": \"passed with warnings\"," + echo "\"context\":\"${header}\"}" + } > "${tempfile}" + fi + github_status_write "${tempfile}" + rm "${tempfile}" + return 0 + fi + fi + + # from here on, success w/logs or failure. + # give a separate status for each: + # - failure + # - failure w/log + # - successs w/warning log i=0 - until [[ ${i} -ge ${#TP_VOTE_TABLE[@]} ]]; do + until [[ ${i} -eq ${#TP_VOTE_TABLE[@]} ]]; do ourstring=$(echo "${TP_VOTE_TABLE[${i}]}" | tr -s ' ') vote=$(echo "${ourstring}" | cut -f2 -d\| | tr -d ' ') subs=$(echo "${ourstring}" | cut -f3 -d\|) - ela=$(echo "${ourstring}" | cut -f4 -d\|) - calctime=$(clock_display "${ela}") logfile=$(echo "${ourstring}" | cut -f5 -d\| | tr -d ' ') comment=$(echo "${ourstring}" | cut -f6 -d\|) if [[ "${vote}" = "H" ]]; then - echo "|||| _${comment}_ |" >> "${commentfile}" ((i=i+1)) continue fi - if [[ ${GITHUB_USE_EMOJI_VOTE} == true ]]; then - emoji="" - case ${vote} in - 1|"+1") - emoji="+1 :green_heart:" - ;; - -1) - emoji="-1 :x:" - ;; - 0) - emoji="+0 :ok:" - ;; - -0) - emoji="-0 :warning:" - ;; - H) - # this never gets called (see above) but this is here so others know the color is taken - emoji="" - ;; - *) - # usually this should not happen but let's keep the old vote result if it happens - emoji=${vote} - ;; - esac - else - emoji="${vote}" - fi + # GitHub needs more statuses to cover everything yetus does :( + case ${vote} in + -1) + status="error" + ;; + *) + status="success" + ;; + esac - if [[ -n "${logfile}" ]]; then - t1=${logfile/@@BASE@@/} - t2=$(echo "${logfile}" | "${SED}" -e "s,@@BASE@@,${url},g") - t2="[${t1}](${t2})" - else - t2="" + logurl=${BUILD_URL}${BUILD_URL_CONSOLE} + if [[ "${url}" =~ ^http ]]; then + if [[ -n "${logfile}" ]]; then + logurl=$(echo "${logfile}" | "${SED}" -e "s,@@BASE@@,${url},g") + fi fi - printf '| %s | %s | %s | %s | %s |\n' \ - "${emoji}" \ - "${subs}" \ - "${calctime}" \ - "${t2}" \ - "${comment}" \ - >> "${commentfile}" - - ((i=i+1)) - done - - if [[ ${#TP_TEST_TABLE[@]} -gt 0 ]]; then - { - printf '\n\n' - echo "| Reason | Tests |" - echo "|-------:|:------|" - } >> "${commentfile}" - i=0 - until [[ ${i} -ge ${#TP_TEST_TABLE[@]} ]]; do - echo "${TP_TEST_TABLE[${i}]}" >> "${commentfile}" - ((i=i+1)) - done - fi - - { - printf '\n\n' - echo "| Subsystem | Report/Notes |" - echo "|----------:|:-------------|" - } >> "${commentfile}" - - i=0 - until [[ $i -ge ${#TP_FOOTER_TABLE[@]} ]]; do - comment=$(echo "${TP_FOOTER_TABLE[${i}]}" | "${SED}" -e "s,@@BASE@@,${url},g") - printf '%s\n' "${comment}" >> "${commentfile}" + if [[ ${status} == "success" && -n "${logfile}" ]]; then + { + echo "{\"state\": \"${status}\", " + echo "\"target_url\": \"${logurl}\"," + echo "\"description\": \"${comment}\"," + echo "\"context\":\"${header} warning: ${subs}\"}" + } > "${tempfile}" + github_status_write "${tempfile}" + rm "${tempfile}" + elif [[ ${status} == "error" ]]; then + { + echo "{\"state\": \"${status}\", " + echo "\"target_url\": \"${logurl}\"," + echo "\"description\": \"${comment}\"," + echo "\"context\":\"${header} error: ${subs}\"}" + } > "${tempfile}" + github_status_write "${tempfile}" + rm "${tempfile}" + fi ((i=i+1)) done - printf '\n\nThis message was automatically generated.\n\n' >> "${commentfile}" - - github_write_comment "${commentfile}" -} +} \ No newline at end of file