新建文件

在项目根目录下新建 .github/workflows/node.js.yml

工作流脚本

# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs

name: Node.js CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [20.17.0]
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/

    steps:
      - name: Install pnpm
        run: npm install -g pnpm

      - uses: actions/checkout@v3
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'pnpm'

      - run: pnpm install
      - run: pnpm run build

      - name: Deploy To Server
        uses: easingthemes/ssh-deploy@main
        with:
          # 本地.ssh文件下的私钥id_rsa,存在secrets的PRIVATE_KEY中
          SSH_PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
          # 源目录
          SOURCE: "./.output/"
          # 部署目标主机
          REMOTE_HOST: ${{ secrets.HOST }}
          # 部署目标主机端口
          REMOTE_PORT: ${{ secrets.PORT }}
          # 登录用户
          REMOTE_USER: ${{ secrets.USER }}
          # 部署目标目录
          TARGET: ${{ secrets.TARGET }}
          # 重启 Docker
          SCRIPT_AFTER: |
            docker restart pixiBloom

脚本解释

1. name: Node.js CI

工作流名称:给这个 GitHub Action 工作流一个名字,称为 “Node.js CI”

2. on 部分

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

触发条件:当代码推送到 main 分支时,或者当有人向 main 分支发起 Pull Request 时,该工作流会自动运行

3. strategy 部分

strategy:
  matrix:
    node-version: [20.17.0]

策略:使用 matrix 策略可以运行多个不同版本的 Node.js。这里指定了 20.17.0 版本

参考:Node.js 发布计划的链接

4. steps 部分

定义了在作业中要执行的步骤,每个步骤代表一个操作

4.1 安装 pnpm

- name: Install pnpm
  run: npm install -g pnpm

首先安装 pnpm,这是一个 Node.js 的包管理工具,类似于 npm 和 yarn

4.2 检出代码

- uses: actions/checkout@v3

从仓库中检出代码,这个步骤使用的是官方的 actions/checkout GitHub Action,它负责将你的代码拉取到虚拟机中

4.3 设置 Node.js 版本

- name: Use Node.js ${{ matrix.node-version }}
  uses: actions/setup-node@v3
  with:
    node-version: ${{ matrix.node-version }}
    cache: 'pnpm'

使用 actions/setup-node GitHub Action,根据 matrix 中的版本信息,设置指定的 Node.js 版本,并启用 pnpm 缓存,以加快依赖安装速度

4.4 安装依赖

- run: pnpm install

通过 pnpm 安装项目所需的依赖

4.5 构建项目

- run: pnpm run build

执行 pnpm run build 命令,通常是构建生产环境的代码(例如打包、编译)

5. 部署到服务器

- name: Deploy To Server
  uses: easingthemes/ssh-deploy@main
  with:
    SSH_PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
    SOURCE: "./.output/"
    REMOTE_HOST: ${{ secrets.HOST }}
    REMOTE_PORT: ${{ secrets.PORT }}
    REMOTE_USER: ${{ secrets.USER }}
    TARGET: ${{ secrets.TARGET }}
    SCRIPT_AFTER: |
      docker restart pixiBloom

使用 easingthemes/ssh-deploy Action 将构建后的代码部署到远程服务器上

SSH_PRIVATE_KEY: 使用 GitHub Secrets 中存储的 PRIVATE_KEY 作为 SSH 私钥,以便连接到远程服务器。

SOURCE: 指定要部署的本地目录为 ./.output/。

REMOTE_HOST: 远程主机的地址,通过 Secrets 变量 HOST 传递。

REMOTE_PORT: 远程主机的端口,通过 Secrets 变量 PORT 传递。

REMOTE_USER: 远程主机的登录用户,通过 Secrets 变量 USER 传递。

TARGET: 远程服务器上的目标目录,通过 Secrets 变量 TARGET 传递。

SCRIPT_AFTER: 部署后运行的脚本,这里是重启 Docker 中的 pixiBloom 容器。