前言

我之前看到过我很多同学为了部署自己的博客,每次上传新推文都要手动FTP推包或者通过SFTP/SCP/SSH等远程登录自己的VPSServer进行操作,这种方式其实太多繁琐,而且太过于依赖人工操作,很可能导致出现各种各样的奇葩问题,如果有办法能让我们不用在运维上犯愁,每次推送新推文就会自动部署到我们的博客上,岂不美哉。

所以最近一直在纠结,有没有可能我直接把写好的Markdown文件推送到GitHub repository,根据我每次的push可以自动编译hugo并自动推动到我们的GitHub Pages,这样我又可以省下大量的时间学习新的技术

自动化工作流

如果要实现代码提交的自动化工作流,就要依靠持续集成(或者加上持续交付)服务。现在已经有相当规模的主流公用免费的持续集成服务,比如说Travis CIJerkinsCircle CIAzure PipelineGitHub Action等。

其实我之前有参考过很多前辈大佬们的博客,很多都是推荐Travis CI来作为Hugo的自动部署服务供应,那么今天我们来点不一样的,说说GitHub自家出品的GitHub Action。 由于我目前一直使用GitHub Action来编译OPENWRT固件,而且本博客就是在白嫖GitHub,所以你懂的

GitHub Action

action.png Github Ac­tions 是 GitHub 推出的持续集成 (Con­tin­u­ous in­te­gra­tion,简称 CI) 服务,它提供了配置非常不错的虚拟服务器环境,基于它可以进行构建、测试、打包、部署项目。简单来讲就是将软件开发中的一些流程交给云服务器自动化处理,比方说开发者把代码 push 到 GitHub 后它会自动测试、编译、发布。有了持续集成服务开发者就可以专心于写代码,其它乱七八糟的事情就不用管了,这样可以大大提高开发效率。它使用起来非常方便,只要在你的repository根目录下建立.github/workflows文件夹,将你的工作流配置文件放进该目录,配置好相关配置,就能启用GitHub Action的服务。 更多其他工作流配置请进入官方文档进行了解。

编辑workflows文件

首先我们需要先分成两个项目,原来的[Your Username].github.io的代码库作为自动部署的代码库,而原来的未编译的Hugo网站文件夹需要上传到GitHub上作为源代码的存储库和编译库,此处记得把自己博客的源代码文件夹上传到GitHubyml-edit.png 而且还要注意一点,如果已经有生成public文件夹的,需要在.gitignore中将其注释掉,还有在.gitmodules中添加自己选择的主题。 之后我们打开源代码库的Action,选择Skip this and set up a workflow yourself。 进入后,我们可以不着急编写自己的yml文件,在右侧的Marketplace里,Hugo官方为我们提供相应的自动化脚本。

下面以本博客所用的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

  1. 打开blog库中的Settings,选择Secrets,将刚刚生成的私钥文件gh-pages中的内容添加进去,name赋值为ACTIONS_DEPLOY_KEY

secret.png

  1. 同理,打开XXX.github.io中的Settings,点击Deploy Keys,将刚刚生成的公钥文件gh-pages.pub中的内容添加进去,勾选Allow write access

deploy.png

总结

至此,自动化部署就已经可以自动完成了,只要你提交代码,push成功后GitHub Action就会自动帮你部署。

相关文章


·END·