昨天介紹了簡單的使用 git
指令 commit
來記錄程式碼的改動,並且使用 git push
把在本地端的改動上傳回 Github Repo。在前天也介紹如何在本地端上傳套件到 TestPyPI
。今天則是要來介紹,如何使用 Github Actions 建立 workflow
來上傳套件。
今天介紹的內容會參考這份文件 Publishing package distribution releases using GitHub Actions CI/CD workflows 來介紹,有興趣人的也可以進去細看。
先來介紹 Github Actions,他是 Github 提供使用者能透過 Github 的一些事件,來觸發執行寫好的腳本,來達到自動化的效果。通常觸發事件有像是我們昨天介紹的 git push
,當我們上傳新的改動 commit
之後,就能觸發 Github Actions 來幫我們執行像是 測試 或是部署等。其他像是其他貢獻者開了一個 Issue 或是 Pull Request,也可以觸發。想知道有哪些事件,可以參考官方網站的文件:Events that trigger workflows
這次我們會使用 push
事件來當示範。
介紹完 Github Actions,我們下一個步驟是要去 TestPyPI
去設定我們 Github 資訊,這樣他就能確定從我們 Github 上傳的套件是可以信任的。
publish.yml
,Environment Name 這次是上傳到測試環境所以填入 testpypi
確定好 Publisher 之後,接下來要來寫 Workflow 的設定檔。Github 會從 .github/workflows/
這個資料夾去搜尋 YAML
的設定檔。因為我們 Repo 還沒有這個資料夾,所以我們會需要自己建立一個。這次就直接在 Repo 頁新增就可以了,可以一樣參照 Day 06 - Open Source License 裡提到的步驟新增。可以在 input box 裡直接貼上 .github/workflows/
就會建立好資料夾,再輸入我們的檔名 publish.yml
當我們輸入 .yml
的時候,會看到右邊會出現 Marketplace 跟 Documentation,Marketplace 可以搜尋別人寫好的設定檔直接套用,Documentation 則是教學如何寫設定檔,因為我們要了解設定檔有哪些設定,就不用別人寫好的了。
name
, on
首先是 name
跟 on
,name
就不多做說明了,就是我們這個 Workflow 的名稱,on
則是這個 Workflow 的觸發事件,這次選 push
name: Publish to baseball-stats-python
on: push
jobs
再來要設定 jobs
,會是這個 Workflow 需要完成的工作,可以設定多個,裡面可以有多個步驟。因為每次在執行 Workflow 的時候都會是一個新的環境,所以我們需要在新環境重新安裝 Python 跟把我們 Repo 拉下來,就會需要設定多個 job
來處理。
第一個先設定好環境,安裝 Python 跟該有的套件,build
是 job
名稱,runs-on
是執行的 OS,step
是執行的步驟,uses
是別人寫好的 actions
,with
選擇使用的 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,並且開始規劃如何設計。
最後一樣感謝大家耐心地看完這篇文章,有任何問題與建議歡迎留言告訴我,明天見,掰掰。