笔记hexogithub利用 GitHub Actions 实现 hexo 自动部署到远程服务器
桑若木前言
GitHub Actions 是 GitHub 推出的可用于自动化构建,测试和部署项目的平台,可以通过创建工作流来自动化,自定义和执行软件开发工作流程. GitHub Actions 的具体用法有很多,本文仅介绍如何利用它来实现对 Hexo 项目的自动化部署.
准备工作
- 本地已搭建好 Hexo 项目
- 创建一个 GitHub 仓库用于存储你的 Hexo 项目源码
- 创建一个 GitHub 仓库用于存储生成的静态页面文件 (如未主动创建,则
Github会将生成的静态文件推送到项目源码的master分支)
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| name: 自动部署 on: push: branches: - main release: types: - published
jobs: deploy: runs-on: ubuntu-latest steps: - name: 检查分支 uses: actions/checkout@v3 with: ref: main
- name: 安装 Node uses: actions/setup-node@v3 with: node-version: "20.x"
- name: 安装 Hexo run: | export TZ='Asia/Shanghai' npm install hexo-cli -g
- name: 缓存 Hexo id: cache-npm uses: actions/cache@v3 env: cache-name: cache-node-modules with: path: node_modules key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-build-${{ env.cache-name }}- ${{ runner.os }}-build- ${{ runner.os }}-
- name: 安装依赖 if: ${{ steps.cache-npm.outputs.cache-hit != 'true' }} run: | npm install gulp-cli -g #全局安装gulp npm install --save - name: 配置algolia环境变量 run: | export ALGOLIA_ADMIN_API_KEY=… export HEXO_ALGOLIA_INDEXING_KEY=… - name: 生成静态文件 run: | hexo clean hexo bangumi -u hexo cinema -u hexo generate hexo algolia hexo deploy gulp
- name: 部署到Github run: | cd ./public git init git config --global user.name "username" git config --global user.email "e-mail" git add . git commit -m '${{ github.event.head_commit.message }}' git push --force --all https://username:github token@github.com/sucooer/sucooer.github.io.git - name: 部署到服务器 uses: burnett01/rsync-deployments@5.2.1 with: switches: -avzh path: public/ remote_path: /root/docker/npm/ remote_host: 服务器ip remote_port: 22 remote_user: root remote_key: ${{ secrets.SERVER_KEY }}
|
注意:- on
push 表示在 push 至该仓库的 main 分支时触发此 workflow, 你可以在 paths-ignore 下添加排除的路径 (即有改动也不触发) jobs 下的 job 可以自定义名称,但是建议不要有空格,name 则可以自定义任意名称 (可以中文)step 下的一个分支必须且只能使用 run 和 uses 中的一个uses 表示使用现有的 GitHub Actions (可以在右侧 Marketplace 搜索)- 形如
${{ secrets.xx }} 的变量为项目的 secret, 均需要在项目中添加,具体位置如下图

文本中流程执行结果是将静态文件部署到个人服务器中去
最后部署部分脚本通过 ssh 上的 rsync 将文件部署到远程文件夹中,具体参数如下
- switches:rsync 标志,例如:
-avzr --delete - path:要上传文件地址,当前 hexo g 之后静态文件在
public/ 中 - remote_path:博客在服务器中的路径
- remote_host:主机地址
- remote_port:ssh 连接端口号
- remote_user:要连接的用户
- remote_key:服务器生成的密钥
服务器获取SSH连接密钥
登录服务器终端,输入命令 ssh-keygen
出现的提示内容一路回车,最终会在 ~/.ssh 生成公钥和私钥 id_rsa.pub、id_rsa
将公钥 id_rsa.pub 复制到 authorized_keys
1
| cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
|
复制一份私钥内容填入secret中
需要在远程主机上安装 rsync 命令,否则会同步失败 (不同 linux 版本均可用包管理器直接安装)
总结
本文中的工作流实现了在本地提交 Hexo 项目源码的时候自动部署至 GitHub Pages 及远程服务器主机的功能. 大大节省了时间.