//---------------------------------------------------------------------------------------------------------------------------------------------------- // Parameters //---------------------------------------------------------------------------------------------------------------------------------------------------- // set start time for nightly build on master branch String cron_string = env.BRANCH_NAME == 'master' ? '0 21 * * *' : '' // agent specific parameters - tailor for Your project! def agentBuild = 'RT HQGIF Smoke test agent' def agentBuildPathToolsGeneric = 'C:\\ALGitRepo\\ToolsGeneric' def agentSmokeTest = 'RT HQGIF Smoke test agent' def agentSmokeTestPathToolsGeneric = 'C:\\ALGitRepo\\ToolsGeneric' // project specific parameters - tailor for Your project! def artifactoryProjectName = 'HQGIF' def artifactoryBrowserUrl = 'https://hub.marelli.com/artifactory/webapp/#/artifacts/browse/tree/General' def projectRepoName = 'HQGIF' def softwareLabelDefault = 'F01_HQ001_SWAP_XXXX.XXXX.XX' def swttnrDefault = '0000000000' def pathToCFGID = 'Src\\Src_AL\\Cust\\Hq\\Hq001\\App\\ALUnit\\CfgId' def remoteRepoUrl = 'ssh://al_jenkins_service@hub.marelli.com:7996/hqgif/hqgif.git' def buildOutputBin = 'F02Hq001_App_default' // assembled artifactory url def artifactoryBasePath = "${artifactoryProjectName}/application" def artifactoryBrowserUrlProject = "${artifactoryBrowserUrl}/${artifactoryBasePath}" //---------------------------------------------------------------------------------------------------------------------------------------------------- // Function to stop older builds (of the same branch/PR) if a newer one is in the queue already // Source: https://issues.jenkins.io/browse/JENKINS-43353?focusedCommentId=376915&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-376915 //---------------------------------------------------------------------------------------------------------------------------------------------------- @NonCPS def cancelPreviousBuilds() { // Check for other instances of this particular build, cancel any that are older than the current one def jobName = env.JOB_NAME def currentBuildNumber = env.BUILD_NUMBER.toInteger() def currentJob = Jenkins.instance.getItemByFullName(jobName) // Loop through all instances of this particular job/branch for (def build : currentJob.builds) { if (build.isBuilding() && (build.number.toInteger() < currentBuildNumber)) { echo "Older build still queued. Sending kill signal to build number: ${build.number}" build.doStop() } } } //---------------------------------------------------------------------------------------------------------------------------------------------------- // Pipeline itself //---------------------------------------------------------------------------------------------------------------------------------------------------- pipeline { agent none options { timestamps () } triggers { cron(cron_string) } stages { stage('Init') { agent { label 'master' } steps { script { cancelPreviousBuilds() } } } stage("Prepare Variables") { agent { label 'master' } steps{ echo "Prepare Variables" echo "On Node: ${NODE_NAME}" echo "Initially prepare build variables" script { def tmpUserInput def userInputSWLabel = "NotSet" def userInputSWTTNR = "NotSet" // env._DATE def tmpTimestamp = env.BUILD_TIMESTAMP // BUILD_TIMESTAMP=2020-12-01 10:51:50 CET env._DATE = tmpTimestamp.substring(0,10) echo "env._DATE: ${_DATE}" // env._BUILDNO def tmpBuildNo = env.BUILD_NUMBER env._BUILDNO = tmpBuildNo.padLeft(8, '0') echo "env._BUILDNO: ${_BUILDNO}" // env._PROJ_REPO_BRANCHNAME env._PROJ_REPO_BRANCHNAME = env.BRANCH_NAME echo "env._PROJ_REPO_BRANCHNAME: ${_PROJ_REPO_BRANCHNAME}" // env._PLANNAME, env._USERINPUTSWLABEL, env._USERINPUTSWTTNR env._PLANNAME = 'NotSet' env._USERINPUTSWLABEL = 'NotSet' env._USERINPUTSWTTNR = 'NotSet' env._BUILDOUTPUTBIN = "${buildOutputBin}" // nightly-build if (env.BRANCH_NAME == 'master') { env._PLANNAME = 'nightly-build' env._ARTIFACTORY_URL = "${artifactoryBasePath}/${_PLANNAME}/${BRANCH_NAME}/${_DATE}-${_BUILDNO}" env._ARTIFACTORY_URL_LATEST = "${artifactoryBasePath}/${_PLANNAME}/${BRANCH_NAME}/0000-00-00-latest" env._ARTIFACTORY_URL_BROWSER = "${artifactoryBrowserUrlProject}/${_PLANNAME}/${BRANCH_NAME}/${_DATE}-${_BUILDNO}" } // integration-build if (env.BRANCH_NAME ==~ /PR-.*/) { env._PLANNAME = 'integration-build' env._ARTIFACTORY_URL = "${artifactoryBasePath}/${_PLANNAME}/${BRANCH_NAME}/${_DATE}-${_BUILDNO}" env._ARTIFACTORY_URL_BROWSER = "${artifactoryBrowserUrlProject}/${_PLANNAME}/${BRANCH_NAME}/${_DATE}-${_BUILDNO}" } // release-candidate-build if (env.BRANCH_NAME ==~ /release.*/) { env._PLANNAME = 'release-candidate-build' // Read input label def userInput timeout(time: 30, unit: "MINUTES") { tmpUserInput = input(id: 'userInput', message: 'SW logistic data:', parameters: [ [$class: 'TextParameterDefinition', defaultValue: '${softwareLabelDefault}', description: 'SWLabel', name: 'swlabel'], [$class: 'TextParameterDefinition', defaultValue: '${swttnrDefault}', description: 'SWTTNR', name: 'swttnr'] ]) } env._USERINPUTSWLABEL = tmpUserInput['swlabel'] env._USERINPUTSWTTNR = tmpUserInput['swttnr'] echo ("userInputSWLabel: "+env._USERINPUTSWLABEL) echo ("userInputSWTTNR: "+env._USERINPUTSWTTNR) env._ARTIFACTORY_URL = "${artifactoryBasePath}/${_PLANNAME}/${_DATE}-${_USERINPUTSWLABEL}" env._ARTIFACTORY_URL_BROWSER = "${artifactoryBrowserUrlProject}/${_PLANNAME}/${_DATE}-${_USERINPUTSWLABEL}" } echo "env._PLANNAME: ${_PLANNAME}" // env._ARTIFACTORY_URL, env._ARTIFACTORY_URL_BROWSER echo "env._BUILDOUTPUTBIN: ${env._BUILDOUTPUTBIN}" echo "env._ARTIFACTORY_URL: ${env._ARTIFACTORY_URL}" echo "env._ARTIFACTORY_URL_LATEST: ${env._ARTIFACTORY_URL_LATEST}" echo "env._ARTIFACTORY_URL_BROWSER: ${env._ARTIFACTORY_URL_BROWSER}" } } } stage('Pull ToolsGeneric') { agent {label "${agentBuild}"} steps { lock("${NODE_NAME}LockToolsGenericPull") { echo 'Pull ToolsGeneric' echo "On Node: ${NODE_NAME}" bat """ cd ${agentBuildPathToolsGeneric} git pull """ } } } stage('Delete user settings') { agent {label "${agentBuild}"} steps { echo 'Delete user settings!' echo "On Node: ${NODE_NAME}" bat """ echo Actual working directory: cd del Build\\Make\\Make_005_UserSettings.gmk """ } } stage('Create BuildInfo.txt file') { agent {label "${agentBuild}"} steps { echo 'Create BuildInfo.txt file!' echo "On Node: ${NODE_NAME}" bat """ echo Actual working directory: cd REM Saved in BuildInfo.txt SET PROJECTBranchName = NotSet SET PROJECTCommitHash = NotSet SET ToolsGenericBranchName = NotSet SET ToolsGenericCommitHash = NotSet REM get PROJECT repository information git symbolic-ref -q --short HEAD > temp.txt set /p PROJECTBranchName= temp.txt set /p PROJECTCommitHash= temp.txt set /p ToolsGenericBranchName= temp.txt set /p ToolsGenericCommitHash= BuildInfo.txt """ } } stage('integration-build') { agent {label "${agentBuild}"} when { expression {env._PLANNAME == 'integration-build'} } steps { bat """ cd CI\\Support set PATH_TOOLSGENERIC=${agentBuildPathToolsGeneric} call 00_integration.bat echo ErrorLevel: %ERRORLEVEL% if %ERRORLEVEL% EQU 0 ( echo 00_integration.bat Success, ErrorLevel is: %ERRORLEVEL% ) else ( echo 00_integration.bat Failure, ErrorLevel is: %ERRORLEVEL% exit /b %errorlevel% ) """ } post { always { echo "Deploy to Artifactory on Node: ${NODE_NAME}" rtUpload ( serverId: 'artifactory-al-prod', specPath: '${WORKSPACE}/CI/ArtifactorySpecs/integration-build/1-AP-deploy-app-mt-it.txt' ) script { currentBuild.description = """Link to Artifactory""" } echo '30_eval_app_build.bat' bat """ cd CI\\Support set PATH_TOOLSGENERIC=${agentBuildPathToolsGeneric} call 30_eval_app_build.bat echo ErrorLevel: %ERRORLEVEL% if %ERRORLEVEL% EQU 0 ( echo 30_eval_app_build.bat Success, ErrorLevel is: %ERRORLEVEL% exit /b %ERRORLEVEL% ) else ( echo 30_eval_app_build.bat Failure, ErrorLevel is: %ERRORLEVEL% exit /b %ERRORLEVEL% ) """ } } } stage('nightly-build') { agent {label "${agentBuild}"} when { expression {env._PLANNAME == 'nightly-build'} } steps { bat """ cd CI\\Support set PATH_TOOLSGENERIC=${agentBuildPathToolsGeneric} call 00_integration.bat echo ErrorLevel: %ERRORLEVEL% if %ERRORLEVEL% EQU 0 ( echo 00_integration.bat Success, ErrorLevel is: %ERRORLEVEL% ) else ( echo 00_integration.bat Failure, ErrorLevel is: %ERRORLEVEL% exit /b %errorlevel% ) """ } post { always { echo "Deploy to Artifactory on Node: ${NODE_NAME}" rtUpload ( serverId: 'artifactory-al-prod', specPath: '${WORKSPACE}/CI/ArtifactorySpecs/nightly-build/1-AP-deploy-app-mt-it.txt' ) script { currentBuild.description = """Link to Artifactory""" } rtUpload ( serverId: 'artifactory-al-prod', specPath: '${WORKSPACE}/CI/ArtifactorySpecs/nightly-build/1-AP-deploy-app-mt-it-latest.txt' ) echo '30_eval_app_build.bat' bat """ cd CI\\Support set PATH_TOOLSGENERIC=${agentBuildPathToolsGeneric} call 30_eval_app_build.bat echo ErrorLevel: %ERRORLEVEL% if %ERRORLEVEL% EQU 0 ( echo 30_eval_app_build.bat Success, ErrorLevel is: %ERRORLEVEL% exit /b %ERRORLEVEL% ) else ( echo 30_eval_app_build.bat Failure, ErrorLevel is: %ERRORLEVEL% exit /b %ERRORLEVEL% ) """ } } } stage('release-candidate-build') { agent {label "${agentBuild}"} when { expression {env._PLANNAME == 'release-candidate-build'} } steps { bat """ git status git stash git checkout ${env.BRANCH_NAME} git stash apply git status git config --list git remote add central ${remoteRepoUrl} echo set configurations git config --global user.email "" git config --global user.name "Jenkins Agent" git fetch central echo create and push tag git tag -a ${env._USERINPUTSWLABEL} -m "Created by Jenkins Agent" git push central --tags git status """ bat """ REM Tailor: adapt path to CfgId folder of Your project cd ${pathToCFGID} echo "${env._USERINPUTSWLABEL}" > CFGID_CfgInfoVersion.txt.h echo "${env.userInputSWTTNR}" > CfgId_CfgInfoPartNo.txt.h """ bat """ cd CI\\Support set PATH_TOOLSGENERIC=${agentBuildPathToolsGeneric} call 00_integration.bat echo ErrorLevel: %ERRORLEVEL% if %ERRORLEVEL% EQU 0 ( echo 00_integration.bat Success, ErrorLevel is: %ERRORLEVEL% ) else ( echo 00_integration.bat Failure, ErrorLevel is: %ERRORLEVEL% exit /b %errorlevel% ) """ } post { always { echo "Deploy to Artifactory on Node: ${NODE_NAME}" rtUpload ( serverId: 'artifactory-al-prod', specPath: '${WORKSPACE}/CI/ArtifactorySpecs/release-candidate-build/1-AP-deploy-app-mt-it.txt' ) script { currentBuild.description = """Link to Artifactory
${env._USERINPUTSWLABEL} ${env.userInputSWTTNR}""" } echo '30_eval_app_build.bat' bat """ cd CI\\Support set PATH_TOOLSGENERIC=${agentBuildPathToolsGeneric} call 30_eval_app_build.bat echo ErrorLevel: %ERRORLEVEL% if %ERRORLEVEL% EQU 0 ( echo 30_eval_app_build.bat Success, ErrorLevel is: %ERRORLEVEL% exit /b %ERRORLEVEL% ) else ( echo 30_eval_app_build.bat Failure, ErrorLevel is: %ERRORLEVEL% exit /b %ERRORLEVEL% ) """ } } } stage('smoke test') { agent {label "${agentSmokeTest}"} when { expression {env._PLANNAME == 'integration-build' || env._PLANNAME == 'nightly-build' || env._PLANNAME == 'release-candidate-build'} } steps { echo "smoke test running on: ${NODE_NAME}" echo "Resolve from Artifactory on Node: ${NODE_NAME}" rtDownload ( serverId: 'artifactory-al-prod', specPath: "${WORKSPACE}/CI/ArtifactorySpecs/${env._PLANNAME}/2-AP-resolve-smoke-test.txt" ) // Workaround: wait... make sure all downloads are available sleep 90 bat """ echo Content of ArtifactoryDownloads folder: cd ArtifactoryDownloads\\${env.__BUILDOUTPUTBIN} dir """ lock("${NODE_NAME}LockSmokeTest") { bat """ echo Create file with link to the downloaded files from Artifactory echo|set /P="${WORKSPACE}\\ArtifactoryDownloads\\${env._BUILDOUTPUTBIN}">C:\\ExamShare\\SpecPath.txt exit 0 """ echo "Run Smoke Test" bat """ cd CI\\SmokeTest\\EXAM call build-plan-simulation.bat """ } echo "Deploy to Artifactory on Node: ${NODE_NAME}" rtUpload ( serverId: 'artifactory-al-prod', specPath: "${WORKSPACE}/CI/ArtifactorySpecs/${env._PLANNAME}/3-AP-deploy-smoke-test.txt" ) junit '**/reports/junit-test-report.xml' cleanWs() } } } post { always { node("${agentBuild}") { echo 'One way or another, execution has finished' cleanWs() emailext ( body: """

Build status: ${currentBuild.result}.


Jenkins build output: ${env.JOB_NAME} ${env._PLANNAME}#${env.BUILD_NUMBER}


Link to Artifactory: ${env._ARTIFACTORY_URL_BROWSER}""", mimeType: "text/html", to: "mark.strecker@marelli.com", subject: "ALJenkins: ${env.JOB_NAME} - ${env._PLANNAME} - #${env.BUILD_NUMBER} - ${currentBuild.result}" ) } } success { node("${agentBuild}") { echo 'I succeeded!' } } unstable { node("${agentBuild}") { echo 'I am unstable :/' } } failure { node("${agentBuild}") { echo 'I failed :(' } } changed { node("${agentBuild}") { echo 'Things were different before...' } } } }