def commentMessage void setBuildStatus(String message, String state) { step([ $class: "GitHubCommitStatusSetter", reposSource: [$class: "ManuallyEnteredRepositorySource", url: "https://github.com/ufs-community/ufs-weather-model"], contextSource: [$class: "ManuallyEnteredCommitContextSource", context: "Jenkins-ci ORTs"], errorHandlers: [[$class: "ChangingBuildStatusErrorHandler", result: "UNSTABLE"]], statusResultSource: [ $class: "ConditionalStatusResultSource", results: [[$class: "AnyBuildResult", message: message, state: state]] ] ]); } def postGitHubCommentWithLogFile(commentMessage) { script { withCredentials([string(credentialsId: 'GithubJenkinsNew', variable: 'ACCESS_TOKEN')]) { def apiUrl = "https://api.github.com/repos/ufs-community/ufs-weather-model/issues/${env.CHANGE_ID}/comments" def curlCommand = "curl -s -H \"Authorization: token " + ACCESS_TOKEN + "\" \\\n" + "-X POST -d '{\"body\": \"" + commentMessage + "\"}' \\\n" + "\"" + apiUrl + "\"" def response = sh(script: curlCommand, returnStatus: true) if (response == 0) { echo "Comment added successfully to PR #${env.CHANGE_ID}" } else { error "Failed to add comment to PR #${env.CHANGE_ID}" } } } } pipeline { agent none options { disableConcurrentBuilds() overrideIndexTriggers(false) skipDefaultCheckout(true) } stages { stage('Launch SonarQube') { steps { script { build job: '/ufs-weather-model/ufs-wm-sonarqube', parameters: [ string(name: 'BRANCH_NAME', value: env.CHANGE_BRANCH ?: 'develop'), string(name: 'FORK_NAME', value: env.CHANGE_FORK ?: '') ], wait: false } } } stage('ORT') { matrix { axes { axis { name 'TEST_NAME' values 'control_p8', 'regional_control', 'cpld_control_nowave_noaero_p8' } axis { name 'TEST_CASE' values 'thr', 'mpi', 'dcp', 'rst', 'bit', 'dbg' } } excludes { exclude { axis { name 'TEST_NAME' values 'cpld_control_nowave_noaero_p8' } axis { name 'TEST_CASE' values 'mpi', 'dcp', 'bit', 'thr' // TODO: Remove thr case from cpld_control_nowave_noaero_p8 exclusions when it is passing again } } exclude { axis { name 'TEST_NAME' values 'regional_control' } axis { name 'TEST_CASE' values 'mpi', 'rst', 'bit', 'dbg' } } } agent { label 'docker-ufs-wm-ci' } environment { IMG_NAME = 'ci-test-weather' } stages { stage('Initialize') { steps { cleanWs() checkout scm } } stage('Build') { steps { sh 'docker build --build-arg test_name="" --build-arg build_case="" --no-cache --compress --file "${WORKSPACE}/tests/ci/Dockerfile" --tag "${IMG_NAME}" "${WORKSPACE}"' } } stage('Stage Test Data') { steps { sh 'docker volume rm --force DataVolume && docker run --detach --rm --volume DataVolume:/tmp noaaepic/input-data:20221101' } } stage('Test') { steps { sh 'docker run --rm --env test_name="${TEST_NAME}" --env run_case="${TEST_CASE}" --workdir /home/builder/ufs-weather-model/tests --volume DataVolume:/home/builder/data/NEMSfv3gfs --interactive --shm-size=32gb "${IMG_NAME}"' } } } post { always { sh ''' docker rmi -f "$(docker image ls | grep -E -m1 "${IMG_NAME}" | awk '{ print $3 }')" docker rmi -f "$(docker image ls | grep -E -m1 'noaaepic' | awk '{ print $3 }')" ''' } } } } } post { success { node('built-in') { setBuildStatus("Build succeeded", "SUCCESS"); } } failure { node('built-in') { setBuildStatus("Build failed", "FAILURE"); } } always { node('built-in') { script { def buildResult = currentBuild.resultIsBetterOrEqualTo("SUCCESS") ? "passed" : "failed" commentMessage = "Jenkins-ci ORTs ${buildResult}" postGitHubCommentWithLogFile(commentMessage) } } } } }