diff --git a/.github/workflows/cache.yml b/.github/workflows/cache.yml index 25d6b24..5e74245 100644 --- a/.github/workflows/cache.yml +++ b/.github/workflows/cache.yml @@ -1,48 +1,32 @@ -name: Build Cache [using jupyter-book] +name: Build Cache on: + push: + branches: [main] schedule: - # Execute cache weekly at 3am on Monday - - cron: '0 3 * * 1' + - cron: '0 3 * * 1' # Weekly Monday 3am workflow_dispatch: + jobs: - tests: + build-cache: runs-on: ubuntu-latest + container: + image: ghcr.io/quantecon/quantecon:latest steps: - name: Checkout uses: actions/checkout@v5 - # Use unified composite action for complete environment setup - - name: Setup Complete Lecture Environment - uses: quantecon/actions/setup-lecture-env-full@main - with: - python-version: '3.13' - environment-file: 'environment.yml' - latex-requirements-file: 'latex-requirements.txt' - environment-name: 'quantecon' - - - name: graphviz Support # TODO: required? - run: | - sudo apt-get -qq update && sudo apt-get install -y graphviz - - # Use composite action for building + # Build HTML (full execution, no cache restore) - name: Build HTML id: build - uses: quantecon/actions/build-lectures@main + uses: quantecon/actions/build-lectures@v0 with: - builder: 'html' source-dir: 'lectures' - extra-args: '-W --keep-going' - - - name: Upload Execution Reports (HTML) - uses: actions/upload-artifact@v5 - if: failure() - with: - name: execution-reports - path: _build/html/reports + builder: 'html' + upload-failure-reports: true - - name: Upload "_build" folder (cache) - uses: actions/upload-artifact@v5 + # Save build cache for PR builds + - name: Save Build Cache + uses: actions/cache/save@v4 with: - name: build-cache path: _build - include-hidden-files: true \ No newline at end of file + key: build-${{ hashFiles('environment.yml') }}-${{ github.sha }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4806928..de4dd98 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,89 +1,29 @@ -name: Build HTML [using jupyter-book] +name: CI Preview on: [pull_request] + jobs: preview: runs-on: ubuntu-latest + container: + image: ghcr.io/quantecon/quantecon:latest steps: - name: Checkout uses: actions/checkout@v5 - - name: Setup Anaconda - uses: conda-incubator/setup-miniconda@v3 - with: - auto-update-conda: true - auto-activate-base: true - miniconda-version: 'latest' - python-version: "3.13" - environment-file: environment.yml - activate-environment: quantecon - - name: Graphics Support #TODO: Review if graphviz is needed - run: | - sudo apt-get -qq update && sudo apt-get install -y graphviz - - name: Install latex dependencies - run: | - sudo apt-get -qq update - sudo apt-get install -y \ - texlive-latex-recommended \ - texlive-latex-extra \ - texlive-fonts-recommended \ - texlive-fonts-extra \ - texlive-xetex \ - latexmk \ - xindy \ - dvipng \ - cm-super - - name: Display Conda Environment Versions - shell: bash -l {0} - run: conda list - - name: Display Pip Versions - shell: bash -l {0} - run: pip list - - name: Download "build" folder (cache) - uses: dawidd6/action-download-artifact@v11 - with: - workflow: cache.yml - branch: main - name: build-cache - path: _build - # Build Assets (Download Notebooks and PDF via LaTeX) - - name: Build PDF from LaTeX - shell: bash -l {0} - run: | - jb build lectures --builder pdflatex --path-output ./ -n --keep-going - mkdir -p _build/html/_pdf - cp -u _build/latex/*.pdf _build/html/_pdf - - name: Upload Execution Reports (LaTeX) - uses: actions/upload-artifact@v5 - if: failure() - with: - name: execution-reports - path: _build/latex/reports - - name: Build Download Notebooks (sphinx-tojupyter) - shell: bash -l {0} - run: | - jb build lectures --path-output ./ --builder=custom --custom-builder=jupyter - mkdir -p _build/html/_notebooks - cp -u _build/jupyter/*.ipynb _build/html/_notebooks - # Build HTML (Website) - # BUG: rm .doctress to remove `sphinx` rendering issues for ipywidget mimetypes - # and clear the sphinx cache for building final HTML documents. + + # Build HTML with build cache restore - name: Build HTML - shell: bash -l {0} - run: | - rm -r _build/.doctrees - jb build lectures --path-output ./ -nW --keep-going - - name: Upload Execution Reports (HTML) - uses: actions/upload-artifact@v5 - if: failure() + id: build + uses: quantecon/actions/build-lectures@v0 with: - name: execution-reports - path: _build/html/reports - - name: Preview Deploy to Netlify - uses: nwtgck/actions-netlify@v3.0 + source-dir: 'lectures' + builder: 'html' + use-build-cache: true + upload-failure-reports: true + + # Deploy preview to Netlify + - name: Deploy to Netlify + uses: quantecon/actions/deploy-netlify@v0 with: - publish-dir: '_build/html/' - production-branch: main - github-token: ${{ secrets.GITHUB_TOKEN }} - deploy-message: "Preview Deploy from GitHub Actions" - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + build-dir: ${{ steps.build.outputs.build-path }} + netlify-auth-token: ${{ secrets.NETLIFY_AUTH_TOKEN }} + netlify-site-id: ${{ secrets.NETLIFY_SITE_ID }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 62ed329..9959c6b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,139 +1,61 @@ -name: Build & Publish to GH-PAGES +name: Publish to GitHub Pages on: push: tags: - 'publish*' + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: "pages" + cancel-in-progress: false + jobs: publish: if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') runs-on: ubuntu-latest + container: + image: ghcr.io/quantecon/quantecon:latest + environment: + name: github-pages + url: ${{ steps.deploy.outputs.page-url }} steps: - name: Checkout uses: actions/checkout@v5 - - name: Setup Anaconda - uses: conda-incubator/setup-miniconda@v3 + + # Build PDF + - name: Build PDF + uses: quantecon/actions/build-lectures@v0 with: - auto-update-conda: true - auto-activate-base: true - miniconda-version: 'latest' - python-version: "3.13" - environment-file: environment.yml - activate-environment: quantecon - - name: Install latex dependencies - run: | - sudo apt-get -qq update - sudo apt-get install -y \ - texlive-latex-recommended \ - texlive-latex-extra \ - texlive-fonts-recommended \ - texlive-fonts-extra \ - texlive-xetex \ - latexmk \ - xindy \ - dvipng \ - cm-super - - name: Display Conda Environment Versions - shell: bash -l {0} - run: conda list - - name: Display Pip Versions - shell: bash -l {0} - run: pip list - - name: Download "build" folder (cache) - uses: dawidd6/action-download-artifact@v11 + source-dir: 'lectures' + builder: 'pdflatex' + upload-failure-reports: true + + # Build notebooks + - name: Build Notebooks + uses: quantecon/actions/build-lectures@v0 with: - workflow: cache.yml - branch: main - name: build-cache - path: _build - # Build Assets (Download Notebooks and PDF via LaTeX) - - name: Build PDF from LaTeX - shell: bash -l {0} - run: | - jb build lectures --builder pdflatex --path-output ./ -n --keep-going - - name: Copy LaTeX PDF for GH-PAGES - shell: bash -l {0} - run: | - mkdir -p _build/html/_pdf - cp -u _build/latex/*.pdf _build/html/_pdf - - name: Build Download Notebooks (sphinx-tojupyter) - shell: bash -l {0} - run: | - jb build lectures --path-output ./ --builder=custom --custom-builder=jupyter - - name: Copy Download Notebooks for GH-PAGES - shell: bash -l {0} - run: | - mkdir -p _build/html/_notebooks - cp -u _build/jupyter/*.ipynb _build/html/_notebooks - # Build HTML (Website) - # BUG: rm .doctress to remove `sphinx` rendering issues for ipywidget mimetypes - # and clear the sphinx cache for building final HTML documents. + source-dir: 'lectures' + builder: 'jupyter' + upload-failure-reports: true + + # Build HTML and assemble all assets - name: Build HTML - shell: bash -l {0} - run: | - rm -r _build/.doctrees - jb build lectures --path-output ./ - # Create HTML archive for release assets - - name: Create HTML archive - shell: bash -l {0} - run: | - tar -czf test-lecture-python-intro-html-${{ github.ref_name }}.tar.gz -C _build/html . - sha256sum test-lecture-python-intro-html-${{ github.ref_name }}.tar.gz > html-checksum.txt - - # Create metadata manifest - cat > html-manifest.json << EOF - { - "tag": "${{ github.ref_name }}", - "commit": "${{ github.sha }}", - "timestamp": "$(date -Iseconds)", - "size_mb": $(du -sm _build/html | cut -f1), - "file_count": $(find _build/html -type f | wc -l) - } - EOF - - name: Upload archives to release - uses: softprops/action-gh-release@v1 - with: - files: | - test-lecture-python-intro-html-${{ github.ref_name }}.tar.gz - html-checksum.txt - html-manifest.json - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Deploy to Netlify - uses: nwtgck/actions-netlify@v3.0 - with: - publish-dir: '_build/html/' - production-branch: main - github-token: ${{ secrets.GITHUB_TOKEN }} - deploy-message: "Deploy from GitHub Actions" - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} - - name: Deploy website to gh-pages - uses: peaceiris/actions-gh-pages@v4 + id: build + uses: quantecon/actions/build-lectures@v0 with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: _build/html/ - - name: Upload "_build" folder (cache) - uses: actions/upload-artifact@v5 + source-dir: 'lectures' + builder: 'html' + html-copy-pdf: true + html-copy-notebooks: true + upload-failure-reports: true + + # Deploy to GitHub Pages + - name: Deploy to GitHub Pages + id: deploy + uses: quantecon/actions/publish-gh-pages@v0 with: - name: build-publish - path: _build - # DISABLED FOR TESTING: # Sync notebooks - # DISABLED FOR TESTING: - name: Prepare lecture-python-intro.notebooks sync - # DISABLED FOR TESTING: shell: bash -l {0} - # DISABLED FOR TESTING: run: | - # DISABLED FOR TESTING: mkdir -p _build/lecture-python-intro.notebooks - # DISABLED FOR TESTING: cp -a _notebook_repo/. _build/lecture-python-intro.notebooks - # DISABLED FOR TESTING: cp _build/jupyter/*.ipynb _build/lecture-python-intro.notebooks - # DISABLED FOR TESTING: ls -a _build/lecture-python-intro.notebooks - # DISABLED FOR TESTING: - name: Commit latest notebooks to lecture-python-intro.notebooks - # DISABLED FOR TESTING: uses: cpina/github-action-push-to-another-repository@main - # DISABLED FOR TESTING: env: - # DISABLED FOR TESTING: API_TOKEN_GITHUB: ${{ secrets.QUANTECON_SERVICES_PAT }} - # DISABLED FOR TESTING: with: - # DISABLED FOR TESTING: source-directory: '_build/lecture-python-intro.notebooks/' - # DISABLED FOR TESTING: destination-repository-username: 'QuantEcon' - # DISABLED FOR TESTING: destination-repository-name: 'lecture-python-intro.notebooks' - # DISABLED FOR TESTING: commit-message: 'auto publishing updates to notebooks' - # DISABLED FOR TESTING: destination-github-username: 'quantecon-services' - # DISABLED FOR TESTING: user-email: services@quantecon.org + build-dir: ${{ steps.build.outputs.build-path }}