在上一篇我們學到用composite action的方式複用workflow
這篇我們會來會來看一下如何用在D13提到的actions/toolkit的core撰寫JS action
使用actions/toolkit可以以JS撰寫action,這個方式建立的action,可以簡化
一些用shell script處理較複雜的事
(e.g.:打API、大量的條件判斷)
此外這也是除了reusable workflow、composite action以外的複用action
方法、建立發布到Marketplace的action的方法
npm init
# 你想用default設定的話,就加上-y
npm init -y
npm install @actions/core
npm install @actions/github
在專案跟目錄底下建立action.yml
注意metadata file的檔名一定要是action.yml
(yaml),如果取不一樣的名稱會出錯
name: 'Say hello'
description: 'Greet someone'
inputs:
name:
description: "Someone's name"
required: true
default: 'Somebody'
outputs:
reply:
runs:
using: 'node20'
main: 'index.js'
新增一個index.js,放在哪都可以,只要在action.yml的main正確地指向它的位置即可
const core = require('@actions/core');
const github = require('@actions/github');
try {
const nameToGreet = core.getInput('name');
console.log(`Hello ${nameToGreet}!. How's it going with your new workflow?`);
// 透過github context可以取得觸發workflow的相關資訊
const repoName = github.context.payload.repository;
core.setOutput(`reply', 'It\'s amazing. I installed actions/toolkit to my repo. With the package, I can write a workflow with JavaScript in ${repoName}.`);
} catch (error) {
// 印出error,並拋出錯誤讓整個workflow失敗
core.setFailed(error.message, 1);
}
接下來有兩種做法
node_modules/*
的所有有變更的檔案都推到遠端
之所以會需要這麼做是因為GitHub 會在runtime下載workflow中的每個操作,並將其作為完整的package執行,所以才把JS action會用到的package推到遠端
不想把node_modules推到遠端
,使用
下個步驟提到的ncc
進行打包最後打上tag
git tag 1.0.0
git push --follow-tags
如果你要把action發佈到marketplace
就需要打包
,但是如果只是要在同repo內使用就可以跳過打包步驟
在同個repo內使用JS action的方法和下個段落提到的相去不遠,只差在uses傳的是metadata file所在的path,詳細會在之後的篇章中示範(預定在Day24)
npm i -g @vercel/ncc
#或
npm i @vercel/ncc
用指令編譯index.js,@vercel/ncc
會把index.js內的程式碼和它使用到的package一起打包成一個檔案
,如此一來就不必把node_modules推到遠端
這樣就不用在workflow中額外跑安裝package的指令,這樣可以省下每次安裝package的時間,也可以避免當npm registry掛掉的時無法下載package進而導致workflow故障的風險
ncc build index.js --license licenses.txt
#如果非全域安裝則在指令前加上npx
npx ncc build index.js --license licenses.txt
修改action.yml的main為編譯過的檔案
main: 'dist/index.js'
如果沒有把node_modules加入.gitigore的話,最後記得把node_modules刪掉
rm -rf node_modules/*
name: Try JavaScript action
on:
push:
branches:
- master
jobs:
try:
runs-on: ubuntu-latest
steps:
# clone repo才讀得到package.json
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: |
# 選擇不把node_modules推到遠端的話,需要先安裝package
# 若有推到遠端的話以上3個step都可以省略
npm install
npm list
- id: trial
# 如果是走打包action的方式一定要遵循<owner name>/<repo name>@<tag>的格式
uses: tempura327/try-github-actions@v1.0.8
with:
name: 'Tempura Ninja'
- run: |
echo How\'s it going with your new workflow?
echo ${{ steps.trial.outputs.output1 }}
shell: bash