首頁 > 軟體

自定義 Github Action 庫實戰詳解

2022-09-28 14:00:58

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待推播資料夾
bucketoss bucket
regionoss region
accessKeyIdoss accessKeyId
accessKeySecretoss 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}}

總結

編寫完 Action 後成功也接入了 workflows ,往後就不再重複的執行構建命令和釋出指令碼了,只需要將修改的程式碼 PUSH 到 Github 後面的工作將自動完成~

本文專案已推播至GitHub,歡迎克隆演示:git clone git@github.com:OSpoon/auto-push-oss.git

以上就是自定義 Github Action 庫實戰詳解的詳細內容,更多關於Github Action 庫自定義的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com