在上一篇我們學到了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把它遮住