iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
DevOps

菜逼八用Github Actions系列 第 12

Day 12 - 常用的shell command

  • 分享至 

  • xImage
  •  

目錄

摘要

在上一篇我們學到一些方便開發、除錯的workflow command

這篇我們會來了解一下shell、kernel的關係,以及常用於Github Actions的shell command

shell是什麼

當提到Github Actions,就必須說說shell跟kernel,因為在Github Actions的runner上可以執行shell command,在workflow中也常會見到shell command

https://ithelp.ithome.com.tw/upload/images/20240920/201355687gXvlQeMMo.png

從上圖我們可以看到最外層則是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 Action常用的shell command

你可能會想說Github Actions就有提供一些現成的語法跟function了,為什麼還要自己寫shell command

其實那些功能都是比較陽春的,像是寫入檔案(不是runner產生的暫時性環境變數檔)、迴圈、正規表達式、切換工作目錄之類常見的語法都不支援,所以才會需要它,下面會介紹幾個簡單又較常用的shell command

if

雖然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
  # 略

上一篇
Day11 - workflow command
下一篇
Day 13 - 來逛GitHub Actions Marketplace
系列文
菜逼八用Github Actions30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言