-
Notifications
You must be signed in to change notification settings - Fork 0
246 lines (206 loc) · 9.67 KB
/
wcrp_compliance_check.yml
File metadata and controls
246 lines (206 loc) · 9.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
name: wcrp_compliance_check
on:
pull_request:
branches:
workflow_dispatch:
# cancel running jobs if theres a newer push
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
wcrp-compliance-check:
runs-on: ubuntu-latest
defaults:
run:
shell: bash -l {0}
steps:
- name: Checkout Files
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Conda
uses: conda-incubator/setup-miniconda@v3
with:
activate-environment: fremor-wcrp
environment-file: environment.yaml
conda-remove-defaults: true
auto-activate: false
miniforge-version: latest
channels: conda-forge,noaa-gfdl
- name: Configure Conda
run: |
echo "removing main and r channels from defaults"
conda config --remove channels defaults || true
conda config --remove channels main || true
conda config --remove channels r || true
echo "setting strict channel priority"
conda config --set channel_priority strict
echo "printing conda config just in case"
conda config --show
- name: Install fremor
run: |
pip install .
# ── generate test outputs (moved earlier, most fragile step) ──
- name: Run tests to generate output files
id: run_tests
run: |
echo "Running test suite to generate NetCDF outputs..."
echo "Using --basetemp=tmp/pytest_basetemp to preserve pytest temp artifacts"
echo ""
# Create basetemp parent directory
mkdir -p tmp
# Run ALL output-generating tests in a single pytest invocation
# so that --basetemp is only wiped once and all outputs are preserved.
echo "=========================================="
echo "Running all output-generating tests..."
echo "=========================================="
pytest \
fremor/tests/test_cmor_run_subtool.py \
fremor/tests/test_cmor_run_subtool_further_examples.py \
fremor/tests/test_cmor_yamler_subtool.py::test_cmor_yaml_subtool_dry_run_false \
fremor/tests/test_cli.py \
-v --basetemp=tmp/pytest_basetemp || true
echo ""
echo "Test execution complete."
# ── gather and categorize outputs ──
- name: Gather test outputs into centralized directory
id: gather_outputs
run: |
bash .github/scripts/gather_test_outputs.sh tmp/qa_test_outputs tmp/pytest_basetemp
echo "output_dir=tmp/qa_test_outputs" >> $GITHUB_OUTPUT
total_files=$(find tmp/qa_test_outputs -name "*.nc" -type f | wc -l)
echo "file_count=${total_files}" >> $GITHUB_OUTPUT
cmip6_files=$(find tmp/qa_test_outputs/cmip6 -name "*.nc" -type f 2>/dev/null | wc -l || echo "0")
cmip7_files=$(find tmp/qa_test_outputs/cmip7 -name "*.nc" -type f 2>/dev/null | wc -l || echo "0")
echo "cmip6_count=${cmip6_files}" >> $GITHUB_OUTPUT
echo "cmip7_count=${cmip7_files}" >> $GITHUB_OUTPUT
echo ""
echo "Summary: total=${total_files} cmip6=${cmip6_files} cmip7=${cmip7_files}"
- name: Verify outputs were gathered
if: steps.gather_outputs.outputs.file_count == '0'
run: |
echo "::warning::No NetCDF files were found after running tests"
echo "This may indicate that tests did not run successfully or outputs were not generated"
echo ""
echo "Checking known test output directories for debugging..."
echo "--- fremor/tests/test_files/outdir ---"
find fremor/tests/test_files/outdir -name "*.nc" -type f 2>/dev/null || echo "(empty or missing)"
echo "--- fremor/tests/test_files/outdir_ppan_only ---"
find fremor/tests/test_files/outdir_ppan_only -name "*.nc" -type f 2>/dev/null || echo "(empty or missing)"
echo "--- tmp/pytest_basetemp ---"
find tmp/pytest_basetemp -name "*.nc" -type f 2>/dev/null || echo "(empty or missing)"
# ── install cc-plugin-wcrp (after tests, since it's not needed until now) ──
- name: Install cc-plugin-wcrp
if: steps.gather_outputs.outputs.file_count != '0'
run: |
pip install cc-plugin-wcrp
- name: Configure esgvoc controlled vocabularies
if: steps.gather_outputs.outputs.file_count != '0'
run: |
esgvoc config add cordex-cmip6
esgvoc config add cmip7
esgvoc config set project:branch=esgvoc
esgvoc install
- name: Verify cc-plugin-wcrp installation
if: steps.gather_outputs.outputs.file_count != '0'
run: |
echo "Listing available compliance-checker plugins..."
compliance-checker -l
# ── run WCRP compliance checks ──
- name: Run WCRP compliance checks on CMIP6 outputs
if: steps.gather_outputs.outputs.cmip6_count != '0'
run: |
echo "Running WCRP CMIP6 compliance checks..."
echo "CMIP6 files to check: ${{ steps.gather_outputs.outputs.cmip6_count }}"
echo ""
mkdir -p tmp/wcrp_compliance_reports
for ncfile in tmp/qa_test_outputs/cmip6/*.nc; do
if [ -f "$ncfile" ]; then
basename=$(basename "$ncfile" .nc)
echo ""
echo "=========================================="
echo "Checking: ${basename}"
echo "=========================================="
# Run wcrp_cmip6 checker - text report for logs
compliance-checker \
--test=wcrp_cmip6 \
--format=text \
--output=tmp/wcrp_compliance_reports/cmip6_${basename}_report.txt \
"$ncfile" || true
# Run wcrp_cmip6 checker - json report for artifact
compliance-checker \
--test=wcrp_cmip6 \
--format=json \
--output=tmp/wcrp_compliance_reports/cmip6_${basename}_report.json \
"$ncfile" 2>&1 || true
# Display text report summary in logs
echo "Report summary:"
head -80 tmp/wcrp_compliance_reports/cmip6_${basename}_report.txt || true
echo ""
fi
done
- name: Run WCRP compliance checks on CMIP7 outputs
if: steps.gather_outputs.outputs.cmip7_count != '0'
run: |
echo "Running WCRP compliance checks on CMIP7 files..."
echo "CMIP7 files to check: ${{ steps.gather_outputs.outputs.cmip7_count }}"
echo ""
mkdir -p tmp/wcrp_compliance_reports
for ncfile in tmp/qa_test_outputs/cmip7/*.nc; do
if [ -f "$ncfile" ]; then
basename=$(basename "$ncfile" .nc)
echo ""
echo "=========================================="
echo "Checking: ${basename}"
echo "=========================================="
# Run wcrp_cmip6 checker on CMIP7 files too
# (the plugin validates WCRP conventions applicable across versions)
compliance-checker \
--test=wcrp_cmip6 \
--format=text \
--output=tmp/wcrp_compliance_reports/cmip7_${basename}_report.txt \
"$ncfile" || true
compliance-checker \
--test=wcrp_cmip6 \
--format=json \
--output=tmp/wcrp_compliance_reports/cmip7_${basename}_report.json \
"$ncfile" 2>&1 || true
echo "Report summary:"
head -80 tmp/wcrp_compliance_reports/cmip7_${basename}_report.txt || true
echo ""
fi
done
# ── reports and artifacts ──
- name: Generate summary report
if: steps.gather_outputs.outputs.file_count != '0'
run: |
mkdir -p tmp/wcrp_compliance_reports
echo "# WCRP Compliance Check Results" > tmp/wcrp_compliance_reports/SUMMARY.md
echo "" >> tmp/wcrp_compliance_reports/SUMMARY.md
echo "**Generated:** $(date -u +%Y-%m-%dT%H:%M:%SZ)" >> tmp/wcrp_compliance_reports/SUMMARY.md
echo "**Plugin:** [cc-plugin-wcrp](https://github.com/ESGF/cc-plugin-wcrp)" >> tmp/wcrp_compliance_reports/SUMMARY.md
echo "" >> tmp/wcrp_compliance_reports/SUMMARY.md
echo "## Files Checked" >> tmp/wcrp_compliance_reports/SUMMARY.md
echo "" >> tmp/wcrp_compliance_reports/SUMMARY.md
echo "- **Total:** ${{ steps.gather_outputs.outputs.file_count }} files" >> tmp/wcrp_compliance_reports/SUMMARY.md
echo "- **CMIP6:** ${{ steps.gather_outputs.outputs.cmip6_count }} files" >> tmp/wcrp_compliance_reports/SUMMARY.md
echo "- **CMIP7:** ${{ steps.gather_outputs.outputs.cmip7_count }} files" >> tmp/wcrp_compliance_reports/SUMMARY.md
echo "" >> tmp/wcrp_compliance_reports/SUMMARY.md
cp tmp/qa_test_outputs/manifest.txt tmp/wcrp_compliance_reports/manifest.txt || true
cat tmp/wcrp_compliance_reports/SUMMARY.md
- name: Upload test outputs
if: always() && steps.gather_outputs.outputs.file_count != '0'
uses: actions/upload-artifact@v4
with:
name: wcrp-test-outputs
path: tmp/qa_test_outputs/
retention-days: 30
- name: Upload WCRP compliance reports
if: always() && steps.gather_outputs.outputs.file_count != '0'
uses: actions/upload-artifact@v4
with:
name: wcrp-compliance-reports
path: tmp/wcrp_compliance_reports/
retention-days: 30