今天要提到一些關於 GitHub Action 內撰寫 YAML 一些技巧,環境變數 (Environment Variables) 與秘密 (Secrets)。雖然第一次使用的朋友看見這類型撰寫內容會感覺難以閱讀 (例如: ${{ env.DAY_OF_WEEK == 'Mon' }}
),但可以達到取得目前執行狀態、變數重複使用、多環境設定 與 保護敏感資訊 效果,讓開發人員更容易維護 YAML 檔案。
GitHub 已經預設了多個環境變數讓 GitHub Actions workflow 使用,理所當然,開發人員也可以設定自訂的環境變數在你的 workflow 檔案中。環境變數區分大小寫 (case-sensitive),且能在 action 與 step 建立、讀取、修改環境變數。
如果你要在檔案中設定環境變數,必須使用 env 語法進行設定,並且在 step 或 action 內使用。以下圖為例,在 job 中以 env:
宣告變數,在後續以 ${{ <expression> }}
方式使用。
可以使用 GitHub Context, Env Context, Job Context, Step Context 與 Runner Context,也能在裡面使用運算子 (如: == 與 && ) 與 Function (如: conntains() 與 startsWith() )
若你要在某個 Step 內建立/更新環境變數,讓後續的 Step,你可以透過下列語法建立。以下列 YAML 檔案為例,在 step_one 建立了一個環境變數 action_state,內容值為 yellow,雖然在 step_one 內無法取得 yellow,但在step_two 後即可使用此環境變數
steps:
- name: Set the value
id: step_one
run: |
echo "action_state=yellow" >> $GITHUB_ENV
- name: Use the value
id: step_two
run: |
echo "${{ env.action_state }}" # This will output 'yellow'
有些時候,workflow 需要一些敏感資訊 (如:密碼、秘密或Key) 才能與其他服務互動。若將這些重要資訊寫死在 YAML 上相當危險,若你的 repo 是 public,等同是直接將敏感資訊暴露在網路上。另一方面,即使 repo 是 private,production 資訊我們也不願讓所有協同開發者取得,避免不必要的風險。
GitHub 內可以設定 Secret,在 YAML 檔案內以類似環境變數方式取得,如此一來,即使 YAML 檔案暴露在外,也不用擔心敏感資訊外流。建立 Secret 步驟如下:
開啟 Repo,點選右上方 Settings 功能
點選右邊選單 secret > 點選右上角 New repository secret
輸入 Name 與 Value
完成後,即可看見已經建立好的 secret
當你在 YAML 中使用時,只需要透過 ${{ secrets.name }}
,如下面範例
steps:
- name: Hello world action
with: # Set the secret as an input
API_SECRET: ${{ secrets.APISecret }}
env: # Or as an environment variable
API_API_SECRET: ${{ secrets.APISecret }}
多環境其實意旨在保護 Production 的相關設定,你在 YAML 檔案可以定義此 workflow 的目標環境
environment: Dev
當你在 YAML 中使用時,只需要透過 ${{ secrets.name }}
格式即可使用,如下面範例
steps:
- name: Hello world action
with: # Set the secret as an input
API_SECRET: ${{ secrets.APISecret }}
env: # Or as an environment variable
API_API_SECRET: ${{ secrets.APISecret }}
建立方法多了一些步驟:
開啟 Repo,點選右上方 Setting 功能
點選左邊 Enviroment,點選右上角 New Enviroment (若你已經建立環境,可以跳過此步驟)
輸入環境名稱,點選 configure environment
找到 Environment secrets, 點選 Add secret.
輸入名稱與值,完成後,即可看見 Secret 已經設定好了
閱讀完本篇文章,你應該對環境變數與秘密的使用已經有初步的了解。這章節的內容稍微繁瑣一些,實際操作的時候需要多嘗試才能累積經驗。實作中若需要了解更多語法,可以參考最下方參考資料。
若喜歡我的文章,歡迎點 like, 分享與訂閱。
https://docs.github.com/en/actions/reference/environment-variables
https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions
https://docs.github.com/en/actions/reference/encrypted-secrets
請問 $ 與 ${} 與 ${{}} 差別在哪裡,何時應該用哪個...困惑好久!
不好意思,寫這篇文章的時候比較趕,沒說明清楚。有機會我再更新一下文章。
環境變數是傳至Runner使用,所以文章內的範例是使用 linux,所以執行 shell 時要使用 $變數 取得環境變數。以此類推,如果你是使用 Windows,則是執行 PowerShell,要用 $env:name
執行 if 這行時不在 Runner 執行,而是在 GitHub Action 執行,這時候只能用 Context 方式 ${{NAME}} 取得環境變數。
希望有回答到您的問題