blob: 26c6ee50e9f9c557c9d26ba106a58aad1b47609f [file] [log] [blame]
#!groovy
def main(String cacheHome = 'output/cache') {
String gitUrl = "${env.GERRIT_SCHEME}://${env.GERRIT_HOST}:${env.GERRIT_PORT}/${env.GERRIT_PROJECT}"
String gitRef = env.GERRIT_BRANCH ?: env.GERRIT_REFNAME
String artInfraNamespace = 'binary-dev-local/infra'
String artCacheFile = "${env.CI_NAME}.jjb.zip"
String artCacheUrl = "${env.ARTIFACTORY_URL}/artifactory/${artInfraNamespace}/${artCacheFile}"
String artCredential = env.ART_CREDENTIALS_ID
String jenkinsCredential = env.JENKINS_CREDENTIALS_ID
def response
def jenkinsJobs
def jjbJobs
def jobsToRemove
currentBuild.description = ''
// Set current build description
if (env.GERRIT_CHANGE_URL) {
currentBuild.description = """
<p>
Triggered by change: <a href="${env.GERRIT_CHANGE_URL}">${env.GERRIT_CHANGE_NUMBER},${env.GERRIT_PATCHSET_NUMBER}</a><br/>
Project: <b>${env.GERRIT_PROJECT}</b><br/>
Branch: <b>${env.GERRIT_BRANCH}</b><br/>
Subject: <b>${env.GERRIT_CHANGE_SUBJECT}</b><br/>
</p>
"""
}
stage('SCM checkout') {
if (env.MAINTAIN_MODE.toLowerCase() == 'false') {
checkout([
$class: 'GitSCM',
branches: [[
name: 'FETCH_HEAD'
]],
userRemoteConfigs: [[
url: gitUrl,
refspec: gitRef,
credentialsId: env.GIT_CREDENTIALS_ID
]],
extensions: [[
$class: 'WipeWorkspace'
]],
])
}
}
/*stage('Get JJB cache') {
dir(cacheHome) {
response = httpRequest \
url: artCacheUrl,
authentication: artCredential,
httpMode: 'GET',
outputFile: artCacheFile,
validResponseCodes: '100:399,404'
if (response.status != 404) {
unzip \
zipFile: artCacheFile,
dir: '.cache'
}
}
}*/
stage('Update JJB jobs') {
if (env.MAINTAIN_MODE.toLowerCase() == 'false') {
withCredentials([
usernamePassword(
credentialsId: env.JENKINS_CREDENTIALS_ID,
usernameVariable: 'JJB_USER',
passwordVariable: 'JJB_PASSWORD')
]) {
withEnv([
"HOME=${cacheHome}"
]) {
sh 'tox -v -e update $JOBS_LIST'
}
}
} else {
input \
message: 'Sleeping for maintainance'
}
}
stage('Get deployed jobs list') {
response = httpRequest \
url: "${JENKINS_URL}/crumbIssuer/api/json",
authentication: jenkinsCredential
def crumb = readJSON text: response.getContent()
response = httpRequest \
url: "${JENKINS_URL}/api/json?tree=jobs[name,description]",
authentication: jenkinsCredential,
customHeaders: [[
name: crumb.crumbRequestField,
value: crumb.crumb,
maskValue: true
]]
def jobs = readJSON text: response.getContent()
jenkinsJobs = jobs.jobs.findAll {
// Filter jenkins jobs deployed by JJB
it.description.toString().contains('Managed by Jenkins Job Builder')
}.collect{ it.name }
}
stage('Get JJB jobs list') {
withEnv([
"HOME=${cacheHome}"
]) {
sh 'tox -v -e jobs'
}
dir("output/${env.CI_NAME}") {
jjbJobs = sh(
script: "grep -rl actions | sed 's|/config.xml\$||g'",
returnStdout: true
).trim().readLines()
}
if (jjbJobs.size() == 0) {
error 'ERROR: Unexpected JJB output. No generated jobs found'
}
}
stage('Remove undefined jobs') {
jobsToRemove = jenkinsJobs.findAll { ! jjbJobs.contains(it) }
if (jobsToRemove.size() > 0) {
withCredentials([
usernamePassword(
credentialsId: jenkinsCredential,
usernameVariable: 'JJB_USER',
passwordVariable: 'JJB_PASSWORD')
]) {
withEnv([
"HOME=${cacheHome}"
]) {
sh "tox -v -e delete ${jobsToRemove.join(' ')}"
}
}
String description = '<b>DELETED</b><ul>'
jobsToRemove.each { description += "<li>${it}</li>" }
description += '</ul>'
currentBuild.description += description
} else {
currentBuild.description += 'No jobs to remove'
}
}
/*stage('Save JJB cache') {
dir(cacheHome) {
sh "rm -f ${artCacheFile}"
zip \
zipFile: artCacheFile,
dir: '.cache',
glob: 'jenkins_jobs/**'
response = httpRequest \
url: artCacheUrl,
authentication: artCredential,
httpMode: 'PUT',
multipartName: 'file',
uploadFile: artCacheFile
}
}*/
}
String podTpl = """
apiVersion: "v1"
kind: "Pod"
spec:
securityContext:
runAsUser: 1000
containers:
- name: "tox"
image: "${env.DOCKER_IMAGE}"
command:
- "cat"
securityContext:
privileged: false
tty: true
"""
if (env.K8S_CLUSTER == 'unset') {
node(env.SLAVE_LABEL ?: 'docker') {
main(env.WORKSPACE)
}
} else {
podTemplate(
cloud: env.K8S_CLUSTER,
yaml: podTpl,
showRawYaml: false
) {
node(POD_LABEL) {
container('tox') {
main()
}
}
}
}