前言
我之前看到过我很多同学为了部署自己的博客,每次上传新推文都要手动FTP
推包或者通过SFTP/SCP/SSH
等远程登录自己的VPS
或Server
进行操作,这种方式其实太多繁琐,而且太过于依赖人工操作,很可能导致出现各种各样的奇葩问题,如果有办法能让我们不用在运维上犯愁,每次推送新推文就会自动部署到我们的博客上,岂不美哉。
所以最近一直在纠结,有没有可能我直接把写好的Markdown
文件推送到GitHub repository
,根据我每次的push
可以自动编译hugo
并自动推动到我们的GitHub Pages
,这样我又可以省下大量的时间学习新的技术。
自动化工作流
如果要实现代码提交的自动化工作流,就要依靠持续集成(或者加上持续交付)服务。现在已经有相当规模的主流公用免费的持续集成服务,比如说Travis CI
、Jerkins
、Circle CI
、Azure Pipeline
、GitHub Action
等。
其实我之前有参考过很多前辈大佬们的博客,很多都是推荐Travis CI
来作为Hugo
的自动部署服务供应,那么今天我们来点不一样的,说说GitHub
自家出品的GitHub Action
。
由于我目前一直使用GitHub Action
来编译OPENWRT
固件,而且本博客就是在白嫖GitHub
,所以你懂的。
GitHub Action
Github Actions 是 GitHub 推出的持续集成 (Continuous integration,简称 CI) 服务,它提供了配置非常不错的虚拟服务器环境,基于它可以进行构建、测试、打包、部署项目。简单来讲就是将软件开发中的一些流程交给云服务器自动化处理,比方说开发者把代码 push 到 GitHub 后它会自动测试、编译、发布。有了持续集成服务开发者就可以专心于写代码,其它乱七八糟的事情就不用管了,这样可以大大提高开发效率。它使用起来非常方便,只要在你的repository
根目录下建立.github/workflows
文件夹,将你的工作流配置文件放进该目录,配置好相关配置,就能启用GitHub Action
的服务。
更多其他工作流配置请进入官方文档进行了解。
编辑workflows文件
首先我们需要先分成两个项目,原来的[Your Username].github.io
的代码库作为自动部署的代码库,而原来的未编译的Hugo
网站文件夹需要上传到GitHub
上作为源代码的存储库和编译库,此处记得把自己博客的源代码文件夹上传到GitHub
。
而且还要注意一点,如果已经有生成public
文件夹的,需要在.gitignore
中将其注释掉,还有在.gitmodules
中添加自己选择的主题。
之后我们打开源代码库的Action
,选择Skip this and set up a workflow yourself
。
进入后,我们可以不着急编写自己的yml
文件,在右侧的Marketplace
里,Hugo
官方为我们提供相应的自动化脚本。
- GitHub Action Hugo setup:此脚本用于自动安装
Hugo
,具体使用方法可见官方文档。 - GitHub Action GitHub Pages action:此脚本用于将生成的
Hugo
静态网站文件夹上传到你的GitHub Pages
代码库中,具体使用方法可见官方文档。
下面以本博客所用的workflows
文件为例:
name: Licolnlee`s Blog #自动化的名称
on:
push: # push的时候触发工作流
branches: #触发的分支
- master
jobs: #开始工作流
build:
runs-on: ubuntu-latest #使用Ubuntu镜像
steps:
- name: Checkout #步骤名称
uses: actions/checkout@master #使用的软件名称和对应版本
with: #软件内指定的参数
submodules: true
- name: Setup Hugo #安装Hugo
uses: peaceiris/actions-hugo@v2.4.11
with:
hugo-version: 'latest'
extended: true
- name: Build
run: hugo --minify #运行Hugo以生成静态网站文件
- name: Deploy
uses: peaceiris/actions-gh-pages@v3.6.1
with:
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} #自动部署所需要的SSL KEY
external_repository: licolnlee/licolnlee.github.io #部署到指定`repository`
publish_branch: master #部署指定`repository`的分支
publish_dir: ./public #需要部署的文件夹
cname: licolnlee.icu #部署之后希望重定向的域名
生成SSH KEY
这时我们需要给我们的源代码库和网站托管库建立一座桥梁,通过如下代码生成的SSH KEY来实现两个库的连结:
ssh-keygen -t rsa -b 4096 -C "$(git config user.email)" -f gh-pages -N ""
这时你会得到两个文件,一个是私钥:gh-pages
,一个是公钥:gh-pages.pub
。
那么现在假设源代码库为blog
,部署库为XXX.github.io
。
- 打开
blog
库中的Settings
,选择Secrets
,将刚刚生成的私钥文件gh-pages
中的内容添加进去,name
赋值为ACTIONS_DEPLOY_KEY
。
- 同理,打开
XXX.github.io
中的Settings
,点击Deploy Keys
,将刚刚生成的公钥文件gh-pages.pub
中的内容添加进去,勾选Allow write access
。
总结
至此,自动化部署就已经可以自动完成了,只要你提交代码,push
成功后GitHub Action
就会自动帮你部署。