Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
7544ee8
Land surface upgrades for HR4 (#2354)
HelinWei-NOAA Jul 24, 2024
e6ec3d1
update CMEPS (#2352)
DeniseWorthen Jul 26, 2024
b5a1976
Fix dumpfields=true option by using ESMF_FieldBundleWrite (#2355)
DusanJovic-NOAA Jul 30, 2024
ee4f19a
Add omega calculation and change LSM diag option to RTs (#2373)
dpsarmie Aug 1, 2024
74abf0f
initialize scalar field when created for non-CSG (cube-sphere grid) c…
DeniseWorthen Aug 6, 2024
fcf0022
In fv3atm: convert GFS DDTs from blocked data structures to contiguou…
climbfuji Aug 8, 2024
a1143cc
Addition of python script to add yaml-based test option + Creation of…
jkbk2004 Aug 12, 2024
6d0454c
update to MOM6 main 20240729 commit (gfdl-to-main-2024-05-31) (#2381)
jiandewang Aug 17, 2024
b3cdd8e
Allow use of downscaled warmstart files for cpld_control_sfs test (#2…
DeniseWorthen Aug 21, 2024
fcc9f84
sync with head of NOAA-EMC UPP develop (#2326)
SamuelTrahanNOAA Aug 23, 2024
94a3cd7
Unify CDEPS gfs, cfsr, and gefs datm datamodes + Improve error checki…
NickSzapiro-NOAA Aug 27, 2024
1c4fcf1
Combination for CCPP-physics #213 and #218 (H2O scheme refactor and C…
grantfirl Aug 29, 2024
9ae4f54
Update CMEPS; fix aux history functionality for float variable type; …
DeniseWorthen Sep 3, 2024
6a4e09e
update mom6 to its main repo. 20240824 commit (FMA) (#2412)
jiandewang Sep 9, 2024
7062191
Update damping and time step parameters (#2363)
dpsarmie Sep 13, 2024
25ee7f6
Fire Coupling FV3ATM and Community Fire Behavior Model (#2220)
danrosen25 Sep 17, 2024
38a29a6
Update CICE and use EMC/CICE:develop branch from CICE-Consortium:main…
NickSzapiro-NOAA Sep 19, 2024
2ccc549
Bump libraries on WCOSS2 to ip/4.0.0 w3emc/2.12.0 and all platforms …
BrianCurtis-NOAA Sep 25, 2024
bad50ef
Support IntelLLVM compiler (#2224)
DusanJovic-NOAA Oct 1, 2024
e3750c2
Add forecast day output for CICE via timestep stream (#2437)
NickSzapiro-NOAA Oct 5, 2024
f3ce169
Add GFDL Land Model 4.0 (#2146)
JustinPerket Oct 11, 2024
db1781a
First reconciliation PR from production/RRFS.v1 (#2449)
grantfirl Oct 18, 2024
be4544e
[develop]: Documentation updates + Submodule pointer update (fv3atm, …
gspetro-NOAA Oct 23, 2024
547be6d
GW-RT global_control.nml modifications (#2425)
dpsarmie Oct 31, 2024
f9c91d3
Fix/cpld sfs rt + Pull in units updates from FV3 #2467 (#2475)
dpsarmie Nov 5, 2024
058f073
Enable some of the intel llvm tests in rt conf + Second reconciliatio…
DusanJovic-NOAA Nov 8, 2024
29c2703
Add developmental test cases: idealized baroclinic wave and 2020 July…
ulmononian Nov 12, 2024
6b0f516
Update WW3 for PIO/netCDF restarts (#2445)
DeniseWorthen Nov 14, 2024
c0367fd
Add soil temperature and moisture IAU (#2415)
tsga Nov 19, 2024
33b3c18
Update inline post + Add documentation for HSD cases in tests-dev #24…
WenMeng-NOAA Nov 21, 2024
144ccb0
Third reconciliation PR from production/RRFS.v1 (#2482)
grantfirl Nov 25, 2024
a3c3bb5
Update CICE (2024-11) including pio_finalize bug fix (#2505)
NickSzapiro-NOAA Dec 3, 2024
63ace62
Fourth reconciliation PR from production/RRFS.v1 + Add PIO switch to …
grantfirl Dec 6, 2024
409bc85
Flexible restart write times (restart_fh) for med, ocn, ice, wav (#2419)
NickSzapiro-NOAA Dec 11, 2024
6ec6b45
Sync with ESCOMP/CDEPS (2024-12) + Update global_control.nml.IN based…
NickSzapiro-NOAA Dec 16, 2024
e119370
Gaea C6 support for UFSWM (#2448)
BrianCurtis-NOAA Dec 18, 2024
2950089
Sync with ESCOMP/CDEPS (2024-12-16) + Add support for traditional thr…
NickSzapiro-NOAA Dec 23, 2024
241dd8e
Fifth reconciliation PR from production/RRFS.v1 (#2485)
grantfirl Dec 30, 2024
76471dc
Seventh reconciliation PR from production/RRFS.v1 (#2530)
grantfirl Jan 3, 2025
5324d64
Eighth reconciliation PR from production/RRFS.v1 (#2531)
grantfirl Jan 7, 2025
c7412fa
Fix ugwpv1 timing / remove some extended WLCLK cases & PR#2491 Update…
dpsarmie Jan 13, 2025
3a5e52e
Ninth reconciliation PR from production/RRFS.v1 + Add CCPP host varia…
grantfirl Jan 17, 2025
33cde4b
Modifications for ufs-coastal app; update MOM6 to its main repo. 2025…
DeniseWorthen Jan 21, 2025
b9d2bec
Feature epic metrics (#2536)
BruceKropp-Raytheon Jan 22, 2025
0682f90
Updates for component NoahMP land model (#2387)
uturuncoglu Jan 28, 2025
a498735
Updates to radiation, cloud, and land processes for improved surface …
rhaesung Feb 3, 2025
ee3d52d
Add Land IAU parameters to default_vars / control_c48_lnd_iau modific…
dpsarmie Feb 5, 2025
148d95d
adding ufs hash ee3d52d
kayeekayee Feb 26, 2025
39b10de
- Merge branch 'temp-ufs' into 2025Feb05_ee3d52d
kayeekayee Feb 27, 2025
94dfdeb
update WW3 hash 8e67627
kayeekayee Feb 27, 2025
ca8916f
Update hashes:
kayeekayee Feb 27, 2025
c270b9e
Replace <scheme>h2ophys</scheme> to <scheme>GFS_photochemistry</schem…
kayeekayee Feb 28, 2025
3b4d2cd
Fixed paths
kayeekayee Feb 28, 2025
3ba9586
remove bad CICE
kayeekayee Feb 28, 2025
c932142
add CICE
kayeekayee Feb 28, 2025
7932896
remove bad MOM6
kayeekayee Feb 28, 2025
c82e2e2
add MOM6
kayeekayee Feb 28, 2025
47689d1
Fix runtime error
kayeekayee Mar 3, 2025
074022d
update submodule paths
kayeekayee Mar 4, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
221 changes: 221 additions & 0 deletions .cicd/Jenkinsfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
matchedNode = []
generateBaselineNode = []
for (label in pullRequest.labels) {
listOfLabelNodeNames = jenkins.model.Jenkins.instance.nodes.collect {
node -> node.getLabelString().contains(label) ? node.name : null

if ((label.matches(node.getLabelString()+"-(.*)"))) {
matchedNode += node.getLabelString()
}

if ((label.matches(node.getLabelString()+"(.*)-BL"))) {
generateBaselineNode += node.getLabelString()
}
}
}

modifiedLabels = matchedNode.collect{"'" + it + "'"}
baselineLabels = generateBaselineNode.collect{"'" + it + "'"}
def generateStage(nodeLabel) {
return {
stage("Initialize on ${nodeLabel.replaceAll("'","")}") {
node(nodeLabel) {
script {
currentBuild.displayName = "#${BUILD_NUMBER} ${nodeLabel.replaceAll("'","")} test=${params.WM_OPERATIONAL_TESTS}"
}
cleanWs()
checkout scm
script {
def UFS_PLATFORM = nodeLabel.replaceAll("'","")
echo "nodeLabel=${nodeLabel} NODE_NAME=${NODE_NAME} UFS_PLATFORM=${UFS_PLATFORM} UFS_COMPILER=${env.UFS_COMPILER}"
sh 'bash --login "${WORKSPACE}/.cicd/scripts/wm_init.sh"'
sh "STAGE_NAME='${env.STAGE_NAME}' " + 'bash --login "${WORKSPACE}/.cicd/scripts/disk_usage.sh"'
s3Upload consoleLogLevel: 'INFO', dontSetBuildResultOnFailure: false, dontWaitForConcurrentBuildCompletion: false, entries: [[bucket: 'noaa-epic-prod-jenkins-artifacts', excludedFile: '', flatten: false, gzipFiles: false, keepForever: false, managedArtifacts: true, noUploadOnFailure: false, selectedRegion: 'us-east-1', showDirectlyInBrowser: false, sourceFile: "${UFS_PLATFORM}-*-time-wm_init.json", storageClass: 'STANDARD', uploadFromSlave: false, useServerSideEncryption: false]], pluginFailureResultConstraint: 'FAILURE', profileName: 'main', userMetadata: []
s3Upload consoleLogLevel: 'INFO', dontSetBuildResultOnFailure: false, dontWaitForConcurrentBuildCompletion: false, entries: [[bucket: 'noaa-epic-prod-jenkins-artifacts', excludedFile: '', flatten: false, gzipFiles: false, keepForever: false, managedArtifacts: true, noUploadOnFailure: false, selectedRegion: 'us-east-1', showDirectlyInBrowser: false, sourceFile: "${UFS_PLATFORM}-*-disk-usageInit*.csv", storageClass: 'STANDARD', uploadFromSlave: false, useServerSideEncryption: false]], pluginFailureResultConstraint: 'FAILURE', profileName: 'main', userMetadata: []
}
}
}
stage("Build on ${nodeLabel.replaceAll("'","")}") {
if (params.WM_BUILD == true ) {
node(nodeLabel) {
script {
def UFS_PLATFORM = nodeLabel.replaceAll("'","")
//currentBuild.displayName = "#${BUILD_NUMBER} ${nodeLabel.replaceAll("'","")} ${UFS_COMPILER}"
currentBuild.description = "build ${UFS_PLATFORM}-${UFS_COMPILER}"

echo "Building on ${nodeLabel}"
sh 'bash --login "${WORKSPACE}/.cicd/scripts/wm_build.sh"'
sh "STAGE_NAME='${env.STAGE_NAME}' " + 'bash --login "${WORKSPACE}/.cicd/scripts/disk_usage.sh"'
s3Upload consoleLogLevel: 'INFO', dontSetBuildResultOnFailure: false, dontWaitForConcurrentBuildCompletion: false, entries: [[bucket: 'noaa-epic-prod-jenkins-artifacts', excludedFile: '', flatten: false, gzipFiles: false, keepForever: false, managedArtifacts: true, noUploadOnFailure: false, selectedRegion: 'us-east-1', showDirectlyInBrowser: false, sourceFile: "${UFS_PLATFORM}-*-time-wm_build.json", storageClass: 'STANDARD', uploadFromSlave: false, useServerSideEncryption: false]], pluginFailureResultConstraint: 'FAILURE', profileName: 'main', userMetadata: []
s3Upload consoleLogLevel: 'INFO', dontSetBuildResultOnFailure: false, dontWaitForConcurrentBuildCompletion: false, entries: [[bucket: 'noaa-epic-prod-jenkins-artifacts', excludedFile: '', flatten: false, gzipFiles: false, keepForever: false, managedArtifacts: true, noUploadOnFailure: false, selectedRegion: 'us-east-1', showDirectlyInBrowser: false, sourceFile: "${UFS_PLATFORM}-*-disk-usageBuild.csv", storageClass: 'STANDARD', uploadFromSlave: false, useServerSideEncryption: false]], pluginFailureResultConstraint: 'FAILURE', profileName: 'main', userMetadata: []
}
}
} else {
echo "Building on ${nodeLabel} skipped"
}
}
stage("Test on ${nodeLabel.replaceAll("'","")}") {
if (params.WM_OPERATIONAL_TESTS != 'none' ) {
node(nodeLabel) {
script {
def UFS_PLATFORM = nodeLabel.replaceAll("'","")
try {
echo "Running Tests on ${nodeLabel}"
if (baselineLabels.contains(nodeLabel)) {
sh "WM_CREATE_BASELINE=true " + 'bash --login "${WORKSPACE}/.cicd/scripts/wm_test.sh"'
}
else {
sh "WM_CREATE_BASELINE=false " + 'bash --login "${WORKSPACE}/.cicd/scripts/wm_test.sh"'
}
s3Upload consoleLogLevel: 'INFO', dontSetBuildResultOnFailure: false, dontWaitForConcurrentBuildCompletion: false, entries: [[bucket: 'noaa-epic-prod-jenkins-artifacts', excludedFile: '', flatten: false, gzipFiles: false, keepForever: false, managedArtifacts: true, noUploadOnFailure: false, selectedRegion: 'us-east-1', showDirectlyInBrowser: false, sourceFile: "wm_test_results-*-*.txt", storageClass: 'STANDARD', uploadFromSlave: false, useServerSideEncryption: false]], pluginFailureResultConstraint: 'FAILURE', profileName: 'main', userMetadata: []
}
catch(err) {
sh '''
export machine=${NODE_NAME}
export CHANGE_ID=${CHANGE_ID}
GIT_OWNER=$(echo $GIT_URL | cut -d '/' -f4)
GIT_REPO_NAME=$(echo $GIT_URL | cut -d '/' -f5 | cut -d '.' -f1)
set +x

echo "Testing concluded...removing labels for $machine from $GIT_URL"
echo "https://api.github.com/repos/${GIT_OWNER}/${GIT_REPO_NAME}/issues/${CHANGE_ID}/labels /{$machine-RT,$machine-BL}"
curl --silent -X DELETE -H "Accept: application/vnd.github.v3+json" -H "Authorization: Bearer ${GITHUB_TOKEN}" https://api.github.com/repos/${GIT_OWNER}/${GIT_REPO_NAME}/issues/${CHANGE_ID}/labels/{$machine-RT,$machine-BL}
'''
currentBuild.result = 'FAILURE'
}

sh '''
export machine=${NODE_NAME}
export CHANGE_ID=${CHANGE_ID}
cd ${WORKSPACE}/tests
export machine_name_logs=$(echo $machine | awk '{ print tolower($1) }')
tar --create --gzip --verbose --dereference --file "${machine_name_logs}.tgz" ${WORKSPACE}/tests/logs/*.log
'''
s3Upload consoleLogLevel: 'INFO', dontSetBuildResultOnFailure: false, dontWaitForConcurrentBuildCompletion: false, entries: [[bucket: 'noaa-epic-prod-jenkins-artifacts', excludedFile: '', flatten: true, gzipFiles: false, keepForever: false, managedArtifacts: true, noUploadOnFailure: false, selectedRegion: 'us-east-1', showDirectlyInBrowser: false, sourceFile: "**/*tgz*", storageClass: 'STANDARD', uploadFromSlave: false, useServerSideEncryption: false]], pluginFailureResultConstraint: 'FAILURE', profileName: 'main', userMetadata: []

sh "STAGE_NAME='${env.STAGE_NAME}' " + 'bash --login "${WORKSPACE}/.cicd/scripts/disk_usage.sh"'
s3Upload consoleLogLevel: 'INFO', dontSetBuildResultOnFailure: false, dontWaitForConcurrentBuildCompletion: false, entries: [[bucket: 'noaa-epic-prod-jenkins-artifacts', excludedFile: '', flatten: false, gzipFiles: false, keepForever: false, managedArtifacts: true, noUploadOnFailure: false, selectedRegion: 'us-east-1', showDirectlyInBrowser: false, sourceFile: "${UFS_PLATFORM}-*-time-wm_test.json", storageClass: 'STANDARD', uploadFromSlave: false, useServerSideEncryption: false]], pluginFailureResultConstraint: 'FAILURE', profileName: 'main', userMetadata: []
s3Upload consoleLogLevel: 'INFO', dontSetBuildResultOnFailure: false, dontWaitForConcurrentBuildCompletion: false, entries: [[bucket: 'noaa-epic-prod-jenkins-artifacts', excludedFile: '', flatten: false, gzipFiles: false, keepForever: false, managedArtifacts: true, noUploadOnFailure: false, selectedRegion: 'us-east-1', showDirectlyInBrowser: false, sourceFile: "${UFS_PLATFORM}-*-disk-usageTest.csv", storageClass: 'STANDARD', uploadFromSlave: false, useServerSideEncryption: false]], pluginFailureResultConstraint: 'FAILURE', profileName: 'main', userMetadata: []

sh "[[ -d tests/logs ]] && cd tests/logs && tar --create --gzip --verbose --dereference --file ../../wm_test_logs-${UFS_PLATFORM}-${env.UFS_COMPILER}.tgz log_${UFS_PLATFORM}/* RegressionTests_${UFS_PLATFORM}.log || cat /dev/null > ../../wm_test_logs-${UFS_PLATFORM}-${env.UFS_COMPILER}.tgz"
s3Upload consoleLogLevel: 'INFO', dontSetBuildResultOnFailure: false, dontWaitForConcurrentBuildCompletion: false, entries: [[bucket: 'noaa-epic-prod-jenkins-artifacts', excludedFile: '', flatten: false, gzipFiles: false, keepForever: false, managedArtifacts: true, noUploadOnFailure: false, selectedRegion: 'us-east-1', showDirectlyInBrowser: false, sourceFile: "wm_test_logs-${UFS_PLATFORM}-${env.UFS_COMPILER}.tgz", storageClass: 'STANDARD', uploadFromSlave: false, useServerSideEncryption: false]], pluginFailureResultConstraint: 'FAILURE', profileName: 'main', userMetadata: []
}
}
} else {
echo "Running Tests on ${nodeLabel} skipped"
}
}
stage("Post from ${nodeLabel.replaceAll("'","")}") {
if (params.WM_OPERATIONAL_TESTS != 'none' ) {
node(nodeLabel) {
script {
def UFS_PLATFORM = nodeLabel.replaceAll("'","")
try {
echo "Post Results from ${nodeLabel}"
if (baselineLabels.contains(nodeLabel)) {
//sh 'bash --login "${WORKSPACE}/.cicd/scripts/post_test_results.sh ${NODE_NAME} BL"'
sh "WM_TEST_LABEL=BL " + 'bash --login "${WORKSPACE}/.cicd/scripts/post_test_results.sh"'
}
else {
sh "WM_TEST_LABEL=RT " + 'bash --login "${WORKSPACE}/.cicd/scripts/post_test_results.sh"'
}
}
catch(err) {
echo "Error: Post Results from ${nodeLabel}"
}
sh '''
export machine=${NODE_NAME}
export CHANGE_ID=${CHANGE_ID}
GIT_OWNER=$(echo $GIT_URL | cut -d '/' -f4)
GIT_REPO_NAME=$(echo $GIT_URL | cut -d '/' -f5 | cut -d '.' -f1)
set +x

echo "Testing concluded...removing label ${label} for ${machine} from ${GIT_URL}"
echo "https://api.github.com/repos/${GIT_OWNER}/${GIT_REPO_NAME}/issues/${CHANGE_ID}/labels /${machine}-${label}"
curl --silent -X DELETE -H "Accept: application/vnd.github.v3+json" -H "Authorization: Bearer ${GITHUB_TOKEN}" https://api.github.com/repos/${GIT_OWNER}/${GIT_REPO_NAME}/issues/${CHANGE_ID}/labels/{$machine-RT,$machine-BL}
'''
}
}
}
}
}
}

def parallelStagesMap = modifiedLabels.collectEntries {
["${it}" : generateStage(it)]
}

pipeline {
agent none
parameters {
booleanParam name: 'WM_BUILD', defaultValue: false, description: 'Whether to attempt to compile the model code tests'
// Regression Test Suite ?
choice(name: 'WM_OPERATIONAL_TESTS', choices: ['default', 'control_p8', 'cpld_control_p8', 'comprehensive', 'rt.sh', 'none'], description: 'Specify the suite of tests to run')
}
environment {
ACCNR = 'epic'
AWS_PROD_ACCOUNT_ID = credentials('AWS_PROD_ACCOUNT_ID')
AWS_PROD_SNS_TOPIC = credentials('AWS_PROD_SNS_TOPIC')
GITHUB_TOKEN = credentials('GithubJenkinsNew')
GIT_URL = 'https://github.com/ufs-community/ufs-weather-model.git'
UFS_COMPILER = 'intel'
}
stages {
stage('Launch SonarQube') {
steps {
script {
echo "BRANCH_NAME=${env.CHANGE_BRANCH}"
echo "FORK_NAME=${env.CHANGE_FORK}"
echo "CHANGE_URL=${env.CHANGE_URL}"
echo "CHANGE_ID=${env.CHANGE_ID}"
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 ?: ''),
string(name: 'CHANGE_URL', value: env.CHANGE_URL ?: ''),
string(name: 'CHANGE_ID', value: env.CHANGE_ID ?: '')
], wait: false
}
}
}
stage('Run Regression Tests in Parallel') {
steps {
script {
parallel parallelStagesMap
}
}
}
}
post {
success {
node('built-in') {
echo 'This will run only if successful.'
sh '''
aws sns publish --topic-arn "arn:aws:sns:us-east-1:${AWS_PROD_ACCOUNT_ID}:${AWS_PROD_SNS_TOPIC}" --region us-east-1 --message '{"version":"1.0","source":"custom","content":{"description":":sunny: Jenkins build *'"$JOB_NAME"' '"$BUILD_NUMBER"'* with *PR-'"$CHANGE_ID"'* *succeeded*"}}'
'''
}
}
failure {
node('built-in') {
echo 'This will run only if the run was marked as unstable.'
sh '''
aws sns publish --topic-arn "arn:aws:sns:us-east-1:${AWS_PROD_ACCOUNT_ID}:${AWS_PROD_SNS_TOPIC}" --region us-east-1 --message '{"version":"1.0","source":"custom","content":{"description":":warning: Jenkins build *'"$JOB_NAME"' '"$BUILD_NUMBER"'* with *PR-'"$CHANGE_ID"'* *failed!*"}}'
'''
}
}
always {
script {
// Trigger another job to collect all build statistics
CI_JOB_NAME=env.JOB_NAME.replace("/${env.BRANCH_NAME}","")
CI_BRANCH_NAME=env.BRANCH_NAME.replace("%2F","%252F")
echo "post: Triggering ufs-weather-model/ufs-wm-metrics job for ${CI_JOB_NAME} on branch build ${CI_BRANCH_NAME}/${env.BUILD_NUMBER} ..."

build job: '/ufs-weather-model/ufs-wm-metrics', parameters: [
string(name: 'CI_JOB_NAME', value: "${CI_JOB_NAME}"),
string(name: 'CI_BUILD_NUMBER', value: "${CI_BRANCH_NAME}/${env.BUILD_NUMBER}")
], wait: false

echo "#### post: ufs-weather-model/ufs-wm-metrics COMPLETE."
}
}
}
}
Loading