个人比较喜欢使用Github Actions来发布博客,因为Github Actions可以自动提交到Github,而且可以自动使用SSH发布到服务器。 并且有一定的时间的免费服务,不拿来做点什么,有点看着可惜了。

在服务器中增加名为 github 的用户名

注意设置只能使用 SSH 证书的方式登录。防止有暴力破解的风险。

1
2
# 在 /etc/ssh/sshd_config 修改如下配置
PasswordAuthentication no
1
2
3
4
5
6
7
# 添加用户,都可以选择默认设置
$ sudo adduser github
# 生成密钥
$ ssh-keygen -t rsa -b 4096 -C "github"
# 将密钥添加到当前服务器github用户的 home/github/.ssh/authorized_keys 文件中
# 注意权限为 rw-------
$ cat ~/.ssh/id_rsa.pub

在github中新建一个名为 blog 的仓库

注意,这里的 blog 仓库是指的是 github 上的仓库,而不是服务器上的仓库。

这里可以参照官方文档:创建仓库。 就不详细赘述。

将密钥添加到 Github 的 SSH 密钥库中

在 Github 中,点击仓库的 Settings (不是个人设置) -> Secrets -> Actions,点击 New repository secret, 将 name 命名为 PRIVATE_SSH_KEY 。以及 KNOWN_HOSTS 的内容,值为你部署的服务器的域名或者 IP 地址。

Actions 配置

点击仓库的 Actions -> New workflow, 将 name 命名为 “cicd-website”,最后会在该仓库中生成 .github/workflows/cicd-website.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
name: Website

on:
  workflow_dispatch:
  push:
#     paths:
#       - "website/**"
    branches:
      - master
jobs:
  build:
    name: Build and Deploy
    runs-on: ubuntu-latest
    steps:
      - name: 🛒 Checkout
        uses: actions/checkout@v2

      - name: ✨ Setup Hugo
        env:
          HUGO_VERSION: 0.100.2
        run: |
          mkdir ~/hugo
          cd ~/hugo
          curl -L "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_Linux-64bit.tar.gz" --output hugo.tar.gz
          tar -xvzf hugo.tar.gz
          sudo mv hugo /usr/local/bin          
      - name: 🛠️ Build
        # run: hugo --source website --minify
        run: hugo -D

      - name: 🔑 Install SSH Key
        run: |
          install -m 600 -D /dev/null ~/.ssh/id_rsa
          echo "${{ secrets.PRIVATE_SSH_KEY }}" > ~/.ssh/id_rsa          

      - name: Adding Known Hosts
        run: ssh-keyscan -H ${{ secrets.KNOWN_HOSTS }} >> ~/.ssh/known_hosts

      - name: 🚀 Deploy
        # run: rsync --archive --delete --stats -e 'ssh -p 22' 'website/public/' ${{ secrets.REMOTE_DEST }}
        run: rsync --archive --delete --stats -e 'ssh -p 22' 'public/' github@alpnut.com:~/blog/

这里的配置参照配置 ( Citation: , (s.d.). Retrieved from https://swharden.com/blog/2022-03-20-github-actions-hugo/ ) ,但是在添加 known_hosts 时一直都部署不通过的问题,所以中间改进增加了 Adding Known Hosts 这一步。

参考链接:

Scott W Harden (n.d.)
(s.d.). Retrieved from https://swharden.com/blog/2022-03-20-github-actions-hugo/