Add WCRP compliance check pipeline using cc-plugin-wcrp #3
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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" |