iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0

昨天介紹了簡單的使用 git 指令 commit 來記錄程式碼的改動,並且使用 git push 把在本地端的改動上傳回 Github Repo。在前天也介紹如何在本地端上傳套件到 TestPyPI。今天則是要來介紹,如何使用 Github Actions 建立 workflow 來上傳套件。
今天介紹的內容會參考這份文件 Publishing package distribution releases using GitHub Actions CI/CD workflows 來介紹,有興趣人的也可以進去細看。

Github Actions

先來介紹 Github Actions,他是 Github 提供使用者能透過 Github 的一些事件,來觸發執行寫好的腳本,來達到自動化的效果。通常觸發事件有像是我們昨天介紹的 git push,當我們上傳新的改動 commit 之後,就能觸發 Github Actions 來幫我們執行像是 測試 或是部署等。其他像是其他貢獻者開了一個 Issue 或是 Pull Request,也可以觸發。想知道有哪些事件,可以參考官方網站的文件:Events that trigger workflows
這次我們會使用 push 事件來當示範。

設定信任的上傳來源

介紹完 Github Actions,我們下一個步驟是要去 TestPyPI 去設定我們 Github 資訊,這樣他就能確定從我們 Github 上傳的套件是可以信任的。

  1. 前往 https://test.pypi.org/manage/account/publishing/
  2. 填入相關資訊,這些我們之前都設定過了,照著填就好,Workflow 名稱因為這次寫上傳相關的就命名為 publish.yml,Environment Name 這次是上傳到測試環境所以填入 testpypi

https://ithelp.ithome.com.tw/upload/images/20240925/20163024KXvGYz31ZN.png

  1. 最後按下 Add 按鈕送出資料,成功後會看到新的 Publisher 成功加到我們專案裡,這樣就算完成設定了

https://ithelp.ithome.com.tw/upload/images/20240925/20163024qoJ8kJcbez.png

建立 Workflow 設定

確定好 Publisher 之後,接下來要來寫 Workflow 的設定檔。Github 會從 .github/workflows/ 這個資料夾去搜尋 YAML 的設定檔。因為我們 Repo 還沒有這個資料夾,所以我們會需要自己建立一個。這次就直接在 Repo 頁新增就可以了,可以一樣參照 Day 06 - Open Source License 裡提到的步驟新增。可以在 input box 裡直接貼上 .github/workflows/ 就會建立好資料夾,再輸入我們的檔名 publish.yml

當我們輸入 .yml 的時候,會看到右邊會出現 MarketplaceDocumentation,Marketplace 可以搜尋別人寫好的設定檔直接套用,Documentation 則是教學如何寫設定檔,因為我們要了解設定檔有哪些設定,就不用別人寫好的了。

name, on

首先是 nameonname 就不多做說明了,就是我們這個 Workflow 的名稱,on 則是這個 Workflow 的觸發事件,這次選 push

name: Publish to baseball-stats-python

on: push

jobs

再來要設定 jobs,會是這個 Workflow 需要完成的工作,可以設定多個,裡面可以有多個步驟。因為每次在執行 Workflow 的時候都會是一個新的環境,所以我們需要在新環境重新安裝 Python 跟把我們 Repo 拉下來,就會需要設定多個 job 來處理。

第一個先設定好環境,安裝 Python 跟該有的套件,buildjob 名稱,runs-on 是執行的 OS,step 是執行的步驟,uses 是別人寫好的 actionswith 選擇使用的 Python 版本,run 則是我們平常在終端機輸入的指令。

jobs:
  build:
    name: Build distribution 📦
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: "3.x"
    - name: Install pypa/build
      run: >-
        python3 -m
        pip install
        build
        --user
    - name: Build a binary wheel and a source tarball
      run: python3 -m build
    - name: Store the distribution packages
      uses: actions/upload-artifact@v4
      with:
        name: python-package-distributions
        path: dist/

這樣 build 這個 job 最後會完成到 Build 出打包好的檔案在 dist 資料夾裡,並且上傳,這樣我們後面的 job 可以下載下來,這樣就會在 Workflow 環境裡準備好上傳。

再來再建立一個 publish-to-testpypi 的 job,幫剛剛上傳的 dist 下載下來用 pypa/gh-action-pypi-publish actions 來幫我們上傳到 TestPyPI

    publish-to-testpypi:
    name: Publish Python 🐍 distribution 📦 to TestPyPI
    needs:
    - build
    runs-on: ubuntu-latest

    environment:
      name: testpypi
      url: https://test.pypi.org/p/baseball-stats-python

    permissions:
      id-token: write  # IMPORTANT: mandatory for trusted publishing

    steps:
    - name: Download all the dists
      uses: actions/download-artifact@v4
      with:
        name: python-package-distributions
        path: dist/
    - name: Publish baseball-stats-python to TestPyPI
      uses: pypa/gh-action-pypi-publish@release/v1
      with:
        repository-url: https://test.pypi.org/legacy/

這樣就完成這次的 Workflow 了,完整下來會變成這樣:

name: Publish to baseball-stats-python

on: push

jobs:
  build:
    name: Build distribution 📦
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: "3.x"
    - name: Install pypa/build
      run: >-
        python3 -m
        pip install
        build
        --user
    - name: Build a binary wheel and a source tarball
      run: python3 -m build
    - name: Store the distribution packages
      uses: actions/upload-artifact@v4
      with:
        name: python-package-distributions
        path: dist/

  publish-to-testpypi:
    name: Publish Python 🐍 distribution 📦 to TestPyPI
    needs:
    - build
    runs-on: ubuntu-latest

    environment:
      name: testpypi
      url: https://test.pypi.org/p/baseball-stats-python

    permissions:
      id-token: write  # IMPORTANT: mandatory for trusted publishing

    steps:
    - name: Download all the dists
      uses: actions/download-artifact@v4
      with:
        name: python-package-distributions
        path: dist/
    - name: Publish baseball-stats-python to TestPyPI
      uses: pypa/gh-action-pypi-publish@release/v1
      with:
        repository-url: https://test.pypi.org/legacy/

再來就再次 commit 這個 .yml,完成這次的改動,下次 push 的時候就可以來驗收成果。

本日小結

今天快速照著參考文章簡單介紹了一下 Git Actions 跟 Workflow,不過他整個設定檔其實滿多設定的,可以玩出很多花樣。這次因為時間問題比較草草結束,十分抱歉,之後會再跟著開發再多做介紹跟補充,明天會來介紹這次套件想開發的 function,並且開始規劃如何設計。
最後一樣感謝大家耐心地看完這篇文章,有任何問題與建議歡迎留言告訴我,明天見,掰掰。


上一篇
Day 10 - 上傳程式碼回 Github
下一篇
Day 12 - Github Actions 上傳 PyPI 版號問題
系列文
上次介紹的棒球套件很少更新了,那就只好自己寫一個!?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言