GitHub Actions 筆記

若習慣使用 GitHub 作為版本庫的話,那 GitHub Actions 肯定很香。與 GitHub 版本庫串接神速;有著超大的 Marketplace 可以找到許多相關資源;與 GitLab CI 或 Drone CI 類似,可以使用 container 環境來執行整合或部署建置環境,真的非常好用。

本篇文章不會討論太深的技術細節,主要分享我在某些情境應用的解決方法。

PHP 套件樣版

我有自幹了一個 Composer 樣版基礎,裡面做了幾件事:

  1. 使用 shivammathur/setup-php 設定 PHP 環境,包括 Composer
  2. 安裝依賴、測試
  3. 使用 codecov/codecov-action 上傳覆蓋率報告
  4. 以上過程可以使用 matrix build 做多版本測試

前三點單純是去 Marketplace 找工具來用,第四點比較特別,設定方法如下:

jobs:
linux_tests:
runs-on: ubuntu-latest

strategy:
fail-fast: true
matrix:
php: [ 8.0, 7.4, 7.3, 7.2, 7.1 ]
stability: [ prefer-lowest, prefer-stable ]

name: PHP ${{ matrix.php }} - ${{ matrix.stability }}

matrix 裡是設定各個組合的變數,然後下面就可以使用 ${{ matrix.key }} 來取得對應組合的變數。

如果要把特定組合除外的話,可以在 matrix 加 exclude 參數;如果某些特定組合可以接受執行失敗的話,可以用 jobs.<job_id>.continue-on-error 設定,它也能接受 matrix 的變數。

Docker Image 建置與發布

過去幾年來,我還蠻熱衷做 Docker Image,使用 GitHub Actions 建置真的很方便。目前在 marketplace 用過覺得最好用的是 elgohr/Publish-Docker-Github-Action ,我目前的需求都能很好地解決:

  1. 指定 Dockerfile 位置 + matrix build
  2. 指定 Registry
  3. 在同個 IMAGE ID 上標多個 tag
  4. 偶爾會想手動建置

mileschou/xdebug 為例,指定 Dockerfile 只要在 with 加 dockerfile 參數即可:

dockerfile: 8.1/Dockerfile

指定 Registry 是類似的做法,像 GitHub Container Registry 是用下面這個設定:

registry: ghcr.io

值得一提的是,因為都是自家產品,所以產 token 的過程可以依版本庫自動授權,到 Repo Setting -> Actions -> General -> Workflow permissions 即可調整是否有寫入權限。最後帳密那裡可以這樣打:

username: mileschou
password: ${{ secrets.GITHUB_TOKEN }}

secrets.GITHUB_TOKEN 是 GitHub Actions 預定義的變數,它會在啟動 Actions 的時候給你一個臨時的 token,權限範圍限制很多但合理,只有當下 Repo 的存取權限,以及 Registry 的權限(如果有設定的話)。

如果想要人工觸發 job 的話,可以在觸發條件加上下面這個 key 即可。這樣未來在 Actions 頁面就會看到可以自己觸發的按鈕。

on:
workflow_dispatch:

小結語

GitHub Actions 真的很快!如果是寫開源在 GitHub 上的話,別懷疑,用 Actions 就對了。