Skip to content

[Do not commit] Use exclusive src for each platform #3199

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
253 changes: 153 additions & 100 deletions dev-support/Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,6 @@ pipeline {
}

environment {
SOURCEDIR = 'src'
// will also need to change notification section below
PATCHDIR = 'out'
YETUS='yetus'
// Branch or tag name. Yetus release tags are 'rel/X.Y.Z'
YETUS_VERSION='f9ba0170a5787a5f4662d3769804fef0226a182f'
Expand All @@ -56,66 +53,121 @@ pipeline {
}
}

// This is an optional stage which runs only when there's a change in
// C++/C++ build/platform.
// This stage serves as a means of cross platform validation, which is
// really needed to ensure that any C++ related/platform change doesn't
// break the Hadoop build on Centos 8.
stage ('precommit-run Centos 8') {
environment {
DOCKERFILE = "${SOURCEDIR}/dev-support/docker/Dockerfile_centos_8"
IS_OPTIONAL = 1
}

stage ('setup sources') {
steps {
withCredentials(
[usernamePassword(credentialsId: 'apache-hadoop-at-github.com',
passwordVariable: 'GITHUB_TOKEN',
usernameVariable: 'GITHUB_USER'),
usernamePassword(credentialsId: 'hadoopqa-at-asf-jira',
passwordVariable: 'JIRA_PASSWORD',
usernameVariable: 'JIRA_USER')]) {
sh '''#!/usr/bin/env bash
dir("${WORKSPACE}/hadoop-centos-8") {
sh '''#!/usr/bin/env bash

chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
"${SOURCEDIR}/dev-support/jenkins.sh"
'''
cp -Rp ${WORKSPACE}/src ${WORKSPACE}/hadoop-centos-8
'''
}
}
}

// This is an optional stage which runs only when there's a change in
// C++/C++ build/platform.
// This stage serves as a means of cross platform validation, which is
// really needed to ensure that any C++ related/platform change doesn't
// break the Hadoop build on Debian 10.
stage ('precommit-run Debian 10') {
environment {
DOCKERFILE = "${SOURCEDIR}/dev-support/docker/Dockerfile_debian_10"
IS_OPTIONAL = 1
}
dir("${WORKSPACE}/debian-10") {
sh '''#!/usr/bin/env bash

steps {
withCredentials(
[usernamePassword(credentialsId: 'apache-hadoop-at-github.com',
passwordVariable: 'GITHUB_TOKEN',
usernameVariable: 'GITHUB_USER'),
usernamePassword(credentialsId: 'hadoopqa-at-asf-jira',
passwordVariable: 'JIRA_PASSWORD',
usernameVariable: 'JIRA_USER')]) {
sh '''#!/usr/bin/env bash
cp -Rp ${WORKSPACE}/src ${WORKSPACE}/debian-10
'''
}

chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
"${SOURCEDIR}/dev-support/jenkins.sh"
'''
dir("${WORKSPACE}/ubuntu-focal") {
sh '''#!/usr/bin/env bash

cp -Rp ${WORKSPACE}/src ${WORKSPACE}/ubuntu-focal
'''
}
}
}

// // This is an optional stage which runs only when there's a change in
// // C++/C++ build/platform.
// // This stage serves as a means of cross platform validation, which is
// // really needed to ensure that any C++ related/platform change doesn't
// // break the Hadoop build on Centos 8.
// stage ('precommit-run Centos 8') {
// environment {
// SOURCEDIR = "${WORKSPACE}/hadoop-centos-8/src"
// PATCHDIR = "${WORKSPACE}/hadoop-centos-8/out"
// DOCKERFILE = "${SOURCEDIR}/dev-support/docker/Dockerfile_centos_8"
// IS_OPTIONAL = 1
// }

// steps {
// withCredentials(
// [usernamePassword(credentialsId: 'apache-hadoop-at-github.com',
// passwordVariable: 'GITHUB_TOKEN',
// usernameVariable: 'GITHUB_USER'),
// usernamePassword(credentialsId: 'hadoopqa-at-asf-jira',
// passwordVariable: 'JIRA_PASSWORD',
// usernameVariable: 'JIRA_USER')]) {
// sh '''#!/usr/bin/env bash

// chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
// "${SOURCEDIR}/dev-support/jenkins.sh" run_ci
// '''
// }
// }

// post {
// cleanup() {
// script {
// sh '''#!/usr/bin/env bash

// chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
// "${SOURCEDIR}/dev-support/jenkins.sh" cleanup_ci_proc
// '''
// }
// }
// }
// }

// // This is an optional stage which runs only when there's a change in
// // C++/C++ build/platform.
// // This stage serves as a means of cross platform validation, which is
// // really needed to ensure that any C++ related/platform change doesn't
// // break the Hadoop build on Debian 10.
// stage ('precommit-run Debian 10') {
// environment {
// SOURCEDIR = "${WORKSPACE}/debian-10/src"
// PATCHDIR = "${WORKSPACE}/debian-10/out"
// DOCKERFILE = "${SOURCEDIR}/dev-support/docker/Dockerfile_debian_10"
// IS_OPTIONAL = 1
// }

// steps {
// withCredentials(
// [usernamePassword(credentialsId: 'apache-hadoop-at-github.com',
// passwordVariable: 'GITHUB_TOKEN',
// usernameVariable: 'GITHUB_USER'),
// usernamePassword(credentialsId: 'hadoopqa-at-asf-jira',
// passwordVariable: 'JIRA_PASSWORD',
// usernameVariable: 'JIRA_USER')]) {
// sh '''#!/usr/bin/env bash

// chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
// "${SOURCEDIR}/dev-support/jenkins.sh" run_ci
// '''
// }
// }

// post {
// cleanup() {
// script {
// sh '''#!/usr/bin/env bash

// chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
// "${SOURCEDIR}/dev-support/jenkins.sh" cleanup_ci_proc
// '''
// }
// }
// }
// }

// We want to use Ubuntu Focal as our main CI and thus, this stage
// isn't optional (runs for all the PRs).
stage ('precommit-run Ubuntu focal') {
environment {
SOURCEDIR = "${WORKSPACE}/ubuntu-focal/src"
PATCHDIR = "${WORKSPACE}/ubuntu-focal/out"
DOCKERFILE = "${SOURCEDIR}/dev-support/docker/Dockerfile"
IS_OPTIONAL = 0
}
Expand All @@ -131,69 +183,70 @@ pipeline {
sh '''#!/usr/bin/env bash

chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
"${SOURCEDIR}/dev-support/jenkins.sh"
"${SOURCEDIR}/dev-support/jenkins.sh" run_ci
'''
}
}
}

}
post {
always {
script {
// Publish status if it was missed (YETUS-1059)
withCredentials(
[usernamePassword(credentialsId: '683f5dcf-5552-4b28-9fb1-6a6b77cf53dd',
passwordVariable: 'GITHUB_TOKEN',
usernameVariable: 'GITHUB_USER')]) {
sh '''#!/usr/bin/env bash

chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
"${SOURCEDIR}/dev-support/jenkins.sh" github_status_recovery
'''
}

// Yetus output
archiveArtifacts "ubuntu-focal/out/**"
// Publish the HTML report so that it can be looked at
// Has to be relative to WORKSPACE.
publishHTML (target: [
allowMissing: true,
keepAll: true,
alwaysLinkToLastBuild: true,
// Has to be relative to WORKSPACE
reportDir: "ubuntu-focal/out",
reportFiles: 'report.html',
reportName: 'Yetus Report'
])
// Publish JUnit results
try {
junit "${SOURCEDIR}/**/target/surefire-reports/*.xml"
} catch(e) {
echo 'junit processing: ' + e.toString()
}
}
}

post {
always {
script {
// Publish status if it was missed (YETUS-1059)
withCredentials(
[usernamePassword(credentialsId: '683f5dcf-5552-4b28-9fb1-6a6b77cf53dd',
passwordVariable: 'GITHUB_TOKEN',
usernameVariable: 'GITHUB_USER')]) {
sh '''#!/usr/bin/env bash
YETUS_ARGS+=("--github-token=${GITHUB_TOKEN}")
YETUS_ARGS+=("--patch-dir=${WORKSPACE}/${PATCHDIR}")
TESTPATCHBIN="${WORKSPACE}/${YETUS}/precommit/src/main/shell/github-status-recovery.sh"
/usr/bin/env bash "${TESTPATCHBIN}" "${YETUS_ARGS[@]}" ${EXTRA_ARGS} || true
'''
}
cleanup() {
script {
sh '''#!/usr/bin/env bash

// Yetus output
archiveArtifacts "${env.PATCHDIR}/**"
// Publish the HTML report so that it can be looked at
// Has to be relative to WORKSPACE.
publishHTML (target: [
allowMissing: true,
keepAll: true,
alwaysLinkToLastBuild: true,
// Has to be relative to WORKSPACE
reportDir: "${env.PATCHDIR}",
reportFiles: 'report.html',
reportName: 'Yetus Report'
])
// Publish JUnit results
try {
junit "${env.SOURCEDIR}/**/target/surefire-reports/*.xml"
} catch(e) {
echo 'junit processing: ' + e.toString()
chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
"${SOURCEDIR}/dev-support/jenkins.sh" cleanup_ci_proc
'''
}
}
}
}
}
}

