iT邦幫忙

2021 iThome 鐵人賽

DAY 14
3
DevOps

不僅是程式碼代管平台 - Github 能做些什麼?系列 第 14

GitHub Action YAML 撰寫技巧 - 環境變數(Environment Variables) 與 秘密 (Secrets)

  • 分享至 

  • xImage
  •  

今天要提到一些關於 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() )

https://ithelp.ithome.com.tw/upload/images/20210914/20091494Ob6I64tSz3.png

若你要在某個 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 步驟如下:

建立 Repository secret

開啟 Repo,點選右上方 Settings 功能
https://ithelp.ithome.com.tw/upload/images/20210914/20091494pw0ddVd5P0.png

點選右邊選單 secret > 點選右上角 New repository secret
https://ithelp.ithome.com.tw/upload/images/20210914/200914948X0KnOVeEf.png

輸入 Name 與 Value
https://ithelp.ithome.com.tw/upload/images/20210914/20091494SJl4DjNiT4.png

完成後,即可看見已經建立好的 secret
https://ithelp.ithome.com.tw/upload/images/20210914/20091494UDTGg8kAKn.png

當你在 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 }}

建立 Environment secret.

多環境其實意旨在保護 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 功能
https://ithelp.ithome.com.tw/upload/images/20210914/20091494pw0ddVd5P0.png

點選左邊 Enviroment,點選右上角 New Enviroment (若你已經建立環境,可以跳過此步驟)
https://ithelp.ithome.com.tw/upload/images/20210914/20091494NYTHQJKDKc.png

輸入環境名稱,點選 configure environment
https://ithelp.ithome.com.tw/upload/images/20210914/200914943oDhvow4u6.png

找到 Environment secrets, 點選 Add secret.
https://ithelp.ithome.com.tw/upload/images/20210914/20091494YTCAb57pGo.png

輸入名稱與值,完成後,即可看見 Secret 已經設定好了
https://ithelp.ithome.com.tw/upload/images/20210914/20091494nw88dTDuPe.png

https://ithelp.ithome.com.tw/upload/images/20210914/20091494OxBgKUyhHf.png


閱讀完本篇文章,你應該對環境變數與秘密的使用已經有初步的了解。這章節的內容稍微繁瑣一些,實際操作的時候需要多嘗試才能累積經驗。實作中若需要了解更多語法,可以參考最下方參考資料。

若喜歡我的文章,歡迎點 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


上一篇
GitHub Event - 觸發 workflow 重要設定
下一篇
GitHub Action 實作持續整合 - 以 ASP.NET Core 專案為例
系列文
不僅是程式碼代管平台 - Github 能做些什麼?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
wrxue
iT邦好手 1 級 ‧ 2022-02-08 22:47:35

請問 $ 與 ${} 與 ${{}} 差別在哪裡,何時應該用哪個...困惑好久!

Duran Hsieh iT邦研究生 5 級 ‧ 2022-03-15 15:13:14 檢舉

不好意思,寫這篇文章的時候比較趕,沒說明清楚。有機會我再更新一下文章。

環境變數是傳至Runner使用,所以文章內的範例是使用 linux,所以執行 shell 時要使用 $變數 取得環境變數。以此類推,如果你是使用 Windows,則是執行 PowerShell,要用 $env:name

執行 if 這行時不在 Runner 執行,而是在 GitHub Action 執行,這時候只能用 Context 方式 ${{NAME}} 取得環境變數。

希望有回答到您的問題

我要留言

立即登入留言