Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .github/workflows/test-containers-lectures.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ jobs:
owner: QuantEcon
- repo: lecture-python-advanced.myst
owner: QuantEcon
- repo: lecture-python-programming
owner: QuantEcon
# TODO: Re-enable after https://github.com/QuantEcon/lecture-jax/issues/284 is resolved
# lecture-jax requires JAX but doesn't include pip install commands
# - repo: lecture-jax
Expand Down Expand Up @@ -93,6 +95,8 @@ jobs:

# Stage 1: HTML (executes notebooks)
- name: Build HTML (Execute Notebooks)
id: build-html
continue-on-error: true
uses: ./actions-repo/build-lectures
with:
source-dir: lecture-repo/lectures
Expand All @@ -101,6 +105,19 @@ jobs:
upload-failure-reports: true
failure-artifact-name: reports-html-${{ matrix.container }}-${{ matrix.repo.repo }}

# A transient raw-GitHub 429 can fail one notebook while the successful
# executions remain in the Jupyter cache. Retry once so only the failed
# notebooks execute again; a second failure still fails the job.
- name: Retry HTML build after failure
if: steps.build-html.outcome == 'failure'
uses: ./actions-repo/build-lectures
with:
source-dir: lecture-repo/lectures
output-dir: lecture-repo
builder: html
upload-failure-reports: true
failure-artifact-name: reports-html-retry-${{ matrix.container }}-${{ matrix.repo.repo }}

# Stage 2: pdflatex (reuses cached notebooks from HTML build)
- name: Build PDF (No Execution)
uses: ./actions-repo/build-lectures
Expand Down
6 changes: 3 additions & 3 deletions TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

| Repository | quantecon-build | quantecon | Status |
|------------|-----------------|-----------|--------|
| lecture-python-programming.myst | 4.6 min | 5.4 min | ✅ Pass |
| lecture-python-programming | 4.6 min | 5.4 min | ✅ Pass |
| lecture-python-intro | 11.5 min | 13.4 min | ✅ Pass |
| lecture-python-advanced.myst | 33.6 min | 35.9 min | ✅ Pass |
| lecture-python.myst | 60.0 min | 60.0 min | ✅ Pass |
Expand Down Expand Up @@ -246,7 +246,7 @@ Before production rollout:
Pick a test repository or create a fork:

```bash
# Option 1: Use lecture-python-programming.myst (lower traffic)
# Option 1: Use lecture-python-programming (lower traffic)
# Option 2: Create a fork for testing
```

Expand All @@ -261,7 +261,7 @@ Complete testing with `QuantEcon/test-actions-lecture-intro`, validate all metri
After successful testing, migrate CPU-based lecture repositories:

1. **lecture-python-intro** (Netlify, similar to test repo)
2. **lecture-python-programming.myst** (GitHub Pages)
2. **lecture-python-programming** (GitHub Pages)
3. **lecture-python-advanced.myst** (GitHub Pages)
4. **lecture-python.myst** - CPU builds only (defer GPU workflows)

Expand Down
10 changes: 5 additions & 5 deletions containers/VALIDATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ This document records validation test results for the QuantEcon containers acros

Containers are tested by [`test-containers-lectures.yml`](../.github/workflows/test-containers-lectures.yml), which runs after the **Build QuantEcon Containers** workflow completes. Each job builds one lecture repo on one container through the full builder pipeline (HTML → pdflatex → jupyter) **sequentially**, reusing the executed notebooks across builders. Concurrency groups serialize jobs for the same repo to avoid network contention from concurrent dataset downloads; different repos run in parallel.

**Matrix:** 2 containers (`quantecon`, `quantecon-build`) × the QuantEcon lecture repos — `lecture-python-intro`, `lecture-python.myst`, `lecture-python-advanced.myst` (`lecture-jax` is temporarily disabled pending [lecture-jax#284](https://github.com/QuantEcon/lecture-jax/issues/284)).
**Matrix:** 2 containers (`quantecon`, `quantecon-build`) × the QuantEcon lecture repos — `lecture-python-intro`, `lecture-python.myst`, `lecture-python-advanced.myst`, `lecture-python-programming` (`lecture-jax` is temporarily disabled pending [lecture-jax#284](https://github.com/QuantEcon/lecture-jax/issues/284)).

A companion workflow, [`test-container.yml`](../.github/workflows/test-container.yml), smoke-tests the freshly built images (XeLaTeX compile + a minimal Jupyter Book HTML/PDF build).

Expand All @@ -22,7 +22,7 @@ A companion workflow, [`test-container.yml`](../.github/workflows/test-container
| Repository | Lectures | Notes |
|-----------|----------|-------|
| `lecture-python-intro` | 46 | Standard, Netlify deployment |
| `lecture-python-programming.myst` | ~40 | Standard, GitHub Pages |
| `lecture-python-programming` | ~40 | Standard, GitHub Pages |
| `lecture-python-advanced.myst` | ~50 | Standard, GitHub Pages |
| `lecture-python.myst` | ~80 | GPU lectures, GitHub Pages |

Expand All @@ -39,15 +39,15 @@ A companion workflow, [`test-container.yml`](../.github/workflows/test-container
| Builder | Repository | quantecon-build (lean) | quantecon (full) |
|---------|-----------|:---:|:---:|
| **html** | lecture-python-intro | ✅ 12m | ✅ 13m |
| | lecture-python-programming.myst | ✅ 5m | ✅ 5m |
| | lecture-python-programming | ✅ 5m | ✅ 5m |
| | lecture-python-advanced.myst | ✅ 34m | ✅ 36m |
| | lecture-python.myst | ✅ 58m | ✅ 100m |
| **pdflatex** | lecture-python-intro | ✅ 14m | ✅ 14m |
| | lecture-python-programming.myst | ✅ 6m | ✅ 7m |
| | lecture-python-programming | ✅ 6m | ✅ 7m |
| | lecture-python-advanced.myst | ✅ 36m | ✅ 38m |
| | lecture-python.myst | ✅ 62m | ✅ 63m |
| **jupyter** | lecture-python-intro | ✅ 12m | ✅ 12m |
| | lecture-python-programming.myst | ✅ 4m | ✅ 5m |
| | lecture-python-programming | ✅ 4m | ✅ 5m |
| | lecture-python-advanced.myst | ✅ 34m | ✅ 35m |
| | lecture-python.myst | ✅ 58m | ✅ 58m |

Expand Down