You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by nd...@apache.org on 2024/09/25 13:34:18 UTC
(hbase) branch branch-3 updated: HBASE-28642 Hide old PR comments when posting new (#5967)
This is an automated email from the ASF dual-hosted git repository.
ndimiduk pushed a commit to branch branch-3
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-3 by this push:
new 79e37520e49 HBASE-28642 Hide old PR comments when posting new (#5967)
79e37520e49 is described below
commit 79e37520e4932347cdf89c930459b68ef679cf0a
Author: Nick Dimiduk <nd...@apache.org>
AuthorDate: Tue Sep 17 12:50:50 2024 +0200
HBASE-28642 Hide old PR comments when posting new (#5967)
Signed-off-by: Nihal Jain <ni...@apache.org>
Signed-off-by: Peter Somogyi <ps...@apache.org>
---
dev-support/Jenkinsfile_GitHub | 14 ++++
dev-support/gh_hide_old_comments.sh | 149 ++++++++++++++++++++++++++++++++++++
2 files changed, 163 insertions(+)
diff --git a/dev-support/Jenkinsfile_GitHub b/dev-support/Jenkinsfile_GitHub
index 0813168e7f6..c456f2d6d62 100644
--- a/dev-support/Jenkinsfile_GitHub
+++ b/dev-support/Jenkinsfile_GitHub
@@ -92,6 +92,7 @@ pipeline {
DOCKERFILE = "${WORKDIR}/${DOCKERFILE_REL}"
YETUS_DRIVER = "${WORKDIR}/${YETUS_DRIVER_REL}"
ASF_NIGHTLIES_GENERAL_CHECK_BASE="${ASF_NIGHTLIES_BASE}/${WORKDIR_REL}/${PATCH_REL}"
+ HIDE_OLD_COMMENTS = "${SOURCEDIR}/dev-support/gh_hide_old_comments.sh"
}
when {
// this will return true if the pipeline is building a change request, such as a GitHub pull request.
@@ -174,6 +175,19 @@ pipeline {
reportFiles: 'report.html',
reportName: 'PR General Check Report'
]
+ withCredentials([
+ usernamePassword(
+ credentialsId: 'apache-hbase-at-github.com',
+ passwordVariable: 'GITHUB_TOKEN',
+ usernameVariable: 'GITHUB_USER'
+ )
+ ]) {
+ script {
+ sh label: 'Hide Stale PR Comments', script: '''#!/bin/bash -e
+ "${HIDE_OLD_COMMENTS}" "${CHANGE_ID}" || :
+ '''
+ }
+ }
}
// Jenkins pipeline jobs fill slaves on PRs without this :(
cleanup() {
diff --git a/dev-support/gh_hide_old_comments.sh b/dev-support/gh_hide_old_comments.sh
new file mode 100755
index 00000000000..61217cfa241
--- /dev/null
+++ b/dev-support/gh_hide_old_comments.sh
@@ -0,0 +1,149 @@
+#!/usr/bin/env bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+set -eEuo pipefail
+trap 'exit 1' ERR
+
+declare DEBUG
+if [ "${DEBUG}" = 'true' ] ; then
+ set -x
+fi
+
+declare GITHUB_TOKEN
+declare -a GITHUB_AUTH
+GITHUB_AUTH=('--header' "Authorization: token ${GITHUB_TOKEN}")
+declare GITHUB_API_URL="https://api.github.com"
+
+# the user_id of the buildbot that leaves the comments we want to hide.
+declare BUILD_BOT_USER_ID="${BUILD_BOT_USER_ID:-49303554}"
+declare REPO="${REPO:-apache/hbase}"
+declare JOB_NAME="${JOB_NAME:-HBase-PreCommit-GitHub-PR}"
+JOB_NAME="$(echo "${JOB_NAME}" | cut -d/ -f1)"
+declare CURL="${CURL:-curl}"
+
+function fetch_comments {
+ local pr="$1"
+ local comments_file
+ local -a curl_args
+ curl_args=(
+ --fail
+ "${GITHUB_AUTH[@]}"
+ --header 'Accept: application/vnd.github+json'
+ --header 'X-GitHub-Api-Version: 2022-11-28'
+ --request GET
+ --url "${GITHUB_API_URL}/repos/${REPO}/issues/${pr}/comments?per_page=500"
+ )
+ if [ "${DEBUG}" = true ] ; then
+ curl_args+=(--verbose)
+ else
+ curl_args+=(--silent)
+ fi
+
+ comments_file="$(mktemp "comments_${pr}" 2>/dev/null || mktemp -t "comments_${pr}.XXXXXXXXXX")" || \
+ { >&2 echo 'cannot create temp file'; exit 1 ;}
+ "${CURL}" "${curl_args[@]}" > "${comments_file}"
+ if [ "${DEBUG}" = 'true' ] ; then
+ >&2 cat "${comments_file}"
+ fi
+ echo "${comments_file}"
+}
+
+function hide_old_comment {
+ local pr="$1"
+ local comment_id="$2"
+ local -a curl_args
+ local query
+ read -r -d '' query << EOF || :
+mutation {
+ minimizeComment(input: { subjectId: \"$comment_id\", classifier: OUTDATED }) {
+ minimizedComment {
+ isMinimized,
+ minimizedReason
+ }
+ }
+}
+EOF
+ # remove newlines and whitespace rather than escaping them
+ query="${query//[$'\r\n\t ']/}"
+
+ curl_args=(
+ --fail
+ "${GITHUB_AUTH[@]}"
+ --header 'Accept: application/vnd.github+json'
+ --header 'Content-Type: application/json'
+ --header 'X-GitHub-Api-Version: 2022-11-28'
+ --request POST
+ --url "${GITHUB_API_URL}/graphql"
+ )
+ if [ "${DEBUG}" = true ] ; then
+ curl_args+=(--verbose)
+ else
+ curl_args+=(--silent)
+ fi
+
+ "${CURL}" "${curl_args[@]}" --data "{ \"query\": \"${query}\" }"
+}
+
+function identify_most_recent_build_number {
+ local pr="$1"
+ local comments_file="$2"
+ local jq_filter
+ read -r -d '' jq_filter << EOF || :
+.[] \
+| select(.user.id == ${BUILD_BOT_USER_ID}) \
+| .body \
+| capture("${JOB_NAME}/job/PR-${pr}/(?<buildnum>[0-9]+)/") \
+| .buildnum
+EOF
+
+ jq -r "${jq_filter}" "${comments_file}" \
+ | sort -nu \
+ | tail -n1
+}
+
+function identify_old_comment_ids {
+ local pr="$1"
+ local comments_file="$2"
+ local most_recent_build_number="$3"
+ local jq_filter
+ read -r -d '' jq_filter << EOF || :
+.[] \
+| select(.user.id == ${BUILD_BOT_USER_ID}) \
+| { node_id, buildnum: (.body | capture("${JOB_NAME}/job/PR-${pr}/(?<buildnum>[0-9]+)/") | .buildnum | tonumber) } \
+| select(.buildnum < (${most_recent_build_number} | tonumber)) \
+| .node_id
+EOF
+
+ jq -r "${jq_filter}" "${comments_file}"
+}
+
+function main {
+ local pr="$1"
+ local comments_file
+ local most_recent_build_number
+
+ comments_file="$(fetch_comments "$pr")"
+ most_recent_build_number="$(identify_most_recent_build_number "${pr}" "${comments_file}")"
+ for comment_id in $(identify_old_comment_ids "${pr}" "${comments_file}" "${most_recent_build_number}") ; do
+ hide_old_comment "${pr}" "${comment_id}"
+ sleep 1
+ done
+}
+
+main "$@"