hugo利用Github Action自动构建博客

1. 初始化 GitHub 仓库

Github上新建一个名为iwyang.github.io的仓库。

2. 配置ACTIONS_DEPLOY_KEY

2.1. 生成公钥

Windows 上安装 Git for Windows 之后在开始菜单里打开 Git Bash 输入:

1
2
git config --global user.name "你的用户名"
git config --global user.email "你的电子邮箱"
1
2
3
4
cd ~
mkdir .ssh
cd .ssh
ssh-keygen -t rsa

在系统当前用户文件夹下生成了私钥 id_rsa 和公钥 id_rsa.pub

2.2. 上传id_rsa.pub

点击博客仓库的Settings->Deploy keys->add deploy key,Title填写ACTIONS_DEPLOY_KEY,Key填写id_rsa.pub文件的内容。

2.3. 上传id_rsa

点击博客仓库的Settings->Secrets->Add a new secret,Name填写ACTIONS_DEPLOY_KEY,Value填写id_rsa文件的内容。

3. 配置 Github actions

在博客根目录新建.github/workflows/gh_pages.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
name: GitHub Page Deploy

on:
push:
branches:
- develop
jobs:
build-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout master
uses: actions/checkout@v1
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: 'latest'
extended: true

- name: Build Hugo
run: |
hugo

- name: Deploy Hugo to gh-pages
uses: peaceiris/actions-gh-pages@v2
env:
ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
PUBLISH_BRANCH: master
PUBLISH_DIR: ./public

如果使用的是loveit主题并且使用algolia搜索,则还要配置自动更新索引,需在gh_pages.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
name: GitHub Page Deploy

on:
push:
branches:
- develop
jobs:
build-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout master
uses: actions/checkout@v1
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: 'latest'
extended: true

- name: Build Hugo
run: |
hugo && npm install atomic-algolia --save && npm run algolia

- name: Deploy Hugo to gh-pages
uses: peaceiris/actions-gh-pages@v2
env:
ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
PUBLISH_BRANCH: master
PUBLISH_DIR: ./public

4. 推送到远端

4.1. 修改主题文件夹

将主题文件夹里的.gitgitignore.github等文件夹都删除。

4.2. 修改根目录.gitignore文件

1
/public

4.3. 提交源码

初始化git,新建并切换到develop分支,将源码提交到develop分支。稍等片刻,github action会自动部署blog到master分支。

1
2
3
4
5
6
git init
git checkout -b develop
git remote add origin git@github.com:iwyang/iwyang.github.io.git
git add .
git commit -m "备份源码"
git push --force origin develop

5. 服务器操作

5.1. 克隆仓库

1
2
rm -rf /var/www/hexo
git clone git@github.com:iwyang/iwyang.github.io.git /var/www/hexo

5.2. 设置crontab定时任务:

1
2
crontab -e
*/5 * * * * git -C /var/www/hexo pull

这样只要提交源码给github,github action就会帮你部署博客到github page,服务器通过git pull定时拉取更新。换台电脑不用再搭建环境,直接在gtihub新建或者修改文章,剩下的工作就交给github action。注意回本地电脑先git pull拉取更新,再提交源码,最终部署脚本如下:

1
2
3
4
5
6
7
#!/bin/bash
echo -e "\033[0;32mDeploying updates to gitee...\033[0m"
git pull
git config --global core.autocrlf false
git add .
git commit -m "site backup"
git push origin develop --force

注意:好像先要从源码仓库clone一份源码到本地,才能利用git pull拉取github已有的更新。只有先拉取github已有的更新,再在本地提交源码,github上的更新才不会被删除

6. 总结

整个部署过程可能比本地部署还要花时间,不过这种方法方便异地更新部署。对我来说目前还是本地部署吧。


7. 使用 GitHub Actions 实现文件自动化部署

下面记下使用 GitHub Actions 实现文件自动化部署。(未测试)

7.1. 准备工作

安装rsync

1
yum install rsync -y

7.2. 建立SSH密钥对

为了方便,在服务器上生成SSH密钥对:

1
2
mkdir -p ~/.ssh && cd ~/.ssh
ssh-keygen -t rsa -f mysite

这里一路回车就行,执行完成后,会在~/.ssh下生成两个文件:mysite(私钥)和mysite.pub(公钥)。其中私钥是你的个人登录凭证,不可以分享给他人,如果别人得到了你的私钥,就能登录到你的服务器。公钥则需要放到登录的目标服务器上。

