在上一篇我們學到了context是什麼,以及有哪些常見的context可以使用
在這篇我們會來了解一下一種用於儲存敏感資訊的叫做secret的變數
secret是一種用於存敏感資訊的變數,當建立完以後,在workflow內加上permissions屬性就可以在Github Actions上讀取它

上圖圈起來的就是secret,***則是Github Actions自動幫它上的mask
建立後可以隨時改掉值,不過看不到之前的值,在edit頁只會顯示一個空空的textarea
根據scope,secret可以分為organization level、environment level和repo level 3種
repo level
常用的secretfree plan可以用
environment level
organization level
多個repo共用
優先序最高 (同名時會覆蓋掉以上兩個)不以GITHUB_、數字開頭 
選擇repo > setting > secret and variables > actions


org > setting (> 建立環境) > 選擇環境



org > setting > security > secret and variables




更詳細的操作可以看Manage Secrets in GitHub
假設我的repo裡的程式碼有一段要打TDX的API
是我不想要把client secret暴露在程式碼內,那顯然新增.env,再把client secret放進去也不是個好主意 (如果不是敏感資訊就算了,但偏偏它就是)
不過可以這樣做
export const getAccessToken = async () => {
  const { data } = await axios({
    method: "POST",
    url: `https://tdx.transportdata.tw/auth/realms/TDXConnect/protocol/openid-connect/token`,
    data: {
      grant_type: "client_credentials",
      client_id: "your client id",
      // Next或者Remix則改成process.env.TDX_CLIENT_SECRET
      client_secret: import.meta.env.VITE_PUBLIC_TDX_CLIENT_SECRET,
    },
    headers: { "content-type": "application/x-www-form-urlencoded" },
  });
  return data.access_token;
};
看到這裡你可能會想「WTF?!.env不是不上git嗎」、「WTF?!不是說不放在.env嗎」
事實上我們是要透過Github Actions把client secret寫入.env

- name: Set secret for calling API
  env: 
    clientSecret: ${{secrets.TDX_CLIENT_SECRET}}
  run: | 
    echo VITE_PUBLIC_TDX_CLIENT_SECRET=${clientSecret}
這邊可能會有人覺得疑惑為什麼要多一步把secret放到step的環境變數
那是因為如果沒有放進去的話,會被log記錄到,這可能導致安全問題
但千萬記得放入env後就不要把它印出來,因為這時Github Actions就不會自動用mask把它遮住