[RSGroup] Forward-port HBASE-22658 to master branch and branch-2.x (#1326)
[hbase.git] / dev-support / Jenkinsfile
blob4f8b5c8b14ab68c69fae628db385e71c3d56b6d7
1 // Licensed to the Apache Software Foundation (ASF) under one
2 // or more contributor license agreements.  See the NOTICE file
3 // distributed with this work for additional information
4 // regarding copyright ownership.  The ASF licenses this file
5 // to you under the Apache License, Version 2.0 (the
6 // "License"); you may not use this file except in compliance
7 // with the License.  You may obtain a copy of the License at
8 //
9 //   http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing,
12 // software distributed under the License is distributed on an
13 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 // KIND, either express or implied.  See the License for the
15 // specific language governing permissions and limitations
16 // under the License.
17 pipeline {
18   agent {
19     node {
20       label 'Hadoop'
21     }
22   }
23   triggers {
24     pollSCM('@daily')
25   }
26   options {
27     buildDiscarder(logRotator(numToKeepStr: '15'))
28     timeout (time: 9, unit: 'HOURS')
29     timestamps()
30     skipDefaultCheckout()
31     disableConcurrentBuilds()
32   }
33   environment {
34     YETUS_RELEASE = '0.11.1'
35     // where we'll write everything from different steps. Need a copy here so the final step can check for success/failure.
36     OUTPUT_DIR_RELATIVE_GENERAL = 'output-general'
37     OUTPUT_DIR_RELATIVE_JDK7 = 'output-jdk7'
38     OUTPUT_DIR_RELATIVE_JDK8_HADOOP2 = 'output-jdk8-hadoop2'
39     OUTPUT_DIR_RELATIVE_JDK8_HADOOP3 = 'output-jdk8-hadoop3'
40     OUTPUT_DIR_RELATIVE_JDK11_HADOOP3 = 'output-jdk11-hadoop3'
42     PROJECT = 'hbase'
43     PROJECT_PERSONALITY = 'https://raw.githubusercontent.com/apache/hbase/master/dev-support/hbase-personality.sh'
44     PERSONALITY_FILE = 'tools/personality.sh'
45     // This section of the docs tells folks not to use the javadoc tag. older branches have our old version of the check for said tag.
46     AUTHOR_IGNORE_LIST = 'src/main/asciidoc/_chapters/developer.adoc,dev-support/test-patch.sh'
47     WHITESPACE_IGNORE_LIST = '.*/generated/.*'
48     // output from surefire; sadly the archive function in yetus only works on file names.
49     ARCHIVE_PATTERN_LIST = 'TEST-*.xml,org.apache.h*.txt,*.dumpstream,*.dump'
50     // These tests currently have known failures. Once they burn down to 0, remove from here so that new problems will cause a failure.
51     TESTS_FILTER = 'cc,checkstyle,javac,javadoc,pylint,shellcheck,whitespace,perlcritic,ruby-lint,rubocop,mvnsite'
52     EXCLUDE_TESTS_URL = "${JENKINS_URL}/job/HBase-Find-Flaky-Tests/job/${BRANCH_NAME}/lastSuccessfulBuild/artifact/excludes"
53       // TODO does hadoopcheck need to be jdk specific?
54     SHALLOW_CHECKS = 'all,-shadedjars,-unit' // run by the 'yetus general check'
55     DEEP_CHECKS = 'compile,htmlout,javac,maven,mvninstall,shadedjars,unit' // run by 'yetus jdkX (HadoopY) checks'
56   }
57   parameters {
58     booleanParam(name: 'USE_YETUS_PRERELEASE', defaultValue: false, description: '''Check to use the current HEAD of apache/yetus rather than our configured release.
60     Should only be used manually when e.g. there is some non-work-aroundable issue in yetus we are checking a fix for.''')
61     booleanParam(name: 'DEBUG', defaultValue: false, description: 'Produce a lot more meta-information.')
62   }
63   stages {
64     stage ('scm-checkout') {
65       steps {
66             dir('component') {
67               checkout scm
68             }
69       }
70     }
71     stage ('thirdparty installs') {
72       parallel {
73         stage ('yetus install') {
74           steps {
75             // directory must be unique for each parallel stage, because jenkins runs them in the same workspace :(
76             dir('downloads-yetus') {
77               // can't just do a simple echo or the directory won't be created. :(
78               sh '''#!/usr/bin/env bash
79                 echo "Make sure we have a directory for downloading dependencies: $(pwd)"
80 '''
81             }
82             sh  '''#!/usr/bin/env bash
83               set -e
84               echo "Ensure we have a copy of Apache Yetus."
85               if [[ true !=  "${USE_YETUS_PRERELEASE}" ]]; then
86                 YETUS_DIR="${WORKSPACE}/yetus-${YETUS_RELEASE}"
87                 echo "Checking for Yetus ${YETUS_RELEASE} in '${YETUS_DIR}'"
88                 if ! "${YETUS_DIR}/bin/test-patch" --version >/dev/null 2>&1 ; then
89                   rm -rf "${YETUS_DIR}"
90                   "${WORKSPACE}/component/dev-support/jenkins-scripts/cache-apache-project-artifact.sh" \
91                       --working-dir "${WORKSPACE}/downloads-yetus" \
92                       --keys 'https://www.apache.org/dist/yetus/KEYS' \
93                       "${WORKSPACE}/yetus-${YETUS_RELEASE}-bin.tar.gz" \
94                       "yetus/${YETUS_RELEASE}/apache-yetus-${YETUS_RELEASE}-bin.tar.gz"
95                   mv "yetus-${YETUS_RELEASE}-bin.tar.gz" yetus.tar.gz
96                 else
97                   echo "Reusing cached install of Apache Yetus version ${YETUS_RELEASE}."
98                 fi
99               else
100                 YETUS_DIR="${WORKSPACE}/yetus-git"
101                 rm -rf "${YETUS_DIR}"
102                 echo "downloading from github"
103                 curl -L --fail https://api.github.com/repos/apache/yetus/tarball/HEAD -o yetus.tar.gz
104               fi
105               if [ ! -d "${YETUS_DIR}" ]; then
106                 echo "unpacking yetus into '${YETUS_DIR}'"
107                 mkdir -p "${YETUS_DIR}"
108                 gunzip -c yetus.tar.gz | tar xpf - -C "${YETUS_DIR}" --strip-components 1
109               fi
110             '''
111             // Set up the file we need at PERSONALITY_FILE location
112             dir ("tools") {
113               sh """#!/usr/bin/env bash
114                 set -e
115                 echo "Downloading Project personality from ${env.PROJECT_PERSONALITY}"
116                 curl -L  -o personality.sh "${env.PROJECT_PERSONALITY}"
117               """
118             }
119             stash name: 'yetus', includes: "yetus-*/*,yetus-*/**/*,tools/personality.sh"
120           }
121         }
122         stage ('hadoop 2 cache') {
123           environment {
124             HADOOP2_VERSION="2.8.5"
125           }
126           steps {
127             // directory must be unique for each parallel stage, because jenkins runs them in the same workspace :(
128             dir('downloads-hadoop-2') {
129               sh '''#!/usr/bin/env bash
130                 echo "Make sure we have a directory for downloading dependencies: $(pwd)"
132             }
133             sh '''#!/usr/bin/env bash
134               set -e
135               echo "Ensure we have a copy of Hadoop ${HADOOP2_VERSION}"
136               "${WORKSPACE}/component/dev-support/jenkins-scripts/cache-apache-project-artifact.sh" \
137                   --working-dir "${WORKSPACE}/downloads-hadoop-2" \
138                   --keys 'http://www.apache.org/dist/hadoop/common/KEYS' \
139                   "${WORKSPACE}/hadoop-${HADOOP2_VERSION}-bin.tar.gz" \
140                   "hadoop/common/hadoop-${HADOOP2_VERSION}/hadoop-${HADOOP2_VERSION}.tar.gz"
141               for stale in $(ls -1 "${WORKSPACE}"/hadoop-2*.tar.gz | grep -v ${HADOOP2_VERSION}); do
142                 echo "Delete stale hadoop 2 cache ${stale}"
143                 rm -rf $stale
144               done
145             '''
146             stash name: 'hadoop-2', includes: "hadoop-${HADOOP2_VERSION}-bin.tar.gz"
147           }
148         }
149         stage ('hadoop 3 cache') {
150           environment {
151             HADOOP3_VERSION="3.1.1"
152           }
153           steps {
154             // directory must be unique for each parallel stage, because jenkins runs them in the same workspace :(
155             dir('downloads-hadoop-3') {
156               sh '''#!/usr/bin/env bash
157                 echo "Make sure we have a directory for downloading dependencies: $(pwd)"
159             }
160             sh '''#!/usr/bin/env bash
161               set -e
162               echo "Ensure we have a copy of Hadoop ${HADOOP3_VERSION}"
163               "${WORKSPACE}/component/dev-support/jenkins-scripts/cache-apache-project-artifact.sh" \
164                   --working-dir "${WORKSPACE}/downloads-hadoop-3" \
165                   --keys 'http://www.apache.org/dist/hadoop/common/KEYS' \
166                   "${WORKSPACE}/hadoop-${HADOOP3_VERSION}-bin.tar.gz" \
167                   "hadoop/common/hadoop-${HADOOP3_VERSION}/hadoop-${HADOOP3_VERSION}.tar.gz"
168               for stale in $(ls -1 "${WORKSPACE}"/hadoop-3*.tar.gz | grep -v ${HADOOP3_VERSION}); do
169                 echo "Delete stale hadoop 3 cache ${stale}"
170                 rm -rf $stale
171               done
172             '''
173             stash name: 'hadoop-3', includes: "hadoop-${HADOOP3_VERSION}-bin.tar.gz"
174           }
175         }
176       }
177     }
178     stage ('init health results') {
179       steps {
180         // stash with given name for all tests we might run, so that we can unstash all of them even if
181         // we skip some due to e.g. branch-specific JDK or Hadoop support
182         stash name: 'general-result', allowEmpty: true, includes: "${OUTPUT_DIR_RELATIVE_GENERAL}/doesn't-match"
183         stash name: 'jdk7-result', allowEmpty: true, includes: "${OUTPUT_DIR_RELATIVE_JDK7}/doesn't-match"
184         stash name: 'jdk8-hadoop2-result', allowEmpty: true, includes: "${OUTPUT_DIR_RELATIVE_JDK8_HADOOP2}/doesn't-match"
185         stash name: 'jdk8-hadoop3-result', allowEmpty: true, includes: "${OUTPUT_DIR_RELATIVE_JDK8_HADOOP3}/doesn't-match"
186         stash name: 'jdk11-hadoop3-result', allowEmpty: true, includes: "${OUTPUT_DIR_RELATIVE_JDK11_HADOOP3}/doesn't-match"
187         stash name: 'srctarball-result', allowEmpty: true, includes: "output-srctarball/doesn't-match"
188       }
189     }
190     stage ('health checks') {
191       parallel {
192         stage ('yetus general check') {
193           agent {
194             node {
195               label 'Hadoop'
196             }
197           }
198           environment {
199             BASEDIR = "${env.WORKSPACE}/component"
200             TESTS = "${env.SHALLOW_CHECKS}"
201             SET_JAVA_HOME = '/usr/lib/jvm/java-8'
202             OUTPUT_DIR_RELATIVE = "${env.OUTPUT_DIR_RELATIVE_GENERAL}"
203             OUTPUT_DIR = "${env.WORKSPACE}/${env.OUTPUT_DIR_RELATIVE_GENERAL}"
204           }
205           steps {
206             // Must do prior to anything else, since if one of them timesout we'll stash the commentfile
207             sh '''#!/usr/bin/env bash
208               set -e
209               rm -rf "${OUTPUT_DIR}" && mkdir "${OUTPUT_DIR}"
210               echo '(x) {color:red}-1 general checks{color}' >"${OUTPUT_DIR}/commentfile"
211               echo "-- Something went wrong running this stage, please [check relevant console output|${BUILD_URL}/console]." >> "${OUTPUT_DIR}/commentfile"
213             unstash 'yetus'
214             // since we have a new node definition we need to re-do the scm checkout
215             dir('component') {
216               checkout scm
217             }
218             sh '''#!/usr/bin/env bash
219               set -e
220               rm -rf "${OUTPUT_DIR}/machine" && mkdir "${OUTPUT_DIR}/machine"
221               "${BASEDIR}/dev-support/gather_machine_environment.sh" "${OUTPUT_DIR_RELATIVE}/machine"
222               echo "got the following saved stats in '${OUTPUT_DIR_RELATIVE}/machine'"
223               ls -lh "${OUTPUT_DIR_RELATIVE}/machine"
225             // TODO roll this into the hbase_nightly_yetus script
226             sh '''#!/usr/bin/env bash
227               set -e
228               declare -i status=0
229               if "${BASEDIR}/dev-support/hbase_nightly_yetus.sh" ; then
230                 echo '(/) {color:green}+1 general checks{color}' > "${OUTPUT_DIR}/commentfile"
231               else
232                 echo '(x) {color:red}-1 general checks{color}' > "${OUTPUT_DIR}/commentfile"
233                 status=1
234               fi
235               echo "-- For more information [see general report|${BUILD_URL}/General_Nightly_Build_Report/]" >> "${OUTPUT_DIR}/commentfile"
236               exit "${status}"
237             '''
238           }
239           post {
240             always {
241               stash name: 'general-result', includes: "${OUTPUT_DIR_RELATIVE}/commentfile"
242               // Has to be relative to WORKSPACE.
243               archiveArtifacts artifacts: "${env.OUTPUT_DIR_RELATIVE}/*"
244               archiveArtifacts artifacts: "${env.OUTPUT_DIR_RELATIVE}/**/*"
245               publishHTML target: [
246                 allowMissing: true,
247                 keepAll: true,
248                 alwaysLinkToLastBuild: true,
249                 // Has to be relative to WORKSPACE
250                 reportDir: "${env.OUTPUT_DIR_RELATIVE}",
251                 reportFiles: 'console-report.html',
252                 reportName: 'General Nightly Build Report'
253               ]
254             }
255           }
256         }
257         stage ('yetus jdk7 checks') {
258           agent {
259             node {
260               label 'Hadoop'
261             }
262           }
263           when {
264             branch 'branch-1*'
265           }
266           environment {
267             BASEDIR = "${env.WORKSPACE}/component"
268             TESTS = "${env.DEEP_CHECKS}"
269             OUTPUT_DIR_RELATIVE = "${env.OUTPUT_DIR_RELATIVE_JDK7}"
270             OUTPUT_DIR = "${env.WORKSPACE}/${env.OUTPUT_DIR_RELATIVE_JDK7}"
271             SET_JAVA_HOME = "/usr/lib/jvm/java-7"
272           }
273           steps {
274             // Must do prior to anything else, since if one of them timesout we'll stash the commentfile
275             sh '''#!/usr/bin/env bash
276               set -e
277               rm -rf "${OUTPUT_DIR}" && mkdir "${OUTPUT_DIR}"
278               echo '(x) {color:red}-1 jdk7 checks{color}' >"${OUTPUT_DIR}/commentfile"
279               echo "-- Something went wrong running this stage, please [check relevant console output|${BUILD_URL}/console]." >> "${OUTPUT_DIR}/commentfile"
281             unstash 'yetus'
282             dir('component') {
283               checkout scm
284             }
285             sh '''#!/usr/bin/env bash
286               set -e
287               rm -rf "${OUTPUT_DIR}/machine" && mkdir "${OUTPUT_DIR}/machine"
288               "${BASEDIR}/dev-support/gather_machine_environment.sh" "${OUTPUT_DIR_RELATIVE}/machine"
289               echo "got the following saved stats in '${OUTPUT_DIR_RELATIVE}/machine'"
290               ls -lh "${OUTPUT_DIR_RELATIVE}/machine"
292             sh '''#!/usr/bin/env bash
293               set -e
294               declare -i status=0
295               if "${BASEDIR}/dev-support/hbase_nightly_yetus.sh" ; then
296                 echo '(/) {color:green}+1 jdk7 checks{color}' > "${OUTPUT_DIR}/commentfile"
297               else
298                 echo '(x) {color:red}-1 jdk7 checks{color}' > "${OUTPUT_DIR}/commentfile"
299                 status=1
300               fi
301               echo "-- For more information [see jdk7 report|${BUILD_URL}/JDK7_Nightly_Build_Report/]" >> "${OUTPUT_DIR}/commentfile"
302               exit "${status}"
303             '''
304           }
305           post {
306             always {
307               stash name: 'jdk7-result', includes: "${OUTPUT_DIR_RELATIVE}/commentfile"
308               junit testResults: "${env.OUTPUT_DIR_RELATIVE}/**/target/**/TEST-*.xml", allowEmptyResults: true
309               // zip surefire reports.
310               sh '''#!/bin/bash -e
311                 if [ -d "${OUTPUT_DIR}/archiver" ]; then
312                   count=$(find "${OUTPUT_DIR}/archiver" -type f | wc -l)
313                   if [[ 0 -ne ${count} ]]; then
314                     echo "zipping ${count} archived files"
315                     zip -q -m -r "${OUTPUT_DIR}/test_logs.zip" "${OUTPUT_DIR}/archiver"
316                   else
317                     echo "No archived files, skipping compressing."
318                   fi
319                 else
320                   echo "No archiver directory, skipping compressing."
321                 fi
323               // Has to be relative to WORKSPACE.
324               archiveArtifacts artifacts: "${env.OUTPUT_DIR_RELATIVE}/*"
325               archiveArtifacts artifacts: "${env.OUTPUT_DIR_RELATIVE}/**/*"
326               publishHTML target: [
327                 allowMissing         : true,
328                 keepAll              : true,
329                 alwaysLinkToLastBuild: true,
330                 // Has to be relative to WORKSPACE.
331                 reportDir            : "${env.OUTPUT_DIR_RELATIVE}",
332                 reportFiles          : 'console-report.html',
333                 reportName           : 'JDK7 Nightly Build Report'
334               ]
335             }
336           }
337         }
338         stage ('yetus jdk8 hadoop2 checks') {
339           agent {
340             node {
341               label 'Hadoop'
342             }
343           }
344           environment {
345             BASEDIR = "${env.WORKSPACE}/component"
346             TESTS = "${env.DEEP_CHECKS}"
347             OUTPUT_DIR_RELATIVE = "${env.OUTPUT_DIR_RELATIVE_JDK8_HADOOP2}"
348             OUTPUT_DIR = "${env.WORKSPACE}/${env.OUTPUT_DIR_RELATIVE_JDK8_HADOOP2}"
349             SET_JAVA_HOME = '/usr/lib/jvm/java-8'
350           }
351           steps {
352             // Must do prior to anything else, since if one of them timesout we'll stash the commentfile
353             sh '''#!/usr/bin/env bash
354               set -e
355               rm -rf "${OUTPUT_DIR}" && mkdir "${OUTPUT_DIR}"
356               echo '(x) {color:red}-1 jdk8 hadoop2 checks{color}' >"${OUTPUT_DIR}/commentfile"
357               echo "-- Something went wrong running this stage, please [check relevant console output|${BUILD_URL}/console]." >> "${OUTPUT_DIR}/commentfile"
359             unstash 'yetus'
360             dir('component') {
361               checkout scm
362             }
363             sh '''#!/usr/bin/env bash
364               set -e
365               rm -rf "${OUTPUT_DIR}/machine" && mkdir "${OUTPUT_DIR}/machine"
366               "${BASEDIR}/dev-support/gather_machine_environment.sh" "${OUTPUT_DIR_RELATIVE}/machine"
367               echo "got the following saved stats in '${OUTPUT_DIR_RELATIVE}/machine'"
368               ls -lh "${OUTPUT_DIR_RELATIVE}/machine"
370             sh '''#!/usr/bin/env bash
371               set -e
372               declare -i status=0
373               if "${BASEDIR}/dev-support/hbase_nightly_yetus.sh" ; then
374                 echo '(/) {color:green}+1 jdk8 hadoop2 checks{color}' > "${OUTPUT_DIR}/commentfile"
375               else
376                 echo '(x) {color:red}-1 jdk8 hadoop2 checks{color}' > "${OUTPUT_DIR}/commentfile"
377                 status=1
378               fi
379               echo "-- For more information [see jdk8 (hadoop2) report|${BUILD_URL}/JDK8_Nightly_Build_Report_(Hadoop2)/]" >> "${OUTPUT_DIR}/commentfile"
380               exit "${status}"
381             '''
382           }
383           post {
384             always {
385               stash name: 'jdk8-hadoop2-result', includes: "${OUTPUT_DIR_RELATIVE}/commentfile"
386               junit testResults: "${env.OUTPUT_DIR_RELATIVE}/**/target/**/TEST-*.xml", allowEmptyResults: true
387               // zip surefire reports.
388               sh '''#!/bin/bash -e
389                 if [ -d "${OUTPUT_DIR}/archiver" ]; then
390                   count=$(find "${OUTPUT_DIR}/archiver" -type f | wc -l)
391                   if [[ 0 -ne ${count} ]]; then
392                     echo "zipping ${count} archived files"
393                     zip -q -m -r "${OUTPUT_DIR}/test_logs.zip" "${OUTPUT_DIR}/archiver"
394                   else
395                     echo "No archived files, skipping compressing."
396                   fi
397                 else
398                   echo "No archiver directory, skipping compressing."
399                 fi
401               // Has to be relative to WORKSPACE.
402               archiveArtifacts artifacts: "${env.OUTPUT_DIR_RELATIVE}/*"
403               archiveArtifacts artifacts: "${env.OUTPUT_DIR_RELATIVE}/**/*"
404               publishHTML target: [
405                 allowMissing         : true,
406                 keepAll              : true,
407                 alwaysLinkToLastBuild: true,
408                 // Has to be relative to WORKSPACE.
409                 reportDir            : "${env.OUTPUT_DIR_RELATIVE}",
410                 reportFiles          : 'console-report.html',
411                 reportName           : 'JDK8 Nightly Build Report (Hadoop2)'
412               ]
413             }
414           }
415         }
416         stage ('yetus jdk8 hadoop3 checks') {
417           agent {
418             node {
419               label 'Hadoop'
420             }
421           }
422           when {
423             not {
424               branch 'branch-1*'
425             }
426           }
427           environment {
428             BASEDIR = "${env.WORKSPACE}/component"
429             TESTS = "${env.DEEP_CHECKS}"
430             OUTPUT_DIR_RELATIVE = "${env.OUTPUT_DIR_RELATIVE_JDK8_HADOOP3}"
431             OUTPUT_DIR = "${env.WORKSPACE}/${env.OUTPUT_DIR_RELATIVE_JDK8_HADOOP3}"
432             SET_JAVA_HOME = '/usr/lib/jvm/java-8'
433             // Activates hadoop 3.0 profile in maven runs.
434             HADOOP_PROFILE = '3.0'
435           }
436           steps {
437             // Must do prior to anything else, since if one of them timesout we'll stash the commentfile
438             sh '''#!/usr/bin/env bash
439               set -e
440               rm -rf "${OUTPUT_DIR}" && mkdir "${OUTPUT_DIR}"
441               echo '(x) {color:red}-1 jdk8 hadoop3 checks{color}' >"${OUTPUT_DIR}/commentfile"
442               echo "-- Something went wrong running this stage, please [check relevant console output|${BUILD_URL}/console]." >> "${OUTPUT_DIR}/commentfile"
444             unstash 'yetus'
445             dir('component') {
446               checkout scm
447             }
448             sh '''#!/usr/bin/env bash
449               set -e
450               rm -rf "${OUTPUT_DIR}/machine" && mkdir "${OUTPUT_DIR}/machine"
451               "${BASEDIR}/dev-support/gather_machine_environment.sh" "${OUTPUT_DIR_RELATIVE}/machine"
452               echo "got the following saved stats in '${OUTPUT_DIR_RELATIVE}/machine'"
453               ls -lh "${OUTPUT_DIR_RELATIVE}/machine"
455             sh '''#!/usr/bin/env bash
456               set -e
457               declare -i status=0
458               if "${BASEDIR}/dev-support/hbase_nightly_yetus.sh" ; then
459                 echo '(/) {color:green}+1 jdk8 hadoop3 checks{color}' > "${OUTPUT_DIR}/commentfile"
460               else
461                 echo '(x) {color:red}-1 jdk8 hadoop3 checks{color}' > "${OUTPUT_DIR}/commentfile"
462                 status=1
463               fi
464               echo "-- For more information [see jdk8 (hadoop3) report|${BUILD_URL}/JDK8_Nightly_Build_Report_(Hadoop3)/]" >> "${OUTPUT_DIR}/commentfile"
465               exit "${status}"
466             '''
467           }
468           post {
469             always {
470               stash name: 'jdk8-hadoop3-result', includes: "${OUTPUT_DIR_RELATIVE}/commentfile"
471               junit testResults: "${env.OUTPUT_DIR_RELATIVE}/**/target/**/TEST-*.xml", allowEmptyResults: true
472               // zip surefire reports.
473               sh '''#!/bin/bash -e
474                 if [ -d "${OUTPUT_DIR}/archiver" ]; then
475                   count=$(find "${OUTPUT_DIR}/archiver" -type f | wc -l)
476                   if [[ 0 -ne ${count} ]]; then
477                     echo "zipping ${count} archived files"
478                     zip -q -m -r "${OUTPUT_DIR}/test_logs.zip" "${OUTPUT_DIR}/archiver"
479                   else
480                     echo "No archived files, skipping compressing."
481                   fi
482                 else
483                   echo "No archiver directory, skipping compressing."
484                 fi
486               // Has to be relative to WORKSPACE.
487               archiveArtifacts artifacts: "${env.OUTPUT_DIR_RELATIVE}/*"
488               archiveArtifacts artifacts: "${env.OUTPUT_DIR_RELATIVE}/**/*"
489               publishHTML target: [
490                 allowMissing         : true,
491                 keepAll              : true,
492                 alwaysLinkToLastBuild: true,
493                 // Has to be relative to WORKSPACE.
494                 reportDir            : "${env.OUTPUT_DIR_RELATIVE}",
495                 reportFiles          : 'console-report.html',
496                 reportName           : 'JDK8 Nightly Build Report (Hadoop3)'
497               ]
498             }
499           }
500         }
501         stage ('yetus jdk11 hadoop3 checks') {
502           agent {
503             node {
504               label 'Hadoop'
505             }
506           }
507           when {
508             not {
509               branch 'branch-1*'
510             }
511           }
512           environment {
513             BASEDIR = "${env.WORKSPACE}/component"
514             TESTS = "${env.DEEP_CHECKS}"
515             OUTPUT_DIR_RELATIVE = "${env.OUTPUT_DIR_RELATIVE_JDK11_HADOOP3}"
516             OUTPUT_DIR = "${env.WORKSPACE}/${env.OUTPUT_DIR_RELATIVE_JDK11_HADOOP3}"
517             SET_JAVA_HOME = "/usr/lib/jvm/java-11"
518             // Activates hadoop 3.0 profile in maven runs.
519             HADOOP_PROFILE = '3.0'
520             // ErrorProne is broken on JDK11, see HBASE-23894
521             SKIP_ERROR_PRONE = 'true'
522             // vote -0 on JDK11 unit failures until HBASE-22972
523             TESTS_FILTER = "${TESTS_FILTER},unit"
524           }
525           steps {
526             // Must do prior to anything else, since if one of them timesout we'll stash the commentfile
527             sh '''#!/usr/bin/env bash
528               set -e
529               rm -rf "${OUTPUT_DIR}" && mkdir "${OUTPUT_DIR}"
530               echo '(x) {color:red}-1 jdk11 hadoop3 checks{color}' >"${OUTPUT_DIR}/commentfile"
531               echo "-- Something went wrong running this stage, please [check relevant console output|${BUILD_URL}/console]." >> "${OUTPUT_DIR}/commentfile"
533             unstash 'yetus'
534             dir('component') {
535               checkout scm
536             }
537             sh '''#!/usr/bin/env bash
538               set -e
539               rm -rf "${OUTPUT_DIR}/machine" && mkdir "${OUTPUT_DIR}/machine"
540               "${BASEDIR}/dev-support/gather_machine_environment.sh" "${OUTPUT_DIR_RELATIVE}/machine"
541               echo "got the following saved stats in '${OUTPUT_DIR_RELATIVE}/machine'"
542               ls -lh "${OUTPUT_DIR_RELATIVE}/machine"
544             sh '''#!/usr/bin/env bash
545               set -e
546               declare -i status=0
547               if "${BASEDIR}/dev-support/hbase_nightly_yetus.sh" ; then
548                 echo '(/) {color:green}+1 jdk11 hadoop3 checks{color}' > "${OUTPUT_DIR}/commentfile"
549               else
550                 echo '(x) {color:red}-1 jdk11 hadoop3 checks{color}' > "${OUTPUT_DIR}/commentfile"
551                 status=1
552               fi
553               echo "-- For more information [see jdk11 report|${BUILD_URL}/JDK11_Nightly_Build_Report/]" >> "${OUTPUT_DIR}/commentfile"
554               exit "${status}"
555             '''
556           }
557           post {
558             always {
559               stash name: 'jdk11-hadoop3-result', includes: "${OUTPUT_DIR_RELATIVE}/commentfile"
560               junit testResults: "${env.OUTPUT_DIR_RELATIVE}/**/target/**/TEST-*.xml", allowEmptyResults: true
561               // zip surefire reports.
562               sh '''#!/bin/bash -e
563                 if [ -d "${OUTPUT_DIR}/archiver" ]; then
564                   count=$(find "${OUTPUT_DIR}/archiver" -type f | wc -l)
565                   if [[ 0 -ne ${count} ]]; then
566                     echo "zipping ${count} archived files"
567                     zip -q -m -r "${OUTPUT_DIR}/test_logs.zip" "${OUTPUT_DIR}/archiver"
568                   else
569                     echo "No archived files, skipping compressing."
570                   fi
571                 else
572                   echo "No archiver directory, skipping compressing."
573                 fi
575               // Has to be relative to WORKSPACE.
576               archiveArtifacts artifacts: "${env.OUTPUT_DIR_RELATIVE}/*"
577               archiveArtifacts artifacts: "${env.OUTPUT_DIR_RELATIVE}/**/*"
578               publishHTML target: [
579                 allowMissing         : true,
580                 keepAll              : true,
581                 alwaysLinkToLastBuild: true,
582                 // Has to be relative to WORKSPACE.
583                 reportDir            : "${env.OUTPUT_DIR_RELATIVE}",
584                 reportFiles          : 'console-report.html',
585                 reportName           : 'JDK11 Nightly Build Report (Hadoop3)'
586               ]
587             }
588           }
589         }
590         // This is meant to mimic what a release manager will do to create RCs.
591         // See http://hbase.apache.org/book.html#maven.release
592         // TODO (HBASE-23870): replace this with invocation of the release tool
593         stage ('packaging and integration') {
594           tools {
595             maven 'Maven (latest)'
596             // this needs to be set to the jdk that ought to be used to build releases on the branch the Jenkinsfile is stored in.
597             jdk "JDK 1.8 (latest)"
598           }
599           environment {
600             BASEDIR = "${env.WORKSPACE}/component"
601           }
602           steps {
603             sh '''#!/bin/bash -e
604               echo "Setting up directories"
605               rm -rf "output-srctarball" && mkdir "output-srctarball"
606               rm -rf "output-integration" && mkdir "output-integration" "output-integration/hadoop-2" "output-integration/hadoop-3" "output-integration/hadoop-3-shaded"
607               rm -rf "unpacked_src_tarball" && mkdir "unpacked_src_tarball"
608               rm -rf "hbase-install" && mkdir "hbase-install"
609               rm -rf "hbase-client" && mkdir "hbase-client"
610               rm -rf "hadoop-2" && mkdir "hadoop-2"
611               rm -rf "hadoop-3" && mkdir "hadoop-3"
612               rm -rf ".m2-for-repo" && mkdir ".m2-for-repo"
613               rm -rf ".m2-for-src" && mkdir ".m2-for-src"
614               echo "(x) {color:red}-1 source release artifact{color}\n-- Something went wrong with this stage, [check relevant console output|${BUILD_URL}/console]." >output-srctarball/commentfile
615               echo "(x) {color:red}-1 client integration test{color}\n-- Something went wrong with this stage, [check relevant console output|${BUILD_URL}/console]." >output-integration/commentfile
617             sh '''#!/usr/bin/env bash
618               set -e
619               rm -rf "output-srctarball/machine" && mkdir "output-srctarball/machine"
620               "${BASEDIR}/dev-support/gather_machine_environment.sh" "output-srctarball/machine"
621               echo "got the following saved stats in 'output-srctarball/machine'"
622               ls -lh "output-srctarball/machine"
624             sh """#!/bin/bash -e
625               echo "Checking the steps for an RM to make a source artifact, then a binary artifact."
626               if "${env.BASEDIR}/dev-support/hbase_nightly_source-artifact.sh" \
627                   --intermediate-file-dir output-srctarball \
628                   --unpack-temp-dir unpacked_src_tarball \
629                   --maven-m2-initial .m2-for-repo \
630                   --maven-m2-src-build .m2-for-src \
631                   --clean-source-checkout \
632                   "${env.BASEDIR}" ; then
633                 echo '(/) {color:green}+1 source release artifact{color}\n-- See build output for details.' >output-srctarball/commentfile
634               else
635                 echo '(x) {color:red}-1 source release artifact{color}\n-- See build output for details.' >output-srctarball/commentfile
636                 exit 1
637               fi
639             echo "unpacking the hbase bin tarball into 'hbase-install' and the client tarball into 'hbase-client'"
640             sh '''#!/bin/bash -e
641               if [ 2 -ne $(ls -1 "${WORKSPACE}"/unpacked_src_tarball/hbase-assembly/target/hbase-*-bin.tar.gz | wc -l) ]; then
642                 echo '(x) {color:red}-1 testing binary artifact{color}\n-- source tarball did not produce the expected binaries.' >>output-srctarball/commentfile
643                 exit 1
644               fi
645               install_artifact=$(ls -1 "${WORKSPACE}"/unpacked_src_tarball/hbase-assembly/target/hbase-*-bin.tar.gz | sort | head -n 1)
646               tar --strip-component=1 -xzf "${install_artifact}" -C "hbase-install"
647               client_artifact=$(ls -1 "${WORKSPACE}"/unpacked_src_tarball/hbase-assembly/target/hbase-*-bin.tar.gz | sort | tail -n 1)
648               tar --strip-component=1 -xzf "${client_artifact}" -C "hbase-client"
650             unstash 'hadoop-2'
651             echo "Attempting to use run an instance on top of Hadoop 2."
652             sh '''#!/bin/bash -xe
653               artifact=$(ls -1 "${WORKSPACE}"/hadoop-2*.tar.gz | head -n 1)
654               tar --strip-components=1 -xzf "${artifact}" -C "hadoop-2"
655               if ! "${BASEDIR}/dev-support/hbase_nightly_pseudo-distributed-test.sh" \
656                   --single-process \
657                   --working-dir output-integration/hadoop-2 \
658                   --hbase-client-install "hbase-client" \
659                   "hbase-install" \
660                   "hadoop-2/bin/hadoop" \
661                   hadoop-2/share/hadoop/yarn/test/hadoop-yarn-server-tests-*-tests.jar \
662                   hadoop-2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-*-tests.jar \
663                   hadoop-2/bin/mapred \
664                   >output-integration/hadoop-2.log 2>&1 ; then
665                 echo "(x) {color:red}-1 client integration test{color}\n--Failed when running client tests on top of Hadoop 2. [see log for details|${BUILD_URL}/artifact/output-integration/hadoop-2.log]. (note that this means we didn't run on Hadoop 3)" >output-integration/commentfile
666                 exit 2
667               fi
669             unstash 'hadoop-3'
670             echo "Attempting to use run an instance on top of Hadoop 3."
671             sh '''#!/bin/bash -e
672               artifact=$(ls -1 "${WORKSPACE}"/hadoop-3*.tar.gz | head -n 1)
673               tar --strip-components=1 -xzf "${artifact}" -C "hadoop-3"
674               if ! "${BASEDIR}/dev-support/hbase_nightly_pseudo-distributed-test.sh" \
675                   --single-process \
676                   --working-dir output-integration/hadoop-3 \
677                   --hbase-client-install hbase-client \
678                   hbase-install \
679                   hadoop-3/bin/hadoop \
680                   hadoop-3/share/hadoop/yarn/test/hadoop-yarn-server-tests-*-tests.jar \
681                   hadoop-3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-*-tests.jar \
682                   hadoop-3/bin/mapred \
683                   >output-integration/hadoop-3.log 2>&1 ; then
684                 echo "(x) {color:red}-1 client integration test{color}\n--Failed when running client tests on top of Hadoop 3. [see log for details|${BUILD_URL}/artifact/output-integration/hadoop-3.log]. (note that this means we didn't check the Hadoop 3 shaded client)" >output-integration/commentfile
685                 exit 2
686               fi
687               echo "Attempting to use run an instance on top of Hadoop 3, relying on the Hadoop client artifacts for the example client program."
688               if ! "${BASEDIR}/dev-support/hbase_nightly_pseudo-distributed-test.sh" \
689                   --single-process \
690                   --hadoop-client-classpath hadoop-3/share/hadoop/client/hadoop-client-api-*.jar:hadoop-3/share/hadoop/client/hadoop-client-runtime-*.jar \
691                   --working-dir output-integration/hadoop-3-shaded \
692                   --hbase-client-install hbase-client \
693                   hbase-install \
694                   hadoop-3/bin/hadoop \
695                   hadoop-3/share/hadoop/yarn/test/hadoop-yarn-server-tests-*-tests.jar \
696                   hadoop-3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-*-tests.jar \
697                   hadoop-3/bin/mapred \
698                   >output-integration/hadoop-3-shaded.log 2>&1 ; then
699                 echo "(x) {color:red}-1 client integration test{color}\n--Failed when running client tests on top of Hadoop 3 using Hadoop's shaded client. [see log for details|${BUILD_URL}/artifact/output-integration/hadoop-3-shaded.log]." >output-integration/commentfile
700                 exit 2
701               fi
702               echo "(/) {color:green}+1 client integration test{color}" >output-integration/commentfile
706           }
707           post {
708             always {
709               stash name: 'srctarball-result', includes: "output-srctarball/commentfile,output-integration/commentfile"
710               archiveArtifacts artifacts: 'output-srctarball/*'
711               archiveArtifacts artifacts: 'output-srctarball/**/*'
712               archiveArtifacts artifacts: 'output-integration/*'
713               archiveArtifacts artifacts: 'output-integration/**/*'
714             }
715           }
716         }
717       }
718     }
719   }
720   post {
721     always {
722       script {
723          try {
724            unstash 'general-result'
725            unstash 'jdk7-result'
726            unstash 'jdk8-hadoop2-result'
727            unstash 'jdk8-hadoop3-result'
728            unstash 'jdk11-hadoop3-result'
729            unstash 'srctarball-result'
730            sh "printenv"
731            def results = ["${env.OUTPUT_DIR_RELATIVE_GENERAL}/commentfile",
732                           "${env.OUTPUT_DIR_RELATIVE_JDK7}/commentfile",
733                           "${env.OUTPUT_DIR_RELATIVE_JDK8_HADOOP2}/commentfile",
734                           "${env.OUTPUT_DIR_RELATIVE_JDK8_HADOOP3}/commentfile",
735                           "${env.OUTPUT_DIR_RELATIVE_JDK11_HADOOP3}/commentfile",
736                           'output-srctarball/commentfile',
737                           'output-integration/commentfile']
738            echo env.BRANCH_NAME
739            echo env.BUILD_URL
740            echo currentBuild.result
741            echo currentBuild.durationString
742            def comment = "Results for branch ${env.BRANCH_NAME}\n"
743            comment += "\t[build ${currentBuild.displayName} on builds.a.o|${env.BUILD_URL}]: "
744            if (currentBuild.result == null || currentBuild.result == "SUCCESS") {
745               comment += "(/) *{color:green}+1 overall{color}*\n"
746            } else {
747               comment += "(x) *{color:red}-1 overall{color}*\n"
748               // Ideally get the committer our of the change and @ mention them in the per-jira comment
749            }
750            comment += "----\ndetails (if available):\n\n"
751            echo ""
752            echo "[DEBUG] trying to aggregate step-wise results"
753            comment += results.collect { fileExists(file: it) ? readFile(file: it) : "" }.join("\n\n")
754            echo "[INFO] Comment:"
755            echo comment
756            echo ""
757            echo "[DEBUG] checking to see if feature branch"
758            def jiras = getJirasToComment(env.BRANCH_NAME, [])
759            if (jiras.isEmpty()) {
760              echo "[DEBUG] non-feature branch, checking change messages for jira keys."
761              echo "[INFO] There are ${currentBuild.changeSets.size()} change sets."
762              jiras = getJirasToCommentFromChangesets(currentBuild)
763            }
764            jiras.each { currentIssue ->
765              jiraComment issueKey: currentIssue, body: comment
766            }
767         } catch (Exception exception) {
768           echo "Got exception: ${exception}"
769           echo "    ${exception.getStackTrace()}"
770         }
771       }
772     }
773   }
775 import org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper
776 @NonCPS
777 List<String> getJirasToCommentFromChangesets(RunWrapper thisBuild) {
778   def seenJiras = []
779   thisBuild.changeSets.each { cs ->
780     cs.getItems().each { change ->
781       CharSequence msg = change.msg
782       echo "change: ${change}"
783       echo "     ${msg}"
784       echo "     ${change.commitId}"
785       echo "     ${change.author}"
786       echo ""
787       seenJiras = getJirasToComment(msg, seenJiras)
788     }
789   }
790   return seenJiras
792 @NonCPS
793 List<String> getJirasToComment(CharSequence source, List<String> seen) {
794   source.eachMatch("HBASE-[0-9]+") { currentIssue ->
795     echo "[DEBUG] found jira key: ${currentIssue}"
796     if (currentIssue in seen) {
797       echo "[DEBUG] already commented on ${currentIssue}."
798     } else {
799       echo "[INFO] commenting on ${currentIssue}."
800       seen << currentIssue
801     }
802   }
803   return seen