在上一篇我們學到用actions/toolkit的core撰寫JS action
這篇我們會來會來看一下如何在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檔
不過這個方法也有一些缺點
npm install minimist
minimist 是一個Node package,用來解析command中帶的參數,並將參數轉換為 JavaScript 物件,讓處理傳入的參數更方便
在.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就會被放在這些檔案中,所以無法用這種方式無法寫入這個暫存檔
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
