Featured image of post 使用 git action 自动部署 blog

使用 git action 自动部署 blog

自动hugo构建部署到仓库或服务器

将 Hugo 部署为 GitHub Pages 项目,并使用 Github Actions 自动化整个过程。
官方文档其实已经把文件都写完了,但是官方没给出

  1. 密钥配置
  2. hugo项目和静态资源仓库分开部署的情况

这里补充一下上面两点

添加 deploy key

如果你的项目不是分离成两个仓库,而是一个仓库两个分支的。那么不需要 deploy key 。不过我仍然建议分离出私密仓库,如果你的项目中有不想大家看到的草稿或者隐藏网页,或者有曾经发布了但是后来又删除的网页,那么全部公开必然是有泄露风险的。
如果你的整体项目结构是 hugo 项目作为一个仓库设置为私密,静态资源作为另一个仓库(github.io)。那么你需要设置 deploy key

创建 ssh key

进入 hugo 项目的根目录(其实是不是无所谓)
运行下面一行

1
ssh-keygen -t rsa -b 4096 -C "$(git config user.email)" -f gh-pages -N ""

随后仓库根目录中出现了 公钥 和 私钥

1
2
yuki@ubuntu:~$ ls
gh-pages gh-pages.pub

在 静态资源 仓库添加公钥

仓库内:setting -> Deploy keys
把 gh-pages.pub 的内容复制进去

在 hugo 仓库中添加私钥

仓库内:setting -> Secrets and variables -> Actions 把 gh-pages 的内容复制进去
如果你要直接复制下方的文件,这里取名为 ACTIONS_DEPLOY_KEY

配置 action

发布到 静态资源 仓库

在你的 hugo 项目根目录。 创建文件 .github/workflows/deploy.yml

 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
name: GitHub Page

on:
    push:
        branches:
            - master # master 更新触发

jobs:
    deploy:
        runs-on: ubuntu-18.04
        steps:
            - uses: actions/checkout@v2
              with:
                  submodules: true # clone submodules
                  fetch-depth: 0 # 克隆所有历史信息

            - name: Setup Hugo
              uses: peaceiris/actions-hugo@v2
              with:
                  hugo-version: "0.87.0" # Hugo 版本
                  extended: true # hugo插件版 Stack主题 必须启用

            - name: Cache resources # 缓存 resource 文件加快生成速度
              uses: actions/cache@v2
              with:
                  path: resources
                  # 检查照片文件变化
                  key: ${{ runner.os }}-hugocache-${{ hashFiles('content/**/*') }}
                  restore-keys: ${{ runner.os }}-hugocache-

            - name: Build # 生成网页 删除无用 resource 文件 削减空行
              run: hugo --minify --gc

            - name: Deploy # 部署到 GitHub Page
              uses: peaceiris/actions-gh-pages@v3
              with:
                  # 如果在同一个仓库下使用请使用 github_token 并注释 deploy_key
                  # github_token: ${{ secrets.GITHUB_TOKEN }}
                  deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}

                  # 如果在同一个仓库请注释
                  external_repository: # 你的 GitHub page 仓库 example/example.github.io

                  publish_dir: ./public
                  user_name: "github-actions[bot]"
                  user_email: "github-actions[bot]@users.noreply.github.com"
                  full_commit_message: Deploy from ${{ github.repository }}@${{ github.sha }} 🚀

Cache resources 可以删掉,不影响主体功能。
整个 Action 一个包含 4 个步骤

  1. 拉取代码
  2. 准备 hugo 环境
  3. 使用 hugo 编译生成静态文件
  4. 把生成的静态文件发布到 Github Pages

发布到 服务器

仅仅需要修改最后一步 Deploy
(当然,如果两个都要的话,上述文件的结尾再加上这一步即可)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
     - name: Server Deploy
        uses: burnett01/rsync-deployments@5.2
        with:
          switches: -avzr --delete
          path: ./public
          remote_path: /var/www/html/ # 最好先在远程主机创建该目录
          remote_host: ${{ secrets.DEPLOY_HOST }} # 远程主机 IP
          remote_port: ${{ secrets.DEPLOY_PORT }} # ssh 端口,默认为 22
          remote_user: ${{ secrets.DEPLOY_USER }} # ssh user
          remote_key: ${{ secrets.DEPLOY_KEY }} # ssh 私钥

secrets. 等变量需要在仓库中创建,和 在hugo仓库中添加私钥 这一步是一样的。按照自己的信息填写创建即可。
DEPLOY_KEY 是在服务器配置 ssh 密钥,在创建后将公钥加入 authorized_keys 中去。私钥复制到仓库的 secrets 中。
如果没有经验可以参考下面的文章。
如果配置过程无误,仍然下述报错

1
rsync: connection unexpectedly closed

查看下述文件

1
sudo nano /etc/ssh/sshd_config

其中有这么一段

1
2
3
4
5
6
7
8
9
# Authentication:

#LoginGraceTime 2m
PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

#PubkeyAuthentication yes

下面这个可能没有开启,修改为开启的

1
PubkeyAuthentication yes

参考

https://zhixuan2333.github.io/posts/ce103e3b/ https://www.pseudoyu.com/en/2022/05/29/deploy_your_blog_using_hugo_and_github_action/
https://gohugo.io/hosting-and-deployment/hosting-on-github/
https://www.lixueduan.com/posts/blog/01-github-action-deploy-hugo/
https://lunawen.com/cicd/20200628-luna-tech-github-action-blog-autodeployment/

Sow nothing, reap nothing.
Built with Hugo 主题 StackJimmy 设计