本博客之前是 通过 Travis CI 来自动构建 的,而 Actions 是 GitHub 自家的 CI 服务,提供的构建环境更好,配置更容易,也和 GitHub 其他服务比如 Pages 结合的更紧密,从结果来看,体验还是非常不错的,下面是俺的配置过程,供参考。
和上次配置 Travis CI 的准备过程类似,为了省事,俺直接粘贴过来 :)
为了使 Travis CI 有权限接触 Github 仓库,需要生成一个 Personal Access Token,在这个地址可以新建一个:https://github.com/settings/tokens/new/ ,名字随便填一个,勾选上 repo
内所有项目,其他项目均取消勾选,最后点底下的 Generate token
生成 Token。
记下 Token 的值,建议找个空白文档先粘贴保存一下。这个值只会在生成时显示一次,离开此页面后就无法再次查看了,要是忘了就只能重新生成一个。
前往博客源码所在的仓库,点击右上角的 Settings
进入设置,点击左侧列表中的 Secrets
,然后点击右上角的 New repository secret
添加一个新的仓库密钥,Name
填写为 PERSONAL_TOKEN
(下面要用到,如果这里填写为其他值,那么下面的配置文件中相应的参数需要修改),Value
粘贴上一步保存的 Token 值,然后点击 Add sevret
保存。
GitHub Actions 的配置文件叫做 workflow 文件(官方中文翻译为“工作流程文件”),存放在代码仓库的 .github/workflows
目录中,和 Travis CI 的配置文件一样采用 YAML 格式,文件名任意,后缀名统一为 .yml
,只要 .github/workflows
目录里面有 .yml
文件,GitHub 就会按照文件中所指定的触发条件在符合条件时自动运行该文件中的工作流程。
那么先新建一个配置文件,路径为 .github/workflows/build.yml
,此处俺使用的文件名是 build.yml
,这个文件用来定义 GitHub Actions 自动构建时将如何操作。
然后将之前配置好的 .travis.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
48
49
50
| name: Github-Pages
# 在 master 分支更新时触发构建
on:
push:
branches:
- master
jobs:
deploy:
runs-on: ubuntu-22.04
env:
TZ: Asia/Shanghai
SOURCE_REPO: "he-sb/tech" # 博客源码仓库
TARGET_REPO: "he-sb/tech" # 博客部署仓库
TARGET_BRANCH: "gh-pages" # 博客部署的分支名
SECRET: ${{ secrets.PERSONAL_TOKEN }}
steps:
# 配置 git,避免一些莫名其妙的错误
- name: Git Configuration
run: |
git config --global core.quotePath false
git config --global core.autocrlf false
git config --global core.safecrlf true
git config --global core.ignorecase false
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
# 拉取源码
- name: Clone Repository
run:
git clone --branch=master --quiet https://github.com/$SOURCE_REPO site
# 安装 hugo (v0.79.0)
- name: Setup Hugo
run:
wget -q -O hugo.deb https://github.com/gohugoio/hugo/releases/download/v0.79.0/hugo_extended_0.79.0_Linux-64bit.deb && sudo dpkg -i hugo.deb && hugo version
# 构建网站
- name: Build
run:
cd site && hugo --gc --minify --cleanDestinationDir
# 部署至 GitHub Pages
- name: Deploy
run: |
cd site/public && git init
git add .
git commit -m "Update Blog By GitHub Actions With Build ${GITHUB_RUN_NUMBER}"
git push --force --quiet "https://[email protected]/$TARGET_REPO" master:$TARGET_BRANCH
|
几点说明:
- 如果上一步【添加 Repo Secrets】时,新建的 secret 的
Name
不是 PERSONAL_TOKEN
的话,需要把 ${{ secrets.PERSONAL_TOKEN }}
中的 PERSONAL_TOKEN
替换为你设置的 Name
; - 【拉取源码】这一步的命令是从源码所在仓库的
master
分支拉取的,如果你的情况比较特殊,那么需要修改下命令中的 --branch
参数; - 其他必须修改的参数对照注释很容易就能看懂,就不多解释了;
- 修改完成之后,只要把这个配置文件 push 上去就可以自动构建了。
本博客之前使用 Travis CI 时有个历史遗留问题,就是每次自动构建完毕后,所有文章的修改时间都会变成【执行自动构建】的时间(详见 这篇文章 的【尾声】部分),而这个问题在刚转到 GitHub Actions 时依然存在。
经过仔细对比 Actions 和 Travis CI 的构建日志,俺终于确认了问题是 git checkout
操作引起的(详情见 这个 Issues 中的相关讨论),但还不确定这是 hugo 的问题还是 MemE 主题的问题。
俺的解决办法是手写 Actions 配置文件,而不是像很多教程中提到的通过组合已有的 actions 来实现,虽然看起来逼格不够,但确实解决了问题,而且也比较方便复用。
参考链接:
GitHub Actions 入门教程 - P3TERX ZONE
使用 Github Actions 來自動化部署 Hugo 到 Github Pages | Puck's Blog
Environment variables - GitHub Docs
Authentication in a workflow - GitHub Docs
Encrypted secrets - GitHub Docs - #Using encrypted secrets in a workflow
Context and expression syntax for GitHub Actions - GitHub Docs - #github context
Adding a workflow status badge - GitHub Docs