iT邦幫忙

2024 iThome 鐵人賽

DAY 30
1

目錄

摘要

在上一篇我們實際試著把幾個pipeline翻成workflow,並看了如果搬到Github Actions,pipeline變成workflow能變得多簡潔

這篇我們會來會來看一下完成我踩過甚麼奇怪的雷,也幫助大家繞開這些雷

一般workflow

  1. 開發workflow時想試跑看看,在Github Actions的左側列表卻發現找不到

    不在default branch上的workflow,不會出現在Github Actions的左側列表,所以即便有workflow_dispatch也無法手動觸發
    此外使用github cli也無法觸發不在default branch上的workflow

    只能使用push事件,然後定義branches為當下的分支,測試完後再刪掉

  2. workflow沒開始就然後被停掉,狀態顯示"Startup failure"

    通常是語法錯誤或者誤把job的needs設為job本身

    https://ithelp.ithome.com.tw/upload/images/20241002/20135568Clp6kwzevO.png

  3. 執行的js檔中利用console.log()當作set put的workaround,卻發現印出的值與預期不同

    js檔中所有印出,都會被當作是output內容

    anis code
    如果有用ansi code幫字串上色,也會被當作是output內容,所以把ansi code(上圖黃圈處)刪掉即可

  4. 報錯" Unable to process file command 'env' successfully."

    變數值的內容太長,改用multiline string語法

  5. 報錯"Plain value cannot start with flow indicator character"

    把!運算子改成用 == false

  6. shell command的if無法讀到Github Actions環境變數

    改用Github Actions的if

    另外考慮到維護性,或者當flow完全不同時,也建議改用Github Actions的if

  7. 使用.length曲陣列長度,卻被當成要用object filter取每個元素的.length屬性
    Github Actions的context沒有提供這個功能

    可以參考這篇的最佳解Getting object length?使用jq

    或者直接使用bash指令取得長度,再存到output讓其他job也可以取用

    arr=(1 2 3 4)
    
    echo "arrLen=${#arr[@]}" >> $GITHUB_OUTPUT
    

    如果只是要知道是否為空陣列也可以使用陣列中第一個元素是否為null來判斷

    # 當arrStr為"[]"
    # 以下為true、false
    echo ${{fromJSON(env.arrStr)[0] == null}} 
    echo ${{fromJSON(env.arrStr)[0] != null}} 
    

reusable workflow & composite action

  1. metadata file沒有autocompeletion

    目前未有這個功能,不過作者說他有記下來,未來會考慮做

  2. metadata file沒有語法驗證

    github action外掛不支援.github/workflow外的.yaml、.yml的驗證,可以使用red hat出的YAML套件做補救方案

    https://ithelp.ithome.com.tw/upload/images/20240909/201355687ExHBAhOmB.png

    這個套件會預設使用以下的schema去檢查action.yaml、action.yml,所以不必在vscode的settings再多做設定,但如果有需求也可以仿造下方範例幫YAML套件添加其他schema

    "yaml.schemas": {
      "http://json.schemastore.org/github-action": [
        "action.yaml",
        "action.yml"
      ]
    },
    
  3. 可以在metadata file同時使用steps和main,然後在step跑安裝node package的指令?

    不行,steps 和 main 是兩種不同的屬性,分別用來處理不同類型的action,因此這兩者不能同時出現在同一個action.yml中

  4. 使用JS action時報錯"ReferenceError: require is not defined in ES module scope, you can use import instead"

    require()是commonJS的import方式,ES module的話要改成import

  5. 報錯"canot found action.yml"

    先查看log確認是否為路徑錯誤

    是的話,就是指向的檔案路徑不對。可用指令cd跳過去,或者用ls看目前的目錄底下有哪些路徑可以跳

    不是的話,通常是忘記clone repo,使用actions/checkout@v4即可

  6. reusable workflow(called workflow)不能使用${{secrets.SECRET_NAME}}直接取用secret

    reusable worflow中不能透過secret context取得secret,只能從caller workflow透過input傳入

marketplace action

  1. 在caller workflow內上傳artiface,試圖在reusable workflow(called workflow)使用actions/download-artifact把artifact下載下來卻失敗

    artifact 是只能在同一個 workflow 的不同 jobs 之間共享,並不能在不同的 workflows 之間直接取用
    這種情況可以考慮把reusable workflow改成JS actions

  2. 使用slackapi/slack-github-action時傳payload,可是卻出現invalid json

    檢查payload中的最後一個屬性有無trailing comma,有的話刪掉

    payload: |
      {
        "text": "New Version 🚀",
        "blocks": [
          {
            "type": "section",
            "text": {
              "type": "mrkdwn",
              "text": "New version $newVersion is deployed."
            }
          },
          {
            "type": "section",
            "text": {
              "type": "mrkdwn",
              "text": "For more details, please refer to release note."
            }
          }, // 這一行的逗點就是trailing comma
        ]
      }
    

上一篇
Day 29 - Goodbye Jenkins, and hello Github Actions
系列文
菜逼八用Github Actions30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
Dylan
iT邦新手 1 級 ‧ 2024-10-09 08:55:06

恭喜完賽~

謝謝~
也謝謝你的訂閱

我要留言

立即登入留言