自定义 Github Action 库实战详解
作者:小鑫同学 发布时间:2022-04-07 13:19:00
标签:Github,Action,自定义库
auto-push-oss Action
虽然在 Github 市场有推送 OSS 相关的 Action,但是我还是选择改造我运行了好多年的脚本来自定义符合自己要求的 Action 库。
编写步骤:
添加依赖、编译脚本、action.yml配置
编写自述文档
编写indnex.js脚本
添加依赖、编译脚本、action.yml配置:
添加必要依赖:
"@actions/core": "^1.9.1"// 读取 yml 参数
"@vercel/ncc": "^0.34.0" // 打包脚本
"ali-oss": "^6.17.1" // ali-oss依赖
添加编译脚本:
"build": "ncc build index.js --license licenses.txt"
编写 action.yml 配置文件:
name: "auto-push-oss"
description: "自动推动目录到 OSS"
# 定义输入参数
inputs:
root:
description: "待推送路径"
required: true
bucket:
description: "oss bucket"
required: true
region:
description: "oss region"
required: true
accessKeyId:
description: "oss accessKeyId"
required: true
accessKeySecret:
description: "oss accessKeySecret"
required: true
runs:
# 脚本运行环境(按官方文档给的12版本来使用)
using: "node12"
# 脚本执行入口(这里我们要用@vercel/ncc编译)
main: "dist/index.js"
编写自述文档:
自述文档需要说明这个 Action 的主要作用、需要配置的参数和最小使用的例子~
auto-push-oss
方便将常见的 Vue 项目,VuePress 项目构建到根目录的 dist 文件夹推送到指定从 oss 桶的根目录,特别适合在 oss 托管 VuePress 博客~
Inputs
参数 | 描述 |
---|---|
root | 待推送文件夹 |
bucket | oss bucket |
region | oss region |
accessKeyId | oss accessKeyId |
accessKeySecret | oss accessKeySecret |
Example usage
uses: OSpoon/auto-push-oss@main
with:
root: public
bucket: it200
region: oss-cn-beijing
accessKeyId: ${{secrets.accessKeyId}}
accessKeySecret: ${{secrets.accessKeySecret}}
编写indnex.js脚本:
提供path、fs、ali-oss 和获取 yml 参数的@actions/core依赖~
const path = require("path");
const fs = require("fs");
const core = require("@actions/core");
const OSS = require("ali-oss");
通过@actions/core提供的getInput来获取 yml 配置的参数变量~
const root = core.getInput("root");
const bucket = core.getInput("bucket");
const region = core.getInput("region");
const accessKeyId = core.getInput("accessKeyId");
const accessKeySecret = core.getInput("accessKeySecret");
OSS 推送文件主脚本
// TODO 必要依赖
// TODO 接收输入参数
const client = new OSS({
bucket,
region,
accessKeyId,
accessKeySecret,
});
const rootPath = root || "dist";
const isHave = fs.existsSync(rootPath);
if (!isHave) {
throw new Error("路劲不存在");
}
let filepaths = [];
let putCount = 0;
function readFileSync(filepath) {
let files = fs.readdirSync(filepath);
files.forEach((filename) => {
let p = path.join(filepath, filename);
let stats = fs.statSync(p);
if (stats.isFile()) {
filepaths.push(p);
} else if (stats.isDirectory()) {
readFileSync(p);
}
});
}
function put(filepath) {
const p = filepath.replace(rootPath, "").substr(1);
return client.put(p.replace("\", "/"), filepath);
}
async function update() {
try {
// 递归获取所有待上传文件路径
readFileSync(rootPath);
let retAll = await filepaths.map((filepath) => {
putCount++;
console.log(`任务添加: ${path.basename(filepath)}`);
return put(filepath);
});
Promise.all(retAll).then((res) => {
const resAll = res.map((r) => {
return r.res.statusCode === 200;
});
if (Object.keys(resAll).length === putCount) {
console.log("发布成功");
}
});
} catch (e) {
console.log(e);
}
}
// 上传发布
update();
use auto-push-oss
下面这份配置就是将网站打包并推送 OSS 的工作流程,当监测到新代码 PUSH 到 Github 后就开始执行auto-push-2-oss工作流,分别是:
第一步使用actions/checkout@v2拉取代码;
第二步执行npm install && npm run build安装依赖并输出网站资源;
第三步使用OSpoon/auto-push-oss@main推送网站资源到 OSS;
auto-push-oss@main需要配置我们在自述文档中提到的几个必要参数需要通过 with 配置,其中accessKeyId和accessKeySecret由于涉及到 OSS 的相关秘钥,不建议也不应该明文展示到 Github,所以需要使用到项目级别的环境变量。
name: push-2-oss
on: [push]
jobs:
auto-push-2-oss:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v2
- name: install & build
run: npm install && npm run build
- name: push public oss
uses: OSpoon/auto-push-oss@main
with:
root: public
bucket: it200
region: oss-cn-beijing
accessKeyId: ${{secrets.accessKeyId}}
accessKeySecret: ${{secrets.accessKeySecret}}
来源:https://juejin.cn/post/7147460506645692430


猜你喜欢
- 1、什么是混淆矩阵深度学习中,混淆矩阵是ROC曲线绘制的基础,同时它也是衡量分类型模型准确度中最基本,最直观,计算最简单的方法。它可以直观地
- 最初我们介绍到 Matplotlib 可以绘制2D图形,并且介绍了一些常见图形的绘制方法,其实不仅可以绘制2D图形,现在较新版本的 Matp
- 1、下载从如下地址下载mycat的安装包:http://www.mycat.io/2、解压解压下载的安装包3、安装安装mycat
- RPC是什么?所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,
- Pygame是一个多用于游戏开发的模块。本文实例主要是在演示框里实现一个移动的矩形实例代码,完整代码如下:#moving rectangle
- 前言go不要求类型显示地声明实现了哪个接口,只要实现了相关的方法即可,编译器就能检测到空接口类型可以接收任意类型的数据:type eface
- debug的时候,有时希望打印某些东西,但是如果代码段刚好在一个循环或者是其他会被执行很多次的部分,那么用来print的语句也会被执行很多次
- 背景:大约有3K家商家需要重新确认信息并签订合同。合同是统一的Word版本。每个供应商需要修改合同内的金额部分。人工处理方式需要每个复制粘贴
- 前言PyTorch作为一款深度学习框架,已经帮助我们实现了很多很多的功能了,包括数据的读取和转换了,那么这一章节就介绍一下PyTorch内置
- 本章节将为大家介绍Python循环语句的使用。Python中的循环语句有 for 和 while。Python循环语句的控制结构图如下所示:
- 本文分析了MySQL中字符串索引对update的影响。分享给大家供大家参考,具体如下:对某一个类型为varchar的字段添加前缀索引后,基于
- 2015年1月1日,新的一年开始之际,本来应该好好做点有意义的事情来跨个年的。结果, * 惯 - 睡觉之前一定要折腾一下电脑,说干就干,给新到
- 数据标准化是机器学习、数据挖掘中常用的一种方法。包括我自己在做深度学习方面的研究时,数据标准化是最基本的一个步骤。数据标准化主要是应对特征向
- 深度学习中,模型训练一般都需要很长的时间,由于很多原因,导致模型中断训练,下面介绍继续断点训练的方法。方法一:载入模型时,不必指定迭代次数,
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:jquery读取xml文件 <!DOCTYPE html PUBLIC "
- 本文实例讲述了Python实现求解一元二次方程的方法。分享给大家供大家参考,具体如下:1. 引入math包2. 定义返回的对象3. 判断b*
- 笔者在网上找了很多关于VSCODE配置Go语言的教程,但是由于版本等种种问题,最终都已失败告终。无奈只能在官方文档上寻求帮助,现在终于可以了
- 我的通用权限系统设计是更换权限时候尽量不要涉及到代码修改,来自chinaunix论坛,今天转过来看看。希望对大家有所帮助,对PHP100的朋
- 本文实例为大家分享了python获取地震信息微信实时推送的具体代码,供大家参考,具体内容如下import requests,timefrom
- 如下所示:<!DOCTYPE html><html lang="en"><head>