生成ssh
- 生成 ssh 密钥对
ssh-keygen -m PEM -t rsa -b 4096
一路回车就行,执行完成后,我是登录的root
用户 ,就会在/root/.ssh下生成两个文件:id_rsa(私钥)id_rsa..pub(公钥)
- 将公钥的内容贴到目标服务器的 /root/.ssh/authorized_keys中
cat id_rsa.pub >> authorized_keys
- 配置私钥到仓库
在仓库的 settings/secrets/actions
, 添加一个配置项,把私钥内容粘贴在其中,同时配置上其他服务器host(公网IP)、用户名(root)等
rsync 问题
rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。
- 命令未发现
-bash: rsync: command not found
安装
apt install rsync
创建工作流文件
直接选择通用的
当然你可以手动创建,在仓库根目录中创建.github/workflows文件夹,再创建一个 YAML 文件
yaml 配置举例:
# 前端、后端 CI/CD
name: Frontend & Backend CI/CD
# 触发workflow的条件
on:
push:
# 只有master分支发生push事件时,才会触发workflow
branches: [ master ]
pull_request:
branches: [ master ]
# 变量
env:
SERVER_PRIVATE_KEY: ${{ secrets.SERVER_PRIVATE_KEY }} # 服务器私钥
SERVER_HOST: ${{ secrets.SERVER_HOST }} # 服务器IP地址
USER_NAME: ${{ secrets.USER_NAME }} # 服务器用户名
# jobs表示执行的一项或多项任务
jobs:
# 任务的job_id,具体名称自定义
# build frontend 代表打包前端
build-frontend:
# runs-on字段指定运行所需要的虚拟机环境
runs-on: ubuntu-latest
strategy:
matrix:
# 配置所需node版本
node-version: [16.x]
# 设置工作目录(因为本项目包含多个子项目)
defaults:
run:
working-directory: ./frontend
# 步骤
steps:
# 检出仓库副本
- uses: actions/checkout@v3
# 规定node版本
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
# 缓存依赖
- name: Cache nodemodules
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
# 安装依赖
- name: Install
run: npm install
# 打包
- name: Build
run: npm run build:prod
# 推送资源
- name: Deploy
uses: easingthemes/ssh-deploy@v2.2.11
env:
SSH_PRIVATE_KEY: ${{ env.SERVER_PRIVATE_KEY }}
ARGS: '-avz --delete'
SOURCE: 'frontend/dist/' # 要推送的目录,路径相对于代码仓库的根目录
REMOTE_HOST: ${{ env.SERVER_HOST }}
REMOTE_USER: ${{ env.USER_NAME }}
TARGET: /var/www/html/www.smartmiao.com/smartmiao-demo/frontend # 服务器目标路径
# build-backend 代表打包后端
build-backend:
# runs-on字段指定运行所需要的虚拟机环境
runs-on: ubuntu-latest
# 步骤
steps:
# 检出仓库副本
- uses: actions/checkout@v3
# 推送资源
- name: Deploy
uses: easingthemes/ssh-deploy@v2.2.11
env:
SSH_PRIVATE_KEY: ${{ env.SERVER_PRIVATE_KEY }}
ARGS: '-avz --delete'
SOURCE: 'backend/'
REMOTE_HOST: ${{ env.SERVER_HOST }}
REMOTE_USER: ${{ env.USER_NAME }}
TARGET: /var/www/html/www.smartmiao.com/smartmiao-demo/backend
EXCLUDE: '/node_modules, config/config_env_local.js, /config/config_env_prod.js, /app/public/, /logs' # 排除文件,否则会被删除
# 重启服务
- name: Restart service
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.USER_NAME }}
key: ${{ secrets.SERVER_PRIVATE_KEY }}
# 执行脚本
script: |
cd /var/www/html/www.smartmiao.com/smartmiao-demo/backend
npm install --production
npm run stop
npm run start
效果演示: