GitHub Action YAML 撰写技巧 - 环境变数(Environment Variables) 与 秘密 (Secrets)

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


<<:  Day 14 - Object and Arrays - Reference VS Copy

>>:  网页基础介绍及开发环境准备(DAY1)

初学者跪着学JavaScript Day18 : 物件:new Map()

一日客语:中文:柚子 客语:U欸 是收集资料的类型 主要功用:可以用於快速搜索和查找资料 Map又称...

Intro

屯马开通真的很兴奋 早阵子(2021 年 6 月 27 日)港铁屯马綫全綫通车,当日有电视台访问了一...

#14 No-code 之旅 — 怎麽利用 Chakra UI 去做 React 元件客制化?

继续昨天的主题,该怎麽用 Chakra UI 做开发呢?现成的元件该怎麽去做客制化?专案有定设计系统...

前端工程师也能开发全端网页:挑战 30 天用 React 加上 Firebase 打造社群网站|Day3 建立 React 网页

连续 30 天不中断每天上传一支教学影片,教你如何用 React 加上 Firebase 打造社群...

Python & PyMongo 学习笔记_GridFS API

一、简易说明 Mongo DB 对於单个 Document 的大小限制为 16MB, 若想储存大於这...