7.3. 把 public key 加入到 authorized_keys 里面

将公钥mysite.pub的内容贴到目标服务器的~/.ssh/authorized_keys中,如果上一步你直接是在服务器中执行,则只要:

1
cat mysite.pub >> authorized_keys

否则,手动复制公钥的内容,粘贴到~/.ssh/authorized_keys后面即可,若文件或目录不存在,可以自己创建。这一步的目的,是告诉目标服务器:「我以后用这个私钥登录,你需要允许哈」。

7.4. 修改 ssh folder 权限

确保服务器~/.ssh文件夹的权限低于711,我这里直接用600(仅本用户可读写)

1
chmod 600 -R ~/.ssh

7.5. 设置 ssh 配置文件,打开密钥登录功能

1
vi /etc/ssh/sshd_config
1
2
3
+ PermitRootLogin yes
- #PubkeyAuthentication yes
+ PubkeyAuthentication yes

7.6. 重启 ssh 服务

1
service sshd restart

7.7. 复制 private key 到 GitHub

private key 复制到 GitHub repo -> setttings -> secrets里,并且命名为DEPLOY_KEY。顺便在secrets里设置一下SSH_HOSTSSH_USERNAME

1
2
SSH_HOST:服务器IP
SSH_USERNAME:root

7.8. 编写工作流文件

repo 的根目录创建 .github/workflows/develop.yml 文件,以后每次 master branch 有新的 commit,这个 action 就会执行。

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
name: Deploy Site

on:
push:
branches:
- master # only run this workflow when there's a new commit pushed to the master branch

jobs:
deploy: # job_id
runs-on: ubuntu-latest # environment: use ubuntu

steps: # automated steps
- name: Checkout Repo # 1. checkout repo
uses: actions/checkout@v2 # Use a third party action (https://github.com/actions/checkout)

- name: Deploy to Server # 2. deploy to remote server
uses: AEnterprise/rsync-deploy@v1.0 # Use a third party action (https://github.com/AEnterprise/rsync-deploy)
env:
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} # use pre-configured secret (the private key)
ARGS: -avz --delete # must have this variable
SERVER_PORT: "22" # SSH port
FOLDER: ./ # folder to push (./ is the root of current repo)
SERVER_IP: ${{ secrets.SSH_HOST }} # use pre-configured ssh_host value (e.g., IP or domain.com)
USERNAME: ${{ secrets.SSH_USERNAME }} # use pre-configured ssh_username value
SERVER_DESTINATION: /var/www/xxx/ # put your repo files on this directory of the remote server

另外一个例子:

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
name: Deploy site files

on:
push:
branches:
- master # 只在master上push触发部署
paths-ignore: # 下列文件的变更不触发部署,可以自行添加
- README.md
- LICENSE

jobs:
deploy:

runs-on: ubuntu-latest # 使用ubuntu系统镜像运行自动化脚本

steps: # 自动化步骤
- uses: actions/checkout@v2 # 第一步,下载代码仓库

- name: Deploy to Server # 第二步,rsync推文件
uses: AEnterprise/rsync-deploy@v1.0 # 使用别人包装好的步骤镜像
env:
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} # 引用配置,SSH私钥
ARGS: -avz --delete --exclude='*.pyc' # rsync参数,排除.pyc文件
SERVER_PORT: '22' # SSH端口
FOLDER: ./ # 要推送的文件夹,路径相对于代码仓库的根目录
SERVER_IP: ${{ secrets.SSH_HOST }} # 引用配置,服务器的host名(IP或者域名domain.com)
USERNAME: ${{ secrets.SSH_USERNAME }} # 引用配置,服务器登录名
SERVER_DESTINATION: /home/fming/mysite/ # 部署到目标文件夹
- name: Restart server # 第三步,重启服务
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }} # 下面三个配置与上一步类似
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.DEPLOY_KEY }}
# 重启的脚本,根据自身情况做相应改动,一般要做的是migrate数据库以及重启服务器
script: |
cd /home/fming/mysite/
python manage.py migrate
supervisorctl restart web
有了GitHub Actions这个利器,除了自动部署,还可以做自动备份……只要你想,你甚至能提交代码自动触发房间开灯。当然,这些都必须围绕一个GitHub代码仓库来做。推荐大家把自己用到的代码都放到Git上管理,一是可以备份方便重建,二是可以利用这些周边的生态,来让你的生活更简单。不要再用百度网盘存代码、用FTP客户端传文件了。

8. 参考链接