You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@yetus.apache.org by aw...@apache.org on 2018/12/10 17:14:15 UTC

[2/3] yetus git commit: YETUS-682. add gitlab as a supported bugsystem

YETUS-682. add gitlab as a supported bugsystem

Signed-off-by: Allen Wittenauer <aw...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/yetus/repo
Commit: http://git-wip-us.apache.org/repos/asf/yetus/commit/5246a7ff
Tree: http://git-wip-us.apache.org/repos/asf/yetus/tree/5246a7ff
Diff: http://git-wip-us.apache.org/repos/asf/yetus/diff/5246a7ff

Branch: refs/heads/master
Commit: 5246a7ff882aeee68579bb3018e5b7411f1b2775
Parents: 13487fd
Author: Allen Wittenauer <aw...@apache.org>
Authored: Sun Oct 7 13:52:12 2018 -0700
Committer: Allen Wittenauer <aw...@apache.org>
Committed: Mon Dec 10 09:10:28 2018 -0800

----------------------------------------------------------------------
 precommit/src/main/shell/test-patch.d/gitlab.sh | 445 +++++++++++++++++++
 1 file changed, 445 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/yetus/blob/5246a7ff/precommit/src/main/shell/test-patch.d/gitlab.sh
----------------------------------------------------------------------
diff --git a/precommit/src/main/shell/test-patch.d/gitlab.sh b/precommit/src/main/shell/test-patch.d/gitlab.sh
new file mode 100755
index 0000000..a3301d7
--- /dev/null
+++ b/precommit/src/main/shell/test-patch.d/gitlab.sh
@@ -0,0 +1,445 @@
+#!/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.
+
+# no public APIs here
+# SHELLDOC-IGNORE
+
+# This bug system provides gitlab integration
+add_bugsystem gitlab
+
+# personalities can override the following settings:
+
+# Web interface URL.
+GITLAB_BASE_URL="https://gitlab.com"
+
+# API interface URL.
+GITLAB_API_URL="https://gitlab.com/api/v4"
+
+# user/repo
+GITLAB_REPO=""
+GITLAB_REPO_ENC=""
+
+# user settings
+GITLAB_TOKEN=""
+GITLAB_WRITE_ENABLED=true
+
+# private globals...
+GITLAB_COMMITSHA=""
+GITLAB_ISSUE=""
+
+function gitlab_usage
+{
+  yetus_add_option "--gitlab-url=<url>" "The URL for Gitlab (default: '${GITLAB_BASE_URL}')"
+  yetus_add_option "--gitlab-disable-write" "Disable writing to Gitlab merge requests"
+  yetus_add_option "--gitlab-token=<token>" "Personal access token to access Gitlab"
+  yetus_add_option "--gitlab-repo=<repo>" "Gitlab repo to use (default:'${GITLAB_REPO}')"
+}
+
+function gitlab_parse_args
+{
+  declare i
+
+  for i in "$@"; do
+    case ${i} in
+      --gitlab-disable-write)
+        GITLAB_WRITE_ENABLED=false
+      ;;
+      --gitlab-token=*)
+        GITLAB_TOKEN=${i#*=}
+      ;;
+      --gitlab-repo=*)
+        GITLAB_REPO=${i#*=}
+      ;;
+      --gitlab-url=*)
+        GITLAB_BASE_URL=${i#*=}
+      ;;
+    esac
+  done
+}
+
+function gitlab_initialize
+{
+  # convert the repo into a URL encoded one.  Need this for lots of things.
+  GITLAB_REPO_ENC=${GITLAB_REPO/\//%2F}
+}
+
+## @description given a URL, break it up into gitlab plugin globals
+## @description this will *override* any personality or yetus defaults
+## @param url
+function gitlab_breakup_url
+{
+  declare url=$1
+  declare count
+  declare pos1
+  declare pos2
+
+  count=${url//[^\/]}
+  count=${#count}
+  ((pos2=count-3))
+  ((pos1=pos2))
+
+  GITLAB_BASE_URL=$(echo "${url}" | cut -f1-${pos2} -d/)
+
+  ((pos1=pos1+1))
+  ((pos2=pos1+1))
+
+  GITLAB_REPO=$(echo "${url}" | cut -f${pos1}-${pos2} -d/)
+
+  ((pos1=pos2+2))
+  unset pos2
+
+  GITLAB_ISSUE=$(echo "${url}" | cut -f${pos1}-${pos2} -d/ | cut -f1 -d.)
+}
+
+function gitlab_determine_issue
+{
+  declare input=$1
+
+  if [[ ${input} =~ ^[0-9]+$
+     && -n ${GITLAB_REPO} ]]; then
+    # shellcheck disable=SC2034
+    ISSUE=${input}
+    if [[ -z ${GITLAB_ISSUE} ]]; then
+      GITLAB_ISSUE=${input}
+    fi
+  fi
+
+  if [[ -n ${GITLAB_ISSUE} ]]; then
+    return 0
+  fi
+
+  return 1
+}
+
+## @description  Try to guess the branch being tested using a variety of heuristics
+## @audience     private
+## @stability    evolving
+## @replaceable  no
+## @return       0 on success, with PATCH_BRANCH updated appropriately
+## @return       1 on failure
+function gitlab_determine_branch
+{
+  if [[ ! -f "${PATCH_DIR}/gitlab-merge.json" ]]; then
+    return 1
+  fi
+
+  # shellcheck disable=SC2016
+  PATCH_BRANCH=$("${AWK}" 'match($0,"\"ref\": \""){print $2}' "${PATCH_DIR}/gitlab-merge.json"\
+     | cut -f2 -d\"\
+     | tail -1  )
+
+  yetus_debug "Gitlab determine branch: starting with ${PATCH_BRANCH}"
+
+  verify_valid_branch "${PATCH_BRANCH}"
+}
+
+## @description  Given input = GL:##, download a patch to output.
+## @description  Also sets GITLAB_ISSUE to the raw number.
+## @audience     private
+## @stability    evolving
+## @replaceable  no
+## @param        input
+## @param        output
+## @return       0 on success
+## @return       1 on failure
+function gitlab_locate_mr_patch
+{
+  declare input=$1
+  declare output=$2
+  declare gitlabauth
+
+  input=${input#GL:}
+
+  # https://gitlab.com/your/repo/merge_requests/##
+  if [[ ${input} =~ ^${GITLAB_BASE_URL}.*/merge_requests/[0-9]+$ ]]; then
+    gitlab_breakup_url "${input}.patch"
+    input=${GITLAB_ISSUE}
+  fi
+
+  # https://gitlab.com/your/repo/merge_requests/##.patch
+  if [[ ${input} =~ ^${GITLAB_BASE_URL}.*patch$ ]]; then
+    gitlab_breakup_url "${input}"
+    input=${GITLAB_ISSUE}
+  fi
+
+  # https://gitlab.com/your/repo/merges/##.diff
+  if [[ ${input} =~ ^${GITLAB_BASE_URL}.*diff$ ]]; then
+    gitlab_breakup_url "${input}"
+    input=${GITLAB_ISSUE}
+  fi
+
+  # if it isn't a number at this point, no idea
+  # how to process
+  if [[ ! ${input} =~ ^[0-9]+$ ]]; then
+    yetus_debug "gitlab: ${input} is not a merge request #"
+    return 1
+  fi
+
+  # we always merge the .patch version (even if .diff was given)
+  # with the assumption that this way binary files work.
+  # The downside of this is that the patch files are
+  # significantly larger and therefore take longer to process
+  PATCHURL="${GITLAB_BASE_URL}/${GITLAB_REPO}/merge_requests/${input}.patch"
+  echo "GITLAB MR #${input} is being downloaded at $(date) from"
+  echo "${GITLAB_BASE_URL}/${GITLAB_REPO}/merge_requests/${input}"
+
+  if [[ -n "${GITLAB_TOKEN}" ]]; then
+    gitlabauth="Private-Token: ${GITLAB_TOKEN}"
+  else
+    gitlabauth="X-ignore-me: fake"
+  fi
+
+  # Let's merge the MR JSON for later use
+  "${CURL}" --silent --fail \
+          -H "${gitlabauth}" \
+          --output "${PATCH_DIR}/gitlab-merge.json" \
+          --location \
+         "${GITLAB_API_URL}/${GITLAB_REPO}/merge_requests/${input}.json"
+
+  echo "Patch from GITLAB MR #${input} is being downloaded at $(date) from"
+  echo "${PATCHURL}"
+
+  # the actual patch file
+  if ! "${CURL}" --silent --fail \
+          --output "${output}" \
+          --location \
+          -H "${gitlabauth}" \
+         "${PATCHURL}"; then
+    yetus_debug "gitlab_locate_patch: not a gitlab merge request."
+    return 1
+  fi
+
+  GITLAB_ISSUE=${input}
+
+  # gitlab will translate this to be #(xx) !
+  add_footer_table "GITLAB MR" "${GITLAB_BASE_URL}/${GITLAB_REPO}/merge_requests/${input}"
+
+  return 0
+}
+
+
+## @description  a wrapper for gitlab_locate_pr_patch that
+## @description  that takes a (likely checkout'ed) gitlab commit
+## @description  sha and turns into the the gitlab pr
+## @audience     private
+## @stability    evolving
+## @replaceable  no
+## @param        input
+## @param        output
+## @return       0 on success
+## @return       1 on failure
+function gitlab_locate_sha_patch
+{
+  declare input=$1
+  declare output=$2
+  declare mrid
+  declare gitlabauth
+
+  GITLAB_COMMITSHA=${input#GLSHA:}
+
+  if [[ -n "${GITLAB_TOKEN}" ]]; then
+    gitlabauth="Private-Token: ${GITLAB_TOKEN}"
+  else
+    gitlabauth="X-ignore-me: fake"
+  fi
+
+   # Let's merge the MR JSON for later use
+  if ! "${CURL}" --fail \
+          -H "${gitlabauth}" \
+          --output "${PATCH_DIR}/gitlab-search.json" \
+          --location \
+         "${GITLAB_API_URL}/projects/${GITLAB_REPO_ENC}/repository/commits/${GITLAB_COMMITSHA}/merge_requests"; then
+    cat "${PATCH_DIR}/gitlab-search.json"
+    return 1
+  fi
+
+  # shellcheck disable=SC2016
+  mrid=$(cut -f2 -d, "${PATCH_DIR}/gitlab-search.json")
+  mrid=${mrid/\"iid\":}
+
+  gitlab_locate_mr_patch "GL:${mrid}" "${output}"
+
+}
+
+## @description  Handle the various ways to reference a gitlab MR
+## @audience     private
+## @stability    evolving
+## @replaceable  no
+## @param        input
+## @param        output
+## @return       0 on success
+## @return       1 on failure
+function gitlab_locate_patch
+{
+  declare input=$1
+  declare output=$2
+
+  if [[ "${OFFLINE}" == true ]]; then
+    yetus_debug "gitlab_locate_patch: offline, skipping"
+    return 1
+  fi
+
+  case "${input}" in
+      GL:*)
+        gitlab_locate_mr_patch "${input}" "${output}"
+      ;;
+      GLSHA:*)
+        gitlab_locate_sha_patch "${input}" "${output}"
+      ;;
+  esac
+}
+
+## @description Write the contents of a file to gitlab
+## @param     filename
+## @stability stable
+## @audience  public
+function gitlab_write_comment
+{
+  declare -r commentfile=${1}
+  declare retval=0
+  declare restfile="${PATCH_DIR}/ghcomment.$$"
+  declare gitlabauth
+
+  if [[ "${GITLAB_WRITE_ENABLED}" == "false" ]]; then
+    return 0
+  fi
+
+  if [[ "${OFFLINE}" == true ]]; then
+    echo "Gitlab Plugin: Running in offline, comment skipped."
+    return 0
+  fi
+
+  {
+    printf "{\"body\":\""
+    "${SED}" -e 's,\\,\\\\,g' \
+        -e 's,\",\\\",g' \
+        -e 's,$,\\r\\n,g' "${commentfile}" \
+    | tr -d '\n'
+    echo "\"}"
+  } > "${restfile}"
+
+  if [[ -n "${GITLAB_TOKEN}" ]]; then
+    gitlabauth="Private-Token: ${GITLAB_TOKEN}"
+  else
+    echo "Gitlab Plugin: no credentials provided to write a comment."
+    return 0
+  fi
+
+  "${CURL}" -X POST \
+       -H "Content-Type: application/json" \
+       -H "${gitlabauth}" \
+       -d @"${restfile}" \
+       --silent --location \
+       --output "${PATCH_DIR}/gitlab-comment-out.json" \
+         "${GITLAB_API_URL}/projects/${GITLAB_REPO_ENC}/merge_requests/${GITLAB_ISSUE}/notes" \
+        >/dev/null
+
+  retval=$?
+
+  rm "${restfile}"
+  return ${retval}
+}
+
+## @description  Print out the finished details to the Gitlab MR
+## @audience     private
+## @stability    evolving
+## @replaceable  no
+## @param        runresult
+function gitlab_finalreport
+{
+  declare result=$1
+  declare i
+  declare commentfile=${PATCH_DIR}/gitcommentfile.$$
+  declare comment
+
+  if [[ "${GITLAB_WRITE_ENABLED}" == "false" ]]; then
+    return 0
+  fi
+
+  rm "${commentfile}" 2>/dev/null
+
+  #if [[ ${ROBOT} = "false"
+  #  || -z ${GITLAB_ISSUE} ]] ; then
+  #  return 0
+  #fi
+
+  big_console_header "Adding comment to Gitlab"
+
+  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} -eq ${#TP_HEADER[@]} ]]; do
+    printf "%s\\n\\n" "${TP_HEADER[${i}]}" >> "${commentfile}"
+    ((i=i+1))
+  done
+
+  {
+    printf '\n\n'
+    echo "| Vote | Subsystem | Runtime | Comment |"
+    echo "|:----:|----------:|--------:|:--------|"
+  } >> "${commentfile}"
+
+  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 ' ')
+    comment=$(echo "${ourstring}"  | cut -f5 -d\|)
+
+    if [[ "${vote}" = "H" ]]; then
+      echo "||| _${comment}_ |" >> "${commentfile}"
+    else
+      echo "${TP_VOTE_TABLE[${i}]}" >> "${commentfile}"
+    fi
+    ((i=i+1))
+  done
+
+  if [[ ${#TP_TEST_TABLE[@]} -gt 0 ]]; then
+    {
+      printf '\n\n'
+      echo "| Reason | Tests |"
+      echo "|-------:|:------|"
+    } >> "${commentfile}"
+    i=0
+    until [[ ${i} -eq ${#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 -eq ${#TP_FOOTER_TABLE[@]} ]]; do
+    comment=$(echo "${TP_FOOTER_TABLE[${i}]}" |
+              "${SED}" -e "s,@@BASE@@,${BUILD_URL}${BUILD_URL_ARTIFACTS},g")
+    printf '%s\n' "${comment}" >> "${commentfile}"
+    ((i=i+1))
+  done
+
+  printf '\n\nThis message was automatically generated.\n\n' >> "${commentfile}"
+
+  gitlab_write_comment "${commentfile}"
+}