Quarto 筆記 (2) - 自動發布至 GitHub Pages

這篇筆記是關於我如何把 Quarto 文件發布至 GitHub Pages,以及碰到的錯誤和解決方法。


上回的 Quarto 初體驗筆記有一項尚未進行的工作:自動發布至 GitHub Pages。當時,我已經用 ChatGPT 幫我生成一個 YAML 檔案,放在 repository 的 .github/workflow 目錄下,但我並沒有進一步去除錯它,只是先放著,等有空再回來處理。


後來,在我的臉書貼文底下,我看到 鮑承佑 (老鮑伯)  大大留言提供有關 GitHub Pages 配置的線索範例,便順藤摸瓜,把這個待辦事項給處理完了。這裡一併感謝老鮑伯的分享。

對 Quarto 有興趣的朋友,如果有報名 Hello World Dev Conference 2025,不妨去現場聆聽老鮑伯主講的議程:終究要有 Markdown 何不一開始就 Quarto? 

以下重點整理我如何把 Quarto 文件發布至 GitHub Pages,以及碰到的錯誤和解決方法。 

步驟

我參考的文件主要是這個:Quarto Actions: Basics 裡面的 GitHub Pages 小節。按照該小節的說明,只需兩個步驟:


步驟 1:把 GitHub Actions 工作流程加入你的 repostory


quarto-publish-example.yml 複製到 .github/workflows/quarto-publish.yml。然後取消兩塊註解:

  • 取消註解區塊「Publish to GitHub Pages (and render)」,以便使用 GitHub Actions。
  • 取消註解區塊「permissions」,這樣 GitHub Actions 才有足夠的修改權限。(詳見稍後的程式碼)
其餘註解區塊還有發布至 Netlify、RStudio、和 Confluence 等等,皆可忽略或刪除。

 

步驟 2:在本機電腦執行一次 quarto publish gh-pages


在本機電腦執行以下命令,一次即可:


quarto publish gh-pages


這可以讓 Quarto 替你的 GitHub repository 建立一個名為 gh-pages 的分支,並執行第一次的文件發布。若執行成功,便能看到發布於 GitPages 的網頁。



完成上述步驟之後,把這個工作流程檔案 (quarto-publish.yml)推送至 GitHub,以便觸發 GitHub 平台自動執行發布流程。

我的 workflow 檔案

以下是我的 GitHub workflow 檔案,修改自官方範例 quarto-publish-example.yml。稍後會說明我修改了哪些地方。


on:
  push:
    branches:
      - main
  pull_request:  

name: Render and Publish

# you need these permissions to publish to GitHub pages
permissions: 
  contents: write
  pages: write

jobs:
  build-deploy:
    runs-on: ubuntu-latest
    
    steps:
      - name: Check out repository
        uses: actions/checkout@v4
        
      - name: Set up Quarto
        uses: quarto-dev/quarto-actions/setup@v2
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          # To install LaTeX to build PDF book 
          tinytex: true 
          # uncomment below and fill to pin a version
          # version: SPECIFIC-QUARTO-VERSION-HERE
      
      # add software dependencies here and any libraries

      # 安裝中文字體(避免 PDF 中文字變成豆腐)
      - name: Install CJK fonts
        run: |
          sudo apt-get update
          sudo apt-get install -y fonts-noto-cjk
          fc-list | grep Noto
  
      # NOTE: If Publishing to GitHub Pages, 
      #       set the permissions correctly (see top of this yaml)
      - name: Publish to GitHub Pages (and render) 
        uses: quarto-dev/quarto-actions/publish@v2
        with:
          target: gh-pages
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 





要特別說明的是,我加了安裝中文字體的配置(其實不需要,因為這裡是要發布成網頁):


      # 安裝中文字體(避免 PDF 中文字變成豆腐)
      - name: Install CJK fonts
        run: |
          sudo apt-get update
          sudo apt-get install -y fonts-noto-cjk
          fc-list | grep Noto


其中的 fc-list 命令不是必要的,可移除。這是因為我的 GitHub worflow 曾經因為找不到指定的中文字體而執行失敗,錯誤訊息如下圖(擷取自 GitHub 網站的 log):




fc-list 命令的輸出結果得知思源宋體的字體名稱是 "Noto Serif CJK TC",然後便可在專案根目錄下的組態檔 _quarto.yml 中指定 PDF 的主要字體:


format:
  html:
    theme: cosmo
  epub:
    toc: true
  pdf:
    documentclass: book
    papersize: a4
    toc: true
    toc-depth: 3
    number-sections: true
    fontsize: 11pt
    mainfont: "Noto Serif CJK TC"


成果



錯誤:HTTP 403(權限不足)

最後,記錄一個錯誤狀況:運行 GitHub workflow 失敗,錯誤訊息是 HTTP 403 權限不足。如下圖:




前面提過,workflow 檔案裡面要設定適當的寫入權限:


# you need these permissions to publish to GitHub pages
permissions: 
  contents: write
  pages: write


剛開始,我沒有注意到這個部分的設定,所以我用的是另一個方法:修改 GitHub repository 相關設定。由於我的 repository 是掛在一個 organization 底下,會直接繼承(受限於)organization 的權限設定,故實際要調整的是 GitHub repo 所屬之 organization 的權限設定。操作步驟如下:


首先,進入 Settings > Actions > General,如下圖:



General 設定頁面往下捲到底,修改 Workflow permissions 選項,把預設的唯讀權限改成可讀寫: 



收工!

補充:GitHub Pages 與 Workflow

GitHub Pages 的建置與部署模式有兩種:GitHub ActionsDeploy from a branch。相關設定如下圖:


此範例採用的是 Deploy from a branch 模式,故每當有變更推送至 GitHub,就會依序觸發兩個 workflows:
  • 一個是 Quarto 的 workflow,負責建置網站,並將建置結果推送至 gh-pages 分支。
  • 一個是 GitHub Pages 內建的 workflow,負責把 gh-pages 分支的內容發發布至 CDN(content delivery network)。
若從 GitHub 專案的 Actions 頁面查看所有的工作流程,便能觀察到上述兩兩成對的工作流程的執行紀錄。如下圖,其中的「pages build and deployment」就是 GitHub Pages 內建的 workflow:


Quarto 工作流程所產生的檔案(artifacts),可以從「pages build and deployment」點進去的內容頁面找到下載連結。如果 Quarto 工作流程有一併建立 ePub 和 PDF 檔案,也會包含在下載的壓縮檔案中。

延伸閱讀



沒有留言:

技術提供:Blogger.
回頂端⬆️