-
Notifications
You must be signed in to change notification settings - Fork 176
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CI JJOB Tests using CMake #3214
base: develop
Are you sure you want to change the base?
Changes from all commits
987ae5b
61fcf83
f5f6595
cbe3bab
6a50e14
bcebeca
be7a890
2811629
70a8183
72e5a9c
1f1fcd6
ee27b02
bc76ddf
38838a6
d18ad01
ef0e066
519a919
f813a1b
8238228
bf579ee
28ef1af
374927f
8b4fc4f
ce37d86
d4e3266
bb12cda
f78181c
46cddb7
d6c3a49
434f869
99df88d
e186173
c4a2780
0183667
3088bff
9d06df7
674f8d6
68ca6ee
f7bbd40
36d497e
808a4cf
81e640f
a1d0f20
2cbf4ee
687217f
55766bd
f69fb68
3cc83c6
e1e1858
5ce988f
cefaccd
bec03d9
5f9451b
74fbf45
19600f1
2caa229
749e54f
75450e1
0fc5d76
ea01737
e9c46f1
2602166
1950af4
c691c0e
276a9bd
283000e
b2a6fec
9525c74
74f7268
5cd1c5f
c132786
87674f2
e873722
32c5f87
128d0e6
abb2952
1d54caf
2532576
0967f10
8231519
30466b9
3deeb41
099a2cb
94dd64e
a98d55d
29517e3
60a6136
b977e52
95be9f2
e9b0b6a
a72827c
4f010a4
b79d445
16cd19f
fffb13d
5c5ac0f
06c8e8f
edde418
d68b02e
b0602bc
30b3f3a
42084e7
8d71151
cf7be28
a49a642
466831d
2d18461
53b13e3
4ee8d81
b3518ca
54f633b
a182c44
fd8a8bc
472d89c
45d2901
8ca4d7a
91d76e3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
# ------------------------------------------------------------------------- # | ||
# Global Workflow | ||
# ------------------------------------------------------------------------- # | ||
|
||
# Check for minimum cmake requirement | ||
cmake_minimum_required( VERSION 3.20 FATAL_ERROR ) | ||
|
||
project(global_workflow VERSION 1.0.0) | ||
|
||
include(GNUInstallDirs) | ||
enable_testing() | ||
|
||
# Build type. | ||
if(NOT CMAKE_BUILD_TYPE MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)$") | ||
message(STATUS "Setting build type to 'Release' as none was specified.") | ||
set(CMAKE_BUILD_TYPE | ||
"Release" | ||
CACHE STRING "Choose the type of build." FORCE) | ||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" | ||
"MinSizeRel" "RelWithDebInfo") | ||
endif() | ||
|
||
# Build global-workflow source codes | ||
# add_subdirectory(sorc) | ||
|
||
# Setup tests | ||
add_subdirectory(ctests) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
if (NOT DEFINED HOMEgfs) | ||
set(HOMEgfs ${PROJECT_SOURCE_DIR}) | ||
endif() | ||
|
||
if (DEFINED ENV{RUNTESTS} AND NOT DEFINED RUNTESTS) | ||
set(RUNTESTS $ENV{RUNTESTS} CACHE FILEPATH "Path to global-workflow RUNTESTS directory") | ||
else() | ||
set(RUNTESTS ${CMAKE_CURRENT_BINARY_DIR}/RUNTESTS) | ||
endif() | ||
|
||
if (DEFINED ENV{HPC_ACCOUNT} AND NOT DEFINED HPC_ACCOUNT) | ||
set(HPC_ACCOUNT $ENV{HPC_ACCOUNT} CACHE STRING "Local location of glowbal-workflow initialconditions") | ||
endif() | ||
|
||
if (NOT DEFINED HPC_ACCOUNT) | ||
message(FATAL_ERROR "HPC_ACCOUNT must be set") | ||
return() | ||
endif() | ||
|
||
if (DEFINED ENV{ISCDIR_ROOT} AND NOT DEFINED ICSDIR_ROOT) | ||
set(ICSDIR_ROOT $ENV{HPC_ACCOUNT} CACHE STRING "Local path to global-workflow initialconditions") | ||
endif() | ||
if(NOT DEFINED ICSDIR_ROOT) | ||
message(FATAL_ERROR "ICSDIR_ROOT must be set") | ||
return() | ||
endif() | ||
|
||
if (DEFINED ENV{STAGED_FUNCTIONAL_TEST_DIR} AND NOT DEFINED STAGED_FUNCTIONAL_TEST_DIR) | ||
set(STAGED_FUNCTIONAL_TEST_DIR $ENV{STAGED_FUNCTIONAL_TEST_DIR} CACHE STRING "Local path to global-workflow staged data for functional test") | ||
endif() | ||
if(NOT DEFINED STAGED_FUNCTIONAL_TEST_DIR) | ||
message(FATAL_ERROR "STATED_FUNCTIONAL_TEST_DIR must be set") | ||
return() | ||
endif() | ||
|
||
message(STATUS "MACHINE_ID: '${MACHINE_ID}'") | ||
message(STATUS "gw: global-workflow baselines will be used from: '${HOMEgfs}'") | ||
message(STATUS "gw: global-workflow tests will be run at: '${RUNTESTS}'") | ||
message(STATUS "gw: global-workflow tests will use the allocation: '${HPC_ACCOUNT}'") | ||
message(STATUS "gw: global-workflow tests will use ICSDIR_ROOT: '${ICSDIR_ROOT}'") | ||
|
||
# Prepare test scripts | ||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/setup.sh.in | ||
${CMAKE_CURRENT_BINARY_DIR}/scripts/setup.sh @ONLY) | ||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/stage.sh.in | ||
${CMAKE_CURRENT_BINARY_DIR}/scripts/stage.sh @ONLY) | ||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/execute.sh.in | ||
${CMAKE_CURRENT_BINARY_DIR}/scripts/execute.sh @ONLY) | ||
|
||
function(AddJJOBTest) | ||
|
||
set(prefix ARG) | ||
set(novals NOTRAPFPE NOVALGRIND) | ||
set(singlevals CASE JOB TEST_DATE) | ||
set(multivals TEST_DEPENDS) | ||
|
||
cmake_parse_arguments(${prefix} | ||
"${novals}" "${singlevals}" "${multivals}" | ||
${ARGN}) | ||
|
||
set(TEST_NAME ${ARG_CASE}_${ARG_JOB}) | ||
set(CASE_PATH ${HOMEgfs}/ci/cases/pr) | ||
set(CASE_YAML ${CASE_PATH}/${ARG_CASE}.yaml) | ||
|
||
add_test(NAME test_${TEST_NAME}_setup | ||
COMMAND ./setup.sh ${TEST_NAME} ${CASE_YAML} ${ARG_TEST_DATE} | ||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) | ||
set_tests_properties(test_${TEST_NAME}_setup PROPERTIES LABELS "${ARG_CASE};${ARG_JOB}") | ||
|
||
add_test(NAME test_${TEST_NAME}_stage | ||
COMMAND ./stage.sh ${TEST_NAME} ${ARG_TEST_DATE} | ||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) | ||
set_tests_properties(test_${TEST_NAME}_stage PROPERTIES DEPENDS test_${TEST_NAME}_setup LABELS "${ARG_CASE};${ARG_JOB}") | ||
|
||
add_test(NAME test_${TEST_NAME}_execute | ||
COMMAND ./execute.sh ${TEST_NAME} ${ARG_JOB} ${ARG_TEST_DATE} | ||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) | ||
set_tests_properties(test_${TEST_NAME}_execute PROPERTIES DEPENDS test_${TEST_NAME}_stage LABELS "${ARG_CASE};${ARG_JOB}") | ||
|
||
add_test(NAME test_${TEST_NAME}_validate | ||
COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${TEST_NAME}") | ||
set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${ARG_CASE};${ARG_JOB}") | ||
endfunction() | ||
|
||
AddJJOBTest( | ||
CASE "C48_ATM" | ||
JOB "gfs_fcst_seg0" | ||
TEST_DATE "2021032312" | ||
) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
input_files: | ||
mkdir: | ||
- "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input" | ||
copy: | ||
- ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_ctrl.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_ctrl.nc"] | ||
- ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile1.nc"] | ||
- ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile2.nc"] | ||
- ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile3.nc"] | ||
- ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile4.nc"] | ||
- ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}///gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile5.nc"] | ||
- ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile6.nc"] | ||
- ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile1.nc"] | ||
- ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile2.nc"] | ||
- ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile3.nc"] | ||
- ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile4.nc"] | ||
- ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile5.nc"] | ||
- ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile6.nc"] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
#!/usr/bin/env bash | ||
|
||
set -xe | ||
|
||
TEST_NAME=${1:?"Name of the test is required"} | ||
JOB=${2:?"Job name is required"} | ||
# TODO - adding idate by hand for now, need to get this from the test somehow | ||
idate=$3 | ||
|
||
#TODO - add rocotoboot_dryrun to repo some how | ||
rocotoboot_dryrun=/work2/noaa/global/mterry/rocoto_dryrun/bin/rocotoboot | ||
CASEDIR="@CMAKE_CURRENT_BINARY_DIR@/RUNTESTS/EXPDIR/${TEST_NAME}" | ||
cd "${CASEDIR}" | ||
rm -f ./*.db | ||
rm -f ./jobcard | ||
|
||
job_card=$(yes | "${rocotoboot_dryrun}" -d "${TEST_NAME}.db" -w "${TEST_NAME}.xml" -v 10 -c "${idate}00" -t "${JOB}" 2> jobcard) || true | ||
cat jobcard | sed '/^{{\|^}}/d' | sed '1d' > "${TEST_NAME}.sub" || true | ||
Check notice Code scanning / shellcheck Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead. Note
Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
|
||
|
||
#TODO - Generalize for batch system (hard coded to slurm) | ||
|
||
output=$(sbatch "${TEST_NAME}.sub") | ||
job_id=$(echo "${output}" | awk '{print $4}') | ||
echo "Job ${job_id} submitted for test ${TEST_NAME} with job name ${JOB}" | ||
stdout_file=$(scontrol show job "${job_id}" | grep StdOut | awk -F= '{print $2}') || true | ||
|
||
# Check the status of the Slurm job | ||
check_stdout_file() { | ||
last_line=$(tail -n 1 "${stdout_file}") | ||
if [[ "${last_line}" == "End"* && "${last_line}" == *"error code 0"* ]]; then | ||
echo "Job ${job_id} completed successfully with END and error code 0." | ||
exit 0 | ||
else | ||
echo "Job ${job_id} did not complete successfully. Last line: ${last_line}" | ||
exit 1 | ||
fi | ||
} | ||
|
||
# Check the status of the Slurm job | ||
timeout=0 | ||
TIMEOUT=60 | ||
while true; do | ||
job_status=$(squeue --job "${job_id}" --noheader --format "%T") | ||
if [[ "${job_status}" == "COMPLETED" ]]; then | ||
echo "Job ${job_id} completed successfully." | ||
check_stdout_file | ||
elif [[ "${job_status}" == "FAILED" || "${job_status}" == "CANCELLED" || "${job_status}" == "TIMEOUT" ]]; then | ||
echo "Job ${job_id} failed with status: ${job_status}." | ||
exit 1 | ||
elif [[ -z "${job_status}" ]]; then | ||
echo "Job ${job_id} is no longer in the queue. Checking stdout file." | ||
check_stdout_file | ||
else | ||
echo "Job ${job_id} is still running with status: ${job_status}." | ||
sleep 60 # Check every 60 seconds | ||
timeout=$((timeout+1)) | ||
if [[ "${timeout}" -gt "${TIMEOUT}" ]]; then | ||
echo "Job ${job_id} has been running for more than ${TIMEOUT} minutes. Exiting." | ||
exit 1 | ||
fi | ||
fi | ||
done |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
#!/usr/bin/env bash | ||
|
||
set -ux | ||
|
||
TEST_NAME=${1:?"Name of the test is required"} | ||
YAML_FILE=${2:?"Name of the CI yaml file for the test"} | ||
TEST_DATE=${3:?"idate of the test is required"} | ||
Check warning Code scanning / shellcheck TEST_DATE appears unused. Verify use (or export if used externally). Warning
TEST_DATE appears unused. Verify use (or export if used externally).
|
||
|
||
# CMake to fill these variables | ||
HOMEgfs="@PROJECT_SOURCE_DIR@" | ||
RUNTESTS="@RUNTESTS@" | ||
ICSDIR_ROOT="@ICSDIR_ROOT@" | ||
HPC_ACCOUNT="@HPC_ACCOUNT@" | ||
|
||
set +x | ||
source "${HOMEgfs}/workflow/gw_setup.sh" | ||
set -x | ||
|
||
pslot="${TEST_NAME}" \ | ||
RUNTESTS="${RUNTESTS}" \ | ||
ICSDIR_ROOT="${ICSDIR_ROOT}" \ | ||
HPC_ACCOUNT="${HPC_ACCOUNT}" \ | ||
"${HOMEgfs}/workflow/create_experiment.py" --yaml "${YAML_FILE}" --overwrite | ||
rc=$? | ||
if [[ "${rc}" -ne 0 ]]; then | ||
set +x | ||
echo "Failed to create test experiment for '${TEST_NAME}' with yaml file '${YAML_FILE}'" | ||
set -x | ||
exit "${rc}" | ||
fi | ||
|
||
exit 0 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
#!/usr/bin/env python3 | ||
|
||
import os, sys | ||
import shutil | ||
_here = os.path.dirname(__file__) | ||
_top = os.path.abspath(os.path.join(os.path.abspath(_here), '../../..')) | ||
sys.path.insert(0, _top) | ||
|
||
from argparse import ArgumentParser | ||
from pathlib import Path | ||
from wxflow import parse_j2yaml, FileHandler, AttrDict, Logger | ||
|
||
logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=False) | ||
|
||
def parse_args(): | ||
""" | ||
Parse command line arguments. | ||
|
||
Returns | ||
------- | ||
argparse.Namespace | ||
The parsed command line arguments. | ||
""" | ||
description = """Arguments for creating and updating error log files | ||
""" | ||
parser = ArgumentParser(description=description) | ||
|
||
parser.add_argument('-y', '--yaml', help='full path to yaml file describing the job test configuration', type=Path, required=True) | ||
return parser.parse_args() | ||
|
||
if __name__ == '__main__': | ||
|
||
# Parse command line arguments | ||
args = parse_args() | ||
data = {'TEST_DATE': os.environ.get('TEST_DATE')} | ||
case_cfg = parse_j2yaml(path=args.yaml, data=data) | ||
FileHandler(case_cfg.input_files).sync() |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
#!/usr/bin/env bash | ||
|
||
set -ux | ||
|
||
TEST_NAME=${1:?"Name of the test is required"} | ||
TEST_DATE=${2:?"idate of the test is required"} | ||
|
||
# CMake to fill these variables | ||
STAGED_FUNCTIONAL_TEST_DIR="@STAGED_FUNCTIONAL_TEST_DIR@" | ||
Check warning Code scanning / shellcheck STAGED_FUNCTIONAL_TEST_DIR appears unused. Verify use (or export if used externally). Warning
STAGED_FUNCTIONAL_TEST_DIR appears unused. Verify use (or export if used externally).
|
||
RUNTESTS="@RUNTESTS@" | ||
Check warning Code scanning / shellcheck RUNTESTS appears unused. Verify use (or export if used externally). Warning
RUNTESTS appears unused. Verify use (or export if used externally).
Check warning Code scanning / shellcheck RUNTESTS appears unused. Verify use (or export if used externally). Warning
RUNTESTS appears unused. Verify use (or export if used externally).
|
||
HOMEgfs="@PROJECT_SOURCE_DIR@" | ||
|
||
# Load the runtime environment for this script (needs wxflow and its dependencies) | ||
set +x | ||
source "${HOMEgfs}/workflow/gw_setup.sh" | ||
rc=$? | ||
[[ "${rc}" -ne 0 ]] && exit "${status}" | ||
set -x | ||
PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${HOMEgfs}/sorc/wxflow/src" | ||
export PYTHONPATH | ||
|
||
INPUTS_YAML="${HOMEgfs}/ctests/cases/${TEST_NAME}.yaml" | ||
|
||
"${HOMEgfs}/ctests/scripts/stage.py" --yaml "${INPUTS_YAML}" | ||
rc=$? | ||
if [[ "${rc}" -ne 0 ]]; then | ||
set +x | ||
echo "Failed to stage inputs for '${TEST_NAME}' with '${INPUTS_YAML}'" | ||
set -x | ||
exit "${rc}" | ||
fi | ||
|
||
exit 0 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
#!/usr/bin/env bash | ||
echo "This is a stub for the validate script." |
Check warning
Code scanning / shellcheck
job_card appears unused. Verify use (or export if used externally). Warning