post {
// Jenkins pipeline jobs fill slaves on PRs without this :(
cleanup() {
script {
sh '''
# See YETUS-764
if [ -f "${WORKSPACE}/${PATCHDIR}/pidfile.txt" ]; then
echo "test-patch process appears to still be running: killing"
kill `cat "${WORKSPACE}/${PATCHDIR}/pidfile.txt"` || true
sleep 10
fi
if [ -f "${WORKSPACE}/${PATCHDIR}/cidfile.txt" ]; then
echo "test-patch container appears to still be running: killing"
docker kill `cat "${WORKSPACE}/${PATCHDIR}/cidfile.txt"` || true
fi
# See HADOOP-13951
chmod -R u+rxw "${WORKSPACE}"
'''
sh '''#!/usr/bin/env bash

# See HADOOP-13951
chmod -R u+rxw "${WORKSPACE}"
'''
deleteDir()
}
}
Expand Down
66 changes: 53 additions & 13 deletions dev-support/jenkins.sh
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,10 @@ function run_ci() {
TESTPATCHBIN="${WORKSPACE}/${YETUS}/precommit/src/main/shell/test-patch.sh"

# this must be clean for every run
if [[ -d "${WORKSPACE}/${PATCHDIR}" ]]; then
rm -rf "${WORKSPACE:?}/${PATCHDIR}"
if [[ -d "${PATCHDIR}" ]]; then
rm -rf "${PATCHDIR:?}"
fi
mkdir -p "${WORKSPACE}/${PATCHDIR}"
mkdir -p "${PATCHDIR}"

# if given a JIRA issue, process it. If CHANGE_URL is set
# (e.g., Github Branch Source plugin), process it.
Expand All @@ -128,23 +128,23 @@ function run_ci() {
if [[ -n "${JIRA_ISSUE_KEY}" ]]; then
YETUS_ARGS+=("${JIRA_ISSUE_KEY}")
elif [[ -z "${CHANGE_URL}" ]]; then
echo "Full build skipped" >"${WORKSPACE}/${PATCHDIR}/report.html"
echo "Full build skipped" >"${PATCHDIR}/report.html"
exit 0
fi

YETUS_ARGS+=("--patch-dir=${WORKSPACE}/${PATCHDIR}")
YETUS_ARGS+=("--patch-dir=${PATCHDIR}")

# where the source is located
YETUS_ARGS+=("--basedir=${WORKSPACE}/${SOURCEDIR}")
YETUS_ARGS+=("--basedir=${SOURCEDIR}")

# our project defaults come from a personality file
YETUS_ARGS+=("--project=hadoop")
YETUS_ARGS+=("--personality=${WORKSPACE}/${SOURCEDIR}/dev-support/bin/hadoop.sh")
YETUS_ARGS+=("--personality=${SOURCEDIR}/dev-support/bin/hadoop.sh")

# lots of different output formats
YETUS_ARGS+=("--brief-report-file=${WORKSPACE}/${PATCHDIR}/brief.txt")
YETUS_ARGS+=("--console-report-file=${WORKSPACE}/${PATCHDIR}/console.txt")
YETUS_ARGS+=("--html-report-file=${WORKSPACE}/${PATCHDIR}/report.html")
YETUS_ARGS+=("--brief-report-file=${PATCHDIR}/brief.txt")
YETUS_ARGS+=("--console-report-file=${PATCHDIR}/console.txt")
YETUS_ARGS+=("--html-report-file=${PATCHDIR}/report.html")

# enable writing back to Github
YETUS_ARGS+=("--github-token=${GITHUB_TOKEN}")
Expand Down Expand Up @@ -206,7 +206,47 @@ function run_ci() {
"${TESTPATCHBIN}" "${YETUS_ARGS[@]}"
}

# Check if the CI needs to be run, if so, do so :)
if check_ci_run; then
run_ci
function cleanup_ci_proc() {
# See YETUS-764
if [ -f "${PATCHDIR}/pidfile.txt" ]; then
echo "test-patch process appears to still be running: killing"
kill "$(cat "${PATCHDIR}/pidfile.txt")" || true
sleep 10
fi
if [ -f "${PATCHDIR}/cidfile.txt" ]; then
echo "test-patch container appears to still be running: killing"
docker kill "$(cat "${PATCHDIR}/cidfile.txt")" || true
fi
}

function github_status_recovery() {
YETUS_ARGS+=("--github-token=${GITHUB_TOKEN}")
YETUS_ARGS+=("--patch-dir=${PATCHDIR}")
TESTPATCHBIN="${WORKSPACE}/${YETUS}/precommit/src/main/shell/github-status-recovery.sh"
/usr/bin/env bash "${TESTPATCHBIN}" "${YETUS_ARGS[@]}" "${EXTRA_ARGS}" || true
}

if [ -z "$1" ]; then
echo "Must specify an argument for jenkins.sh"
echo "run_ci - Runs the CI based on platform image as defined by DOCKERFILE"
echo "cleanup_ci_proc - Cleans up the processes spawned for running the CI"
echo "github_status_recovery - Sends Github status"
exit 1
fi

# Process arguments to jenkins.sh
if [ "$1" == "run_ci" ]; then
# Check if the CI needs to be run, if so, do so :)
if check_ci_run; then
run_ci
else
echo "No C++ file/C++ build/platform changes found, will not run CI"
fi
elif [ "$1" == "cleanup_ci_proc" ]; then
cleanup_ci_proc
elif [ "$1" == "github_status_recovery" ]; then
github_status_recovery
else
echo "Don't know how to process $1"
exit 1
fi
Loading