mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-04 03:50:31 +00:00
To make throttling by label fully active, the "throttle" option has to be specified with a specific label. You can now specify "skip_gate" in the Gerrit comments when you do a +2 code review to tell Jenkins not to actually run the gate. You'd do this if you plan to manually merge the change. Also updated the "printenv" debug output to better sort multi-line comments. Change-Id: I4c0b1085acec4805f2ca207eebac50aad81f27e2
175 lines
5.8 KiB
Plaintext
175 lines
5.8 KiB
Plaintext
/*
|
|
* This pipeline is the "template" for the Asterisk Periodic Tests multi-branch
|
|
* parent job. Jenkins will automatically scan the branches in the "asterisk"
|
|
* or "Security-asterisk" projects in Gerrit and automatically create a branch-
|
|
* specific job for each branch it finds this file in.
|
|
*
|
|
* This file starts as a declarative pipeline because with a declarative
|
|
* pipeline, you can define the trigger in the pipeline file. This keeps
|
|
* everything in one place. We transition to scripted pipeline later on because
|
|
* we need to dynamically determine which docker image we're going to use and
|
|
* you can't do that in a delcarative pipeline.
|
|
*/
|
|
def timeoutTime = 3
|
|
def timeoutUnits = 'HOURS'
|
|
if (env.TIMEOUT_DAILIES) {
|
|
def _timeout = env.TIMEOUT_DAILIES.split()
|
|
timeoutTime = _timeout[0].toInteger()
|
|
timeoutUnits = _timeout[1]
|
|
}
|
|
|
|
pipeline {
|
|
options {
|
|
ansiColor('gnome-terminal')
|
|
throttle(['asterisk-daily'])
|
|
timestamps()
|
|
timeout(time: timeoutTime, unit: timeoutUnits)
|
|
}
|
|
triggers {
|
|
cron 'H H(0-4) * * *'
|
|
}
|
|
|
|
agent {
|
|
/* All of the stages need to be performed on a docker host */
|
|
label "asterisk-daily"
|
|
}
|
|
|
|
stages {
|
|
stage ("->") {
|
|
steps {
|
|
/* Here's where we switch to scripted pipeline */
|
|
script {
|
|
manager.createSummary("/plugin/workflow-job/images/48x48/pipelinejob.png").appendText("Docker Host: ${NODE_NAME}", false)
|
|
|
|
stage ("Checkout") {
|
|
sh "sudo chown -R jenkins:users ."
|
|
sh "printenv -0 | sort -z | tr '\0' '\n'"
|
|
sh "sudo tests/CI/setupJenkinsEnvironment.sh"
|
|
}
|
|
|
|
def images = env.DOCKER_IMAGES.split(' ')
|
|
def r = currentBuild.startTimeInMillis % images.length
|
|
def ri = images[(int)r]
|
|
def randomImage = env.DOCKER_REGISTRY + "/" + ri
|
|
def dockerOptions = "--privileged --ulimit core=0 --ulimit nofile=10240 " +
|
|
" --tmpfs /tmp:exec,size=1G -v /srv/jenkins:/srv/jenkins:rw -v /srv/cache:/srv/cache:rw " +
|
|
" --entrypoint=''"
|
|
def bt = env.BUILD_TAG.replaceAll(/[^a-zA-Z0-9_.-]/, '-')
|
|
def outputdir = "tests/CI/output/Testsuite"
|
|
|
|
manager.createSummary("/plugin/workflow-job/images/48x48/pipelinejob.png").appendText("Docker Image: ${randomImage}", false)
|
|
def img = docker.image(randomImage)
|
|
img.pull()
|
|
|
|
img.inside(dockerOptions + " --name ${bt}-build") {
|
|
stage ("Build") {
|
|
echo 'Building..'
|
|
env.CCACHE_DIR = "/srv/cache/ccache"
|
|
sh "./tests/CI/buildAsterisk.sh --branch-name=${BRANCH_NAME} --output-dir=${outputdir} --cache-dir=/srv/cache"
|
|
|
|
archiveArtifacts allowEmptyArchive: true, defaultExcludes: false, fingerprint: false,
|
|
artifacts: "${outputdir}/*"
|
|
}
|
|
stage ("Docs") {
|
|
|
|
sh "sudo ./tests/CI/installAsterisk.sh --branch-name=${BRANCH_NAME} --user-group=jenkins:users"
|
|
|
|
def docUrl = env.GIT_URL.replaceAll(/\/[^\/]+$/, "/publish-docs")
|
|
checkout scm: [$class: 'GitSCM',
|
|
branches: [[name: "master"]],
|
|
extensions: [
|
|
[$class: 'RelativeTargetDirectory', relativeTargetDir: "tests/CI/output/publish-docs"],
|
|
[$class: 'CloneOption',
|
|
noTags: true,
|
|
depth: 10,
|
|
honorRefspec: true,
|
|
shallow: true
|
|
],
|
|
],
|
|
userRemoteConfigs: [[url: docUrl]]
|
|
]
|
|
|
|
sh "./tests/CI/publishAsteriskDocs.sh --user-group=jenkins:users --branch-name=${BRANCH_NAME} --wiki-doc-branch-regex=\"${WIKI_DOC_BRANCH_REGEX}\""
|
|
}
|
|
}
|
|
|
|
def testGroups
|
|
configFileProvider([configFile(fileId: 'asterisk_daily_test_groups', variable: 'DAILY_TEST_GROUPS')]) {
|
|
echo "Retrieved config file from ${env.DAILY_TEST_GROUPS}"
|
|
testGroups = readJSON file: env.DAILY_TEST_GROUPS
|
|
}
|
|
|
|
def parallelTasks = [ : ]
|
|
|
|
for (def testGroup in testGroups) {
|
|
/*
|
|
* Because each task is a Groovy closure, we need to
|
|
* keep local references to some variables.
|
|
*/
|
|
def groupName = testGroup.name
|
|
def groupDir = testGroup.dir
|
|
def groupTestcmd = testGroup.testcmd
|
|
def groupRunTestsuiteOptions = testGroup.runTestsuiteOptions
|
|
def testsuiteUrl = env.GIT_URL.replaceAll(/\/[^\/]+$/, "/testsuite")
|
|
|
|
parallelTasks[groupName] = {
|
|
stage (groupName) {
|
|
|
|
img.inside("${dockerOptions} --name ${bt}-${groupName}") {
|
|
|
|
lock("${JOB_NAME}.${NODE_NAME}.installer") {
|
|
sh "sudo ./tests/CI/installAsterisk.sh --uninstall-all --branch-name=${BRANCH_NAME} --user-group=jenkins:users"
|
|
}
|
|
|
|
sh "sudo rm -rf ${groupDir} || : "
|
|
|
|
checkout scm: [$class: 'GitSCM',
|
|
branches: [[name: "${BRANCH_NAME}"]],
|
|
extensions: [
|
|
[$class: 'RelativeTargetDirectory', relativeTargetDir: groupDir],
|
|
[$class: 'CloneOption',
|
|
noTags: true,
|
|
depth: 10,
|
|
honorRefspec: true,
|
|
shallow: true
|
|
],
|
|
],
|
|
userRemoteConfigs: [[url: testsuiteUrl]]
|
|
]
|
|
|
|
sh "sudo tests/CI/runTestsuite.sh ${groupRunTestsuiteOptions} --testsuite-dir='${groupDir}' --testsuite-command='${groupTestcmd}'"
|
|
|
|
archiveArtifacts allowEmptyArchive: true, defaultExcludes: false, fingerprint: true,
|
|
artifacts: "${groupDir}/asterisk-test-suite-report.xml, ${groupDir}/logs/**, ${groupDir}/core*.txt"
|
|
|
|
junit testResults: "${groupDir}/asterisk-test-suite-report.xml",
|
|
healthScaleFactor: 1.0,
|
|
keepLongStdio: true
|
|
|
|
echo "Group result d: ${currentBuild.currentResult}"
|
|
}
|
|
echo "Group result s: ${currentBuild.currentResult}"
|
|
}
|
|
}
|
|
}
|
|
parallel parallelTasks
|
|
}
|
|
}
|
|
}
|
|
}
|
|
post {
|
|
cleanup {
|
|
cleanWs deleteDirs: true, notFailBuild: true
|
|
}
|
|
success {
|
|
echo "Reporting ${currentBuild.currentResult} Passed"
|
|
}
|
|
failure {
|
|
echo "Reporting ${currentBuild.currentResult}: Failed: Fatal Error"
|
|
}
|
|
unstable {
|
|
echo "Reporting ${currentBuild.currentResult}: Failed: Tests Failed"
|
|
}
|
|
}
|
|
}
|