利用GitHub Actions可以自动完成很多流水线任务,本文将介绍从使用action操作到自定义action操作
文档
.github/workflows/github-actions-demo.yml
name: GitHub Actions Demo
run-name: ${{ github.actor }} is testing out GitHub Actions
on: [push]
jobs:
Explore-GitHub-Actions:
runs-on: ubuntu-latest
steps:
- run: echo " The job was automatically triggered by a ${{ github.event_name }} event."
- run: echo " This job is now running on a ${{ runner.os }} server hosted by GitHub!"
- run: echo " The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
- name: Check out repository code
uses: actions/checkout@v3
- run: echo " The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "️ The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ github.workspace }}
- run: echo " This job's status is ${{ job.status }}."
定义了一个action操作,当代码推送的时候,触发运行,打印了一些环境信息
文档
项目结构
$ tree -I node_modules
.
├── README.md
├── action.yml
├── dist
│ ├── index.js
│ └── licenses.txt
├── index.js
├── package-lock.json
├── package.json
└── pnpm-lock.yaml
$ node -v
v16.14.0
npm init -y
pnpm install @actions/core @actions/github @vercel/ncc
package.json
{
"name": "github-action",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"build": "ncc build index.js --license licenses.txt"
},
"dependencies": {
"@actions/core": "^1.10.0",
"@actions/github": "^5.1.1",
"@vercel/ncc": "^0.36.1"
}
}
name: 'Hello World'
description: 'Greet someone and record the time'
inputs:
who-to-greet: # id of input
description: 'Who to greet'
required: true
default: 'World'
outputs:
time: # id of output
description: 'The time we greeted you'
runs:
using: 'node16'
main: 'dist/index.js'
以上代码,定义了元数据,指定了出入参数和输出参数,指定了运行入口,相当于一下两个步骤
(1)声明action接口
// ./dist/index.js
function {time} action ({who-to-greet}) {
// 执行操作
}
(2)执行action操作
$ node16 ./dist/index.js
上面定义接口的实现
const core = require("@actions/core");
const github = require("@actions/github");
try {
// `who-to-greet` input defined in action metadata file
const nameToGreet = core.getInput("who-to-greet");
console.log(`Hello ${nameToGreet}!`);
const time = new Date().toTimeString();
core.setOutput("time", time);
// Get the JSON webhook payload for the event that triggered the workflow
const payload = JSON.stringify(github.context.payload, undefined, 2);
console.log(`The event payload: ${payload}`);
} catch (error) {
core.setFailed(error.message);
}
提交到本地仓库后,添加标签,发布到github
# 打包编译
npm run build
# 提交代码
git add .
git commit -m 'add code'
# 打标签发布
git tag v1.1
git push --tag
.github/workflows/main.yml
on: [push]
jobs:
hello_world_job:
runs-on: ubuntu-latest
name: A job to say hello
steps:
- name: Hello world action step
id: hello
uses: mouday/github-action@v1.1
with:
who-to-greet: 'Mona the Octocat'
# Use the output from the `hello` step
- name: Get the output time
run: echo "The time was ${{ steps.hello.outputs.time }}"
示例代码仓库地址:https://github.com/mouday/github-action
可以基于github提供的模板快速开发
可以参考他提供的项目模板进行开发
$ tree
.
├── CODEOWNERS
├── LICENSE
├── README.md
├── __tests__
│ └── main.test.ts
├── action.yml
├── dist
│ ├── index.js
│ ├── index.js.map
│ ├── licenses.txt
│ └── sourcemap-register.js
├── jest.config.js
├── package-lock.json
├── package.json
├── src
│ ├── main.ts
│ └── wait.ts
└── tsconfig.json
问题1:Error: Cannot find module ‘@actions/core’
需要打包发布,不然会提示找不到模块