跳到主要内容

前端自动化部署

2024年04月27日
柏拉文
越努力,越幸运

一、创建密钥


登录远程服务器, 在控制台执行 ssh-keygen -m PEM -t rsa -b 4096 生成 pem 格式的 SSH 公钥和私钥。将 id_rsa.pub 公钥通过 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 复制到 authorized_keys 文件中,然后将 id_rsa 私钥存放到 GitHub -> 项目仓库 -> Settings -> Secrets -> Actions -> Secrets 中。

1. 登录远程服务器, 生成 SSH 密钥

ssh-keygen -m PEM -t rsa -b 4096

2. 输入 SSH 密钥名称为 ~/.ssh/CICD_id_rsa(名称随意)

3. 将生成的 CICD_id_rsa.pub 公钥内容复制到 authorized_keys

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

4. 将生成的 CICD_id_rsa 私钥内容复制到 Github Secrets

GitHub -> 项目仓库 -> Settings -> Secrets -> Actions -> Secrets

二、定义变量


2.1 REMOTE_HOST

HOST 为服务器域名或者 IP , 添加到 GitHub -> 项目仓库 -> Settings -> Secrets -> Actions

2.2 REMOTE_USER

REMOTE_USER 一般为 root

2.3 REMOTE_TARGET

REMOTE_TARGET 服务器目标路径, 可以设置为绝对路径

~/bolawen/blog-docusaurus-webpack/build

2.3 SSH_PRIVATE_KEY

SSH_PRIVATE_KEY 是第一步创建的 SSH 私钥, 从服务器中读取 SSH 私钥, 添加到 GitHub -> 项目仓库 -> Settings -> Secrets -> Actions

三、脚本要素


3.1 Node Setup

3.2 Pnpm Setup

3.3 SSH Deploy

由于 easingthemes/ssh-deploy@main 底层是通过 rsync 来实现本地计算机与远程计算机之间的同步文件,所以我们需要在远程服务器安装 rsync 才可以。

  1. 安装 rsync(传输的双方都必须安装 rsync)
# Debian
$ sudo apt-get install rsync

# Red Hat
$ sudo yum install rsync

# Arch Linux
$ sudo pacman -S rsync
  1. 设置远程服务器 SSH 登录权限: 进入 ssh 文件夹,不同的机器可能安装位置不一样我的目录是 /etc/ssh, 打开 sshd_config ,vim sshd_config,找到 PermitRootLogin 将其设置为 yes,PubkeyAuthentication 将其设置为 yes
# Authentication:
#LoginGraceTime 2m
PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
PubkeyAuthentication yes
  1. 重启远程服务器的 SSH 服务
service sshd restart

四、编写脚本


name: 前端自动化部署(CI/CD)

on:
push:
branches:
- master
paths:
- 'src/**'
- 'docs/**'
- '.github/**'
workflow_dispatch:

jobs:
build-and-deploy:
runs-on: ubuntu-latest

steps:
- name: Actions Checkout
uses: actions/checkout@v3

- name: Install Node.js 18
uses: actions/setup-node@v3
with:
node-version: '18.0.0'

- name: Install pnpm
uses: pnpm/action-setup@v3
with:
version: 8

- name: Build Project
run: |
rm -rf node_modules
pnpm install
pnpm build

- name: SSH Deploy
uses: easingthemes/ssh-deploy@main
env:
SOURCE: 'build/'
ARGS: '-rlgoDzvc -i --delete'
EXCLUDE: '/dist/, /node_modules/'
TARGET: ${{ secrets.REMOTE_TARGET }}
REMOTE_USER: ${{ secrets.REMOTE_USER }}
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}