自动发布
每次写完文章后,还需要登录腾讯云服务器,拉取网站更新,再重新打包部署,整个过程很乏味,有没有方法避免这个过程呢?
笔者使用 Github Action 自动将每次的更新自动打包并部署到远程云服务器,为安全起见,专门生成一个 deploy key 来进行自动发布。过程如下:
- 生成 deploy key:
- 执行
ssh-keygen -f ~/.ssh/deploy_key_qileq
生成文件名为 deploy_key_qileq - 执行
ssh-add ~/.ssh/deploy_key_qileq
将 deploy key 添加到 ssh-agent 中,若需要持久化添加到 ssh-agent 的话,可尝试将将命令添加到 ~/.zshrc(或 ~/.bashrc) 中,或执行ssh-add -K ~/.ssh/deploy_key_qileq
使用 Keychain 管理 - 执行
ssh-add -l
查看 ssh-agent 管理的密钥列表
然后将该 deploy ssh 的公钥追加到腾讯云服务器 root 用户的/root/.ssh/authorized_keys
文件。
- 将 deploy key 的公钥添加到 github 中该仓库的 Settings/Deploy keys 中。
- 打开 Github 中的仓库地址,点击 Settings/Secrets,点击 New repository secret,创建如下 secret:
Name | Value |
---|---|
DEPLOY_HOST | 云服务器的公网 ip |
DEPLOY_PORT | 云服务器的 ssh 端口,值为 22 |
DEPLOY_USER | 登录云服务器的用户,笔者设置为 root |
DEPLOY_KEY | 能登录 DEPLOY_USER@DEPLOY_HOST 的 ssh 私钥,即第一步中 deploy key 的私钥 |
DEPLOY_PATH | 网站文件地址,笔者设置为 /usr/share/nginx/html ,该设置需与 nginx 配置 的目录相同 |
DOCSEARCH_CONFIG | Algolia DocSearch 配置文件目录,参考部署爬虫,在每次发布完网站后自动更新 Algolia 索引 |
- Github 仓库中点击 Actions,创建 yaml 文件,内容如下:
main.yaml
# This is a basic workflow to help you get started with Actions
name: Release
# Controls when the workflow will run
on:
# Triggers the workflow on push or pull request events but only for the master branch
push:
branches: [ master ]
# pull_request:
# branches: [ master ]
paths-ignore: # 下列文件的变更不触发 workflow
- README.md
- LICENSE
- .gitignore
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
env:
NODE_VERSION: '16.14.2'
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: setup node
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: npm build and tar build
run: |
npm i
npm run build
tar -cvjf build.tar.bz2 build
- name: Rsync tar package to server
uses: burnett01/rsync-deployments@5.2
with:
switches: -avzr --delete
path: build.tar.bz2
remote_path: ${{ secrets.DEPLOY_PATH }}
remote_host: ${{ secrets.DEPLOY_HOST }}
remote_port: ${{ secrets.DEPLOY_PORT }}
remote_user: ${{ secrets.DEPLOY_USER }}
remote_key: ${{ secrets.DEPLOY_KEY }}
deploy:
name: Deploy
needs: build
runs-on: ubuntu-latest
steps:
- name: Restart server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_KEY }}
script: |
cd ${{ secrets.DEPLOY_PATH }}
tar -xvjf build.tar.bz2
rm -rf qileq
mv build qileq
systemctl reload nginx
su - ubuntu # 切换到安装 jq 的用户,假设用户名为 ubuntu,若已为 root 用户则不需要切换
cd ${{ secrets.DOCSEARCH_CONFIG }} # 进入 docsearch.json 目录
sudo docker run --env-file=.env -e "CONFIG=$(cat docsearch.json | jq -r tostring)" algolia/docsearch-scraper
可以看到上述工作流很简单,笔者分为两个 job:
build
:构建 build 文件,并打包为 tar.bz2 包,再发送给远程云服务器。这里笔者将build
目录压缩成 tar.bz2 包再传输,经测试知压缩率能达到90%
,对于频繁更新的网站,压缩能有效减少传输的流量。deploy
:解压上一步的 tar.bz2 包,并 reload nginx 服务。
整个过程对线上网站而言基本是无损切换。