iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
DevOps

菜逼八用Github Actions系列 第 19

Day 19 - 在workflow中執行js檔

  • 分享至 

  • xImage
  •  

目錄

摘要

在上一篇我們學到用actions/toolkit的core撰寫JS action

這篇我們會來會來看一下如何在workflow中執行js檔

為什麼在workflow中執行js檔

在workflow中執行js檔和製作一個JS action並在workflow中使用它的概念有點像,它們都是以JS去撰寫,並複用那些邏輯,不過這並不是一個正規的方法,而是一種workfaround

通常如果有以下需求的話可以考慮採這個方式

1.若本地執行、Github Actions上執行都會發生的話,就建議採在workflow中執行js檔
因為我們可以透過command傳參數給js檔,但是JS action一定只能透過input context接收參數,故無法在本地成功執行

2.未來考慮搬家到其他平台
例如Jenkins並沒不支援JS action的功能,但是可以仍可以執行js檔

不過這個方法也有一些缺點

  1. 無法定義多個output
  2. 所有印出的東西都會被當成output,因此無法隨意使用console.log()之類的方式來debug或者做log

步驟

前置

  1. 安裝package
npm install minimist

minimist 是一個Node package,用來解析command中帶的參數,並將參數轉換為 JavaScript 物件,讓處理傳入的參數更方便

建立js檔

在.github目錄以外的地方建個資料夾裝工具類的js檔

import minimist from 'minimist';

function main(){
  const argv = minimist(process.argv.slice(2));

  const userName = argv.name;

  // 在這個js檔中所有印出的東西都會被視為return value,所以要慎選印出的內容
  console.log(`Hello ${userName}. How's it going with your new workflow?`);

  console.log('It\'s good. I\'m trying to run JS file in it.');

  // 反而return value不會被當作return value
  return `Hello ${userName}. This is my return value`;
}

main();

另外你可能也會看到有人用console.log印出set-output這個Github Actions提供的command

console.log('::set-output name=userName::Tempura');

這也是一種workaround,但set-output已被公告未來會廢棄,所以不建議這麼做

看到這你可能會好奇那console.log("userName=Tempura >> $GITHUB_OUTPUT")有沒有用,答案是沒有用

因為當workflow在執行時,runner會產生暫時的檔案,環境變數、output就會被放在這些檔案中,所以無法用這種方式無法寫入這個暫存檔

建立workflow

jobs:
  run_js_file:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: |
          npm install
          npm list
      - name: step1
        id: say-hello
        run: |
          echo reply=$(node tools/index.js --name Tempura) >> $GITHUB_ENV
      - name: step2
        run: | 
          echo reply is $reply

s2


上一篇
Day 18 - 用JS寫action
下一篇
Day 20 - 用matrix策略自動建立job
系列文
菜逼八用Github Actions28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言