blob: 64e18f7e7a4e04cb452613abe17632e71642bde4 [file] [log] [blame]
/**
* OSS - The DevOps Portal Testing Pipeline
* CREDENTIALS_ID - gerrit credentials id
**/
gerrit = new com.mirantis.mk.Gerrit()
common = new com.mirantis.mk.Common()
def getProjectName(gerritRef, defaultGitRef) {
def refSpec
if (gerritRef) {
refSpec = gerritRef
} else {
refSpec = defaultGitRef
}
def refValue = refSpec.tokenize('/').takeRight(2).join('')
return "oss${BUILD_NUMBER}${refValue}"
}
def executeCmd(user, project, cmd) {
common.infoMsg("Starting command: ${cmd}")
wrap([$class: 'AnsiColorBuildWrapper']) {
// Docker sets HOME=/ ignoring that it have to be HOME=/opt/workspace,
// as `docker-compose exec` does not support to pass environment
// variables, then `docker exec` is used.
sh("docker exec --user=${user} --env=HOME=/opt/workspace ${project}_devopsportal_1 ${cmd}")
}
common.successMsg("Successfully completed: ${cmd}")
}
def gerritRef
try {
gerritRef = GERRIT_REFSPEC
} catch (MissingPropertyException e) {
gerritRef = null
}
def defaultGitRef, defaultGitUrl
try {
defaultGitRef = DEFAULT_GIT_REF
defaultGitUrl = DEFAULT_GIT_URL
} catch (MissingPropertyException e) {
defaultGitRef = null
defaultGitUrl = null
}
def checkouted = false
node("vm") {
def composePath = 'docker/stack/docker-compose.yml'
def projectName
def jenkinsUser
try {
stage('Checkout Source Code') {
if (gerritRef) {
// job is triggered by Gerrit
checkouted = gerrit.gerritPatchsetCheckout ([
credentialsId : CREDENTIALS_ID,
withWipeOut : true,
])
} else if(defaultGitRef && defaultGitUrl) {
checkouted = gerrit.gerritPatchsetCheckout(defaultGitUrl, defaultGitRef, "HEAD", CREDENTIALS_ID)
}
if(!checkouted){
throw new Exception("Cannot checkout gerrit patchset, GERRIT_REFSPEC and DEFAULT_GIT_REF is null")
}
}
projectName = getProjectName(gerritRef, defaultGitRef)
stage('Setup Up Stack') {
sh("docker-compose --file ${composePath} --project-name=${projectName} pull")
sh("docker-compose --file ${composePath} --project-name=${projectName} up -d --force-recreate")
common.successMsg("Stack with the ${projectName} is started.")
}
def jenkinsUID = common.getJenkinsUid()
def jenkinsGID = common.getJenkinsGid()
jenkinsUser = "${jenkinsUID}:${jenkinsGID}"
stage('Print Environment Information') {
sh("docker-compose version")
sh("docker version")
executeCmd(jenkinsUser, projectName, "npm config get")
executeCmd(jenkinsUser, projectName, "env")
executeCmd(jenkinsUser, projectName, "ls -lan")
}
stage('Install Dependencies') {
executeCmd(jenkinsUser, projectName, "npm install")
}
stage('Run Linter Tests') {
executeCmd(jenkinsUser, projectName, "npm run lint")
}
stage('Run Unit Tests') {
timeout(4) {
executeCmd(jenkinsUser, projectName, "npm run test:unit")
}
}
stage('Run Function Tests') {
timeout(20) {
try {
executeCmd(jenkinsUser, projectName, "npm run test:functional")
} catch (err) {
archiveArtifacts(
artifacts: "test_output/**/*.png",
allowEmptyArchive: true,
)
throw err
}
}
}
} catch (err) {
currentBuild.result = 'FAILURE'
common.errorMsg("Build failed due to error: ${err}")
throw err
} finally {
common.sendNotification(currentBuild.result, "" ,["slack"])
stage('Cleanup') {
wrap([$class: 'AnsiColorBuildWrapper']) {
sh("docker-compose -f ${composePath} -p ${projectName} down")
}
}
}
}