在上一篇我們學到一些方便開發、除錯的workflow command
這篇我們會來了解一下shell、kernel的關係,以及常用於Github Actions的shell command
當提到Github Actions,就必須說說shell跟kernel,因為在Github Actions的runner上可以執行shell command,在workflow中也常會見到shell command
從上圖我們可以看到最外層則是user(開發者),往內一層就是shell,再往內一層是kernel(作業系統核心),最內層則是硬體
shell是user(開發者)和kernel之間的溝通橋樑
,它會把使用者輸入的指令翻成kernel看得懂的低階語言,再讓kernel指揮硬體們去執行
(以上為示意圖,shell翻譯的內容不一定如上圖)
廣義來說shell分為GUI和CLI兩種,只要能夠直接和kernel溝通就是shell
不過接下來的段落說的是CLI型的shell,因為在撰寫workflow時並沒有GUI能代替直接下指令,只能透過CLI型的shell跟runner溝通
另外,雖然shell有很多種,但是我們是bash command為準,因為大家最常用的runner
環境通常是linux,而只要不是Windows系統,那預設的shell就會是bash
你可能會想說Github Actions就有提供一些現成的語法跟function了,為什麼還要自己寫shell command
其實那些功能都是比較陽春的,像是寫入檔案(不是runner產生的暫時性環境變數檔)、迴圈、正規表達式、切換工作目錄之類常見的語法都不支援,所以才會需要它,下面會介紹幾個簡單又較常用的shell command
雖然Github Actions有提供if語法,不過有些情況還是可能會用到shell command的if
一般來說如果根據條件不同
,走的flow不同的話,我會用Github Actions的if;反之,只是根據條件不同,寫入不同的值進變數這類比較小的操作就用shell command的if
run: |
# 宣告變數
echo sentence="Good Bye"
# 使用$取得在shell的變數
# 如果sentence包含Bye
if echo $sentence | grep -q "Bye"; then
echo greeting="Have a nice day" >> $GITHUB_ENV
else
echo greeting="Hello" >> $GITHUB_ENV
fi;
不過如果可以的話還是儘量用Github Actions的if,因為就可讀性、維護性都會比較好
通常我們不會把.env推到遠端,但是程式碼內某些部分可能需要到.env拿某個環境變數,這時候就需要在透過Github Actions執行build時將環境變數注入
# 假設.env放在根目錄底下
run: echo apiSecret=${{secrets.TDX_CLIENT_SECRET}} >> .env
如果你希望在檢查到某些情況時,直接終止整個workflow,並故意讓它失敗
,讓其他開發者注意到某支PR有問題,那就可以使用exit 1
另外還有一種exit 0,它和exit 1差異在於是否為正常執行後退出程序
- name: PR title check
if: ${{ github.event.pull_request.title.length > 0 }}
run: |
echo "::error title=title of PR cannot be empty"
exit 1
- name: Build check
# 假設PR title不符合規範,就不執行這個step
# 略