前端自动化部署
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
才可以。
- 安装
rsync
(传输的双方都必须安装rsync
)
# Debian
$ sudo apt-get install rsync
# Red Hat
$ sudo yum install rsync
# Arch Linux
$ sudo pacman -S rsync
- 设置远程服务器
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
- 重启远程服务器的
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 }}