GitHub Actions是GitHub推出的持续集成服务。

我们可以把一个Action理解为一小段特定功能的脚本,多个Action能够组成一个Workflow,Workflow由各种GitHub的事件触发。我们可以用GitHub Actions来做软件的持续集成(CI)和持续部署(CD)。

在这篇文章里,我向大家介绍我是如何用GitHub Actions来自动化发布我的Hexo博客的。

Hexo和GitHub Pages

我的个人博客刀十一的DevOps小站是用Hexo生成的。想了解Hexo的朋友可以去Hexo官网

Hexo生成静态文件后,我会把这些文件提交到GitHub Pages的代码仓库。这样就能利用GitHub Pages拥有一个免费的个人博客了。

之前,我一直是在自己电脑上手动完成发布博客的操作,流程如下:

当看到Github Actions的介绍后,我就有了用Github Actions自动发布博客的想法。

用GitHub Actions自动发布博客

我的设计是这样的,所有代码都在Hexo库里。

  • Hexo库里创建两个Github Actions的workflow:Build PagesPublish Pages
  • Build Pagesmaster分支的push事件触发。他的主要功能就是用hexo generate生成静态文件,把这些静态文件打包、创建并上传到一个新的Github Release里。
  • 创建release的操作触发Publish Pages,这个workflow会clone我的Pages库,下载最新的release里的静态文件包,解压到Pages库,commit & push。

整体思路

具体的实现步骤如下:

  1. 创建build.sh脚本。该脚本负责生成静态文件、打包、上传。这个脚本在本地电脑也可以运行。
  2. 创建gh_action_build.sh脚本。该脚本在Github Action里运行。主要是调用build.sh,但是事先要安装一些必要的npm库。
  3. https://github.com/settings/tokens 获取一个Personal access token。因为我们的build.sh里用到了Github CLI工具gh。这个命令需要用到这个token来授权。
  4. 把这个Personal access token,添加到Hexo库的secrets里。
    添加secrets
  5. 创建YAML文件定义Build Pages,这边主要功能就是注入上边的那个token然后调用gh_action_build.sh。完整代码在这里
    1
    2
    3
    4
    5
    - name: Generate pages
    env:
    GITHUB_TOKEN: ${{ secrets.TOKEN }} # 注入token

    run: ${GITHUB_WORKSPACE}/bin/gh_action_build.sh # 调用脚本
  6. 创建publish脚本。该脚本下载最新的release中的静态文件包,解压到Pages库,commit & push。
  7. ssh-keygen创建一对秘钥。因为我们在Hexo库的actions里操作Pages库,所以需要授权actions的git命令来修改Pages库
  8. 把上边生成的公钥加到Pages库的deploy key里,并赋予写权限。
    添加deploy key
  9. 把上边生成的私钥加到Hexo库的secrets里。
  10. 创建YAML文件定义Publish Pages。这个workflow里需要clone两个代码库,然后调用publish脚本。其中Pages库的ssh key需要用上边设置的私钥。完整代码在这里
    1
    2
    3
    4
    5
    - uses: actions/checkout@v2
    with:
    repository: 'yuliji/yuliji.github.io'
    path: 'pages'
    ssh-key: ${{ secrets.PAGE_REPO_SSH_KEY }} # 用有写权限的key操作Pages库

完成

这样,我只需要把最新的文章提交到Hexo库的master分支,新文章就自动发布到Github Pages了。

每次push自动运行