зеркало из https://github.com/microsoft/pai.git
324 строки
9.0 KiB
Groovy
324 строки
9.0 KiB
Groovy
#!groovy
|
|
|
|
// Copyright (c) Microsoft Corporation
|
|
// All rights reserved.
|
|
//
|
|
// MIT License
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
|
// documentation files (the "Software"), to deal in the Software without restriction, including without limitation
|
|
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
|
|
// to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
|
// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
// timeout in minutes
|
|
http_timeout = 10
|
|
pause_timeout = 1
|
|
jenkins_timeout = 120
|
|
|
|
// dev box agent node label
|
|
node_label = "dev-box"
|
|
|
|
sh = "bash -Eeuo pipefail"
|
|
|
|
// check health for http uri
|
|
def http_check_health(uri) {
|
|
def status = 0
|
|
while (!status.equals(200)) {
|
|
try {
|
|
echo "Waiting for PAI to be ready ..."
|
|
sleep(30)
|
|
def response = httpRequest(uri)
|
|
println("Status: " + response.status)
|
|
println("Content: " + response.content)
|
|
status = response.status
|
|
} catch (err) {
|
|
if (err instanceof org.jenkinsci.plugins.workflow.steps.FlowInterruptedException) {
|
|
echo "Http request timeout."
|
|
currentBuild.result = "FAILURE"
|
|
break;
|
|
}
|
|
echo "PAI is not ready: ${err}"
|
|
}
|
|
}
|
|
}
|
|
|
|
pipeline {
|
|
environment {
|
|
REGISTRY_URI = "10.0.1.5:5000"
|
|
YARN_SINGLEBOX_URI = "http://10.0.1.6"
|
|
YARN_CLUSTER_URI = "http://10.0.1.8"
|
|
K8S_CLUSTER_URI = "http://10.0.3.6"
|
|
ACCOUNT = credentials("USER_ACCOUNT")
|
|
}
|
|
agent {
|
|
label "pipeline"
|
|
}
|
|
|
|
stages {
|
|
// Occupy Bed
|
|
stage("Occupy Bed") {
|
|
steps {
|
|
script {
|
|
env.IMAGE_TAG = sh(
|
|
returnStdout: true,
|
|
script: '''#!/bin/bash
|
|
echo ${GIT_BRANCH//\\//-}-$(git rev-parse --short HEAD)-${BUILD_ID}
|
|
'''
|
|
).trim()
|
|
echo "IMAGE_TAG=${IMAGE_TAG}"
|
|
echo "NODE_NAME=${NODE_NAME}"
|
|
}
|
|
}
|
|
}
|
|
|
|
// Prepare Cluster
|
|
stage("Prepare Cluster") {
|
|
agent {
|
|
label node_label
|
|
}
|
|
steps {
|
|
sh "${sh} ${WORKSPACE}/tests/jenkins/stage_prepare.sh"
|
|
}
|
|
}
|
|
|
|
// Build Images
|
|
stage("Build Images") {
|
|
agent {
|
|
label node_label
|
|
}
|
|
steps {
|
|
sh "${sh} ${WORKSPACE}/tests/jenkins/stage_build.sh"
|
|
}
|
|
}
|
|
|
|
// Deploy PAI
|
|
stage("Deploy PAI") {
|
|
parallel {
|
|
stage("YARN Single Box") {
|
|
agent {
|
|
label node_label
|
|
}
|
|
steps {
|
|
script {
|
|
try {
|
|
sh "${sh} ${WORKSPACE}/tests/jenkins/stage_deploy.sh yarn singlebox"
|
|
} catch (err) {
|
|
echo "Deploy YARN Single Box Failed: ${err}"
|
|
currentBuild.result = "FAILURE"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
stage("YARN Cluster") {
|
|
agent {
|
|
label node_label
|
|
}
|
|
steps {
|
|
script {
|
|
try {
|
|
sh "${sh} ${WORKSPACE}/tests/jenkins/stage_deploy.sh yarn cluster"
|
|
} catch (err) {
|
|
echo "Deploy YARN Cluster Failed: ${err}"
|
|
currentBuild.result = "FAILURE"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
stage("Pure K8S Cluster") {
|
|
agent {
|
|
label node_label
|
|
}
|
|
steps {
|
|
script {
|
|
try {
|
|
sh "${sh} ${WORKSPACE}/tests/jenkins/stage_deploy.sh k8s cluster"
|
|
} catch (err) {
|
|
echo "Deploy Pure K8S Cluster Failed: ${err}"
|
|
currentBuild.result = "FAILURE"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Test PAI
|
|
stage("Test PAI") {
|
|
parallel {
|
|
stage("YARN Single Box") {
|
|
agent {
|
|
label node_label
|
|
}
|
|
steps {
|
|
script {
|
|
if (currentBuild.result == "FAILURE") {
|
|
echo "Deploy failed, skip test."
|
|
} else {
|
|
try {
|
|
timeout(time: http_timeout, unit: "MINUTES") {
|
|
http_check_health("${YARN_SINGLEBOX_URI}/rest-server/api/v1")
|
|
sh "${sh} ${WORKSPACE}/tests/jenkins/stage_test.sh yarn ${YARN_SINGLEBOX_URI}/rest-server"
|
|
}
|
|
} catch (err) {
|
|
echo "Test YARN Single Box Failed: ${err}"
|
|
currentBuild.result = "FAILURE"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
stage("YARN Cluster") {
|
|
agent {
|
|
label node_label
|
|
}
|
|
steps {
|
|
script {
|
|
if (currentBuild.result == "FAILURE") {
|
|
echo "Deploy failed, skip test."
|
|
} else {
|
|
try {
|
|
timeout(time: http_timeout, unit: "MINUTES") {
|
|
http_check_health("${YARN_CLUSTER_URI}/rest-server/api/v1")
|
|
sh "${sh} ${WORKSPACE}/tests/jenkins/stage_test.sh yarn ${YARN_CLUSTER_URI}/rest-server"
|
|
}
|
|
} catch (err) {
|
|
echo "Test YARN Cluster Failed: ${err}"
|
|
currentBuild.result = "FAILURE"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
stage("Pure K8S Cluster") {
|
|
agent {
|
|
label node_label
|
|
}
|
|
steps {
|
|
script {
|
|
if (currentBuild.result == "FAILURE") {
|
|
echo "Deploy failed, skip test."
|
|
} else {
|
|
try {
|
|
timeout(time: http_timeout, unit: "MINUTES") {
|
|
http_check_health("${K8S_CLUSTER_URI}/rest-server/api/v1")
|
|
sh "${sh} ${WORKSPACE}/tests/jenkins/stage_test.sh k8s ${K8S_CLUSTER_URI}/rest-server"
|
|
}
|
|
} catch (err) {
|
|
echo "Test Pure K8S Cluster Failed: ${err}"
|
|
currentBuild.result = "FAILURE"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Pause on Failure
|
|
stage("Pause on Failure") {
|
|
steps {
|
|
script {
|
|
try {
|
|
if (currentBuild.result == "FAILURE") {
|
|
def pauseNow
|
|
timeout(time: pause_timeout, unit: "MINUTES") {
|
|
pauseNow = input(
|
|
message: "Do you want to reserve the environment for debug?",
|
|
ok: "Yes",
|
|
parameters: [booleanParam(
|
|
defaultValue: true,
|
|
description: "If you want to debug, click the Yes", name: "Yes?"
|
|
)]
|
|
)
|
|
echo "pauseNow: " + pauseNow
|
|
}
|
|
if (pauseNow) {
|
|
input (message: 'Click "Proceed" to finish!')
|
|
}
|
|
}
|
|
} catch (err) {
|
|
echo "Encountered error: ${err}"
|
|
echo "Whatever, Will clean up cluster now!"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Clean up Cluster
|
|
stage("Clean up Cluster") {
|
|
parallel {
|
|
stage("YARN Single Box") {
|
|
agent {
|
|
label node_label
|
|
}
|
|
steps {
|
|
sh "${sh} ${WORKSPACE}/tests/jenkins/stage_clean.sh yarn singlebox"
|
|
}
|
|
}
|
|
stage("YARN Cluster") {
|
|
agent {
|
|
label node_label
|
|
}
|
|
steps {
|
|
sh "${sh} ${WORKSPACE}/tests/jenkins/stage_clean.sh yarn cluster"
|
|
}
|
|
}
|
|
stage("Pure K8S Cluster") {
|
|
agent {
|
|
label node_label
|
|
}
|
|
steps {
|
|
sh "${sh} ${WORKSPACE}/tests/jenkins/stage_clean.sh k8s cluster"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
post {
|
|
always {
|
|
echo "The end of Jenkins pipeline."
|
|
}
|
|
success {
|
|
echo "Jenkins succeeeded :)"
|
|
office365ConnectorSend(
|
|
status: "Build success",
|
|
webhookUrl: "${env.HOOK}"
|
|
)
|
|
}
|
|
unstable {
|
|
echo "Jenkins is unstable :/"
|
|
}
|
|
failure {
|
|
echo "Jenkins failed :("
|
|
office365ConnectorSend(
|
|
status: "Build failure",
|
|
webhookUrl: "${env.HOOK}"
|
|
)
|
|
step([
|
|
$class: "Mailer",
|
|
notifyEveryUnstableBuild: true,
|
|
recipients: emailextrecipients([
|
|
[$class: "CulpritsRecipientProvider"],
|
|
[$class: "RequesterRecipientProvider"]
|
|
]),
|
|
to: "paialert@microsoft.com"
|
|
])
|
|
}
|
|
changed {
|
|
echo "Things were different before ..."
|
|
}
|
|
}
|
|
options {
|
|
disableConcurrentBuilds()
|
|
timeout(time: jenkins_timeout, unit: "MINUTES")
|
|
}
|
|
}
|