Skip to content

Add WCRP compliance check pipeline using cc-plugin-wcrp #3

Add WCRP compliance check pipeline using cc-plugin-wcrp

Add WCRP compliance check pipeline using cc-plugin-wcrp #3

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: fremorizer-wcrp
python-version: "3.12"
auto-activate-base: 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 dependencies for fremorizer
run: |
conda install -y \
conda-forge::cftime \
"conda-forge::click>=8.2" \
"conda-forge::cmor>=3.14" \
"conda-forge::netcdf4>=1.7" \
"conda-forge::numpy>=2" \
conda-forge::pyyaml \
conda-forge::pytest
- name: Install cc-plugin-wcrp
run: |
pip install cc-plugin-wcrp
- name: Configure esgvoc controlled vocabularies
run: |
esgvoc config add cordex-cmip6
esgvoc config add cmip7
esgvoc config set project:branch=esgvoc
esgvoc install
- name: Verify cc-plugin-wcrp installation
run: |
echo "Listing available compliance-checker plugins..."
compliance-checker -l
- name: Install fremorizer
run: |
pip install .
- name: Run tests to generate output files
run: |
echo "Running test suite to generate NetCDF outputs..."
echo ""
echo "=========================================="
echo "Running CMIP6 basic tests..."
echo "=========================================="
pytest fremorizer/tests/test_cmor_run_subtool.py -v || true
echo ""
echo "=========================================="
echo "Running extended test examples..."
echo "=========================================="
pytest fremorizer/tests/test_cmor_run_subtool_further_examples.py -v || true
echo ""
echo "Test execution complete."
continue-on-error: true
- name: Gather test outputs into centralized directory
id: gather_outputs
run: |
bash .github/scripts/gather_test_outputs.sh tmp/qa_test_outputs
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")
other_files=$(find tmp/qa_test_outputs/other -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 "other_count=${other_files}" >> $GITHUB_OUTPUT
- 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
- 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 "- **Other:** ${{ steps.gather_outputs.outputs.other_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
- name: Check if any files were tested
if: steps.gather_outputs.outputs.file_count == '0'
run: |
echo "::warning::No NetCDF files were found to check for WCRP compliance"
echo "This may indicate that tests did not run successfully or outputs were not generated"