GitHub Actions Workflows 部署 Hexo

Github Action

是Github 提供的免费可持续集成服务,在 GitHub Actions 的仓库中自动化、自定义和执行软件开发工作流程。 可以发现、创建和共享操作以执行任何作业(包括 CI/CD),并将操作合并到完全自定义的工作流程中。

GitHub Actions 简单易用,在仓库根目录下建立.github/workflows文件夹,把workflows工作流文件(YAML)放到这个目录下,就可以使用Github Action服务了

workflows 文件

由多个job组合而成,其指定了持续集成要完成的工作,每个工作流文件代表着一个持续集成工程

  • 每个workflow由多个job组成,每个job就是你指定的任务
  • 每个job由多个step组成,每个step代表任务的具体步骤
  • 每个step由多个action组成,代表具体要执行的指令,actoinworkflows中的最小单位

GitHub Actions Workflows

Action

GitHub提供了大量方便的工具,使你可以轻松的完成各种任务。比如克隆仓库并检出,向仓库提交内容,安装各种语言环境,同步文件等等,都有对应的工具,它们就是 Action,只需要调用它们就可以了,几乎不用写任何命令,你需要的在Action市场几乎全部可以找到。如 actions/checkout是用来checout仓库的,actions表示这个工具是官方的,如果是其它名称,则表示是第三方提供的

Hexo 发布到 Github Pages 及 Ailyun

没有使用 GitHub Actions 的发布流程

  1. push
  2. 生成静态页:Hexo或hugo,Jekyll等静态博客生成器
  3. push静态页,在 github pages上完成发布
  4. 登录远程服务器,拉取静态页,在自己的站点完成发布

使用 GitHub Actions 的发布流程

  1. push

后面的工作完全自动化完成

  • 你不需要在你的本机上安装Hexo等静态站点生成器运行环境
  • 文章的Build的工作在GitHub 的 work runner中完成,不需要占用的你电脑的资源
  • 在GitHub 上构建速度快,软硬件兼容性问题也少
  • 可以随时随地的部署:比如你发布后发现有个错别字要改,那么你用手机登录Github,直接在页面上修改,提交后就会触发部署,甚至都不需要打开电脑,方便快捷。

建立SSH密钥对

博客涉及到三个仓库:

  • Hexo.git,用来存放Hexo项目和文章
  • next.git博客主题
  • gagahappy.github.io 用来存放发布的HTML页,设置为 Github Pages

为什么会用到密钥对

  • Aliyun服务器:构建过程中要远程登录到Aliyun服务器,要用密钥进行身份验证,需要用到密钥对

  • Github Pages:Github的建议是把源文件即Hexo.git放到master分支,把gagahappy.github.io放到gh-pages分支。但Github Pages必须是公开仓库才可以发布,这样就让存放源文件的Hexo.git也可以被访问,这显然是不安全的,所以没有把这两个仓库放在一起,那么对gagahappy.github.io进行发布就需要使用密钥对,才能对仓库进行操作。如果你遵循了Github的建议,那这么在发布Github pages时就不用设置密钥对了。

生成密钥对

ssh-keygen -t rsa -b 4096 -C "$(git config user.email)" -f gh-pages -N ""
# You will get 2 files:
#   gh-pages.pub (public key)
#   gh-pages     (private key)

gh-pages.pub中的内容添加到远程服务器的~/.ssh/authorized_keys中或把文件上传到~/.ssh/目录,执行

cat gh-pages.pub >> authorized_keys
chmod 600 -R ~/.ssh # 设置~/ssh目录权限

设置 github Secrets

Secrets 是用来存放敏感信息的,如数据库的密码,用户名,密钥,等信息,不会让这些信息在日志输出中暴露出来,会以星号(*)代替这些敏感信息。

在Hexo.git仓库的首页点击 settings,在左侧找到Secrets,点击右上New repository secret name填写ACTIONS_DEPLOY_KEYvalue填写密钥gh-pages的内容, 点击Add secret,这样就创建了一个secret。之后可以用这个secret操作 gagahappy.github.io 仓库。

你还可以创建其它的secret,比如MySQL连接的密码,可以新建一个名称为mysql_passwd,内容为MySQL密码的Secret。更多信息可以查看官方 Secrets 帮助

# secret 在日志中使用 * 号输出敏感信息
SOURCE: public/
REMOTE_HOST: ***
REMOTE_USER: ***
TARGET: ***
SSH_PRIVATE_KEY: ***

设置 Deploy keys

打开gagahappy.github.io仓库,在仓库的首页点击 settings,在左侧找到Deploy keys,把gh-pages.pub的内容复制进去,勾选下面的Allow write access,点击Add Key,这样在之后的部署过程中,Hexo.git仓库所在的runner就可以通过secrets.ACTIONS_DEPLOY_KEY对其进行操作了。

编写工作流文件

在Hexo.git项目根目录下建立.github/wrokflows文件夹,在这个文件夹下创建以yml结尾的文件build.yml。每当你push到github后,github会自动寻找仓库根目录下的.github/wrokflows中扩展名为yml的所文件,运行其中的指令,完成自动部署。

mkdir -p .github/workflows
touch .github/workflows/build.yml

需要持续集成完成的工作有

  1. Checkout hexo.git中的内容
  2. Checkout next.git主题内容到 theme目录
  3. 安装 node.js环境
  4. 安装Hexo
  5. 使用Hexo生成静态页面
  6. 发布静态页面到 gagahappy.github.io
  7. 同步静态页到Aliyun服务器

把以上内容翻译为要执行的配置命令就是

on:
  push:
    branches: [master] # 在master分支push时触发部署
    paths-ignore: # 以下文件的变更不触发部署
      - README.md
  workflow_dispatch:

env: # 统一设置环境变量
  GIT_USER: git
  GIT_EMAIL: email@example.com
  THEME_REPO: git/next # 你使用的主题仓库地址
  THEME_BRANCH: master
  DEPLOY_REPO: git/gagahappy.github.io # 你用来发布github pages的仓库地址
  DEPLOY_BRANCH: master

jobs:
  build: # job_id,其它job可以引用,比如两个job有先后顺序
    name: Build Github Page And Deploy On Aliyun # job名称
    runs-on: ubuntu-latest # 构建使用的系统,支持 linux/mac/windows
    timeout-minutes: 5 # job超时时间,超过后job会被停止运行

    steps: # 一个job由多个 step 组成,本博的由7个step组成
    	# 1. Checkout hexo.git 中的内容
      - name: Checkout Hexo repo
      	# 检出项目,如果不指定名称,默认使用运行Github Action 的仓库,即hexo.git
        uses: actions/checkout@v2

    	# 2. Checkout next.git 主题内容到 theme目录
      - name: Checkout Theme repo
      	# actions/checkout 就是Acton工具,实现checkout项目,每个action也是一个git仓库
      	# 可以直接通过 github.com/工具名称进行访问,即github.com/actions/checkout
        uses: actions/checkout@v2
        with:
          repository: ${{ env.THEME_REPO }} # 要checkout的仓库地址
          ref: ${{ env.THEME_BRANCH }}
          path: themes/next # 要checkout到的路径

    	# 3. 安装 node.js 环境
      - name: Use Node.js ${{ matrix.node }}
        uses: actions/setup-node@v2 # 使用actions/setup-node安装nodejs
        with:
          node-version: ${{ matrix.node }}

    	# 4. 安装Heox
      - name: Install Hexo
        run: | # 运行command命令
          npm install -g hexo-cli
          npm install

    	# 5. 使用Hexo生成静态页面
      - name: Generate Blog
        run: |
          hexo generate

    	# 6. 发布静态页面到 gagahappy.github.io
			# 使用 peaceiris/actions-gh-pages 第三方Action工具,发布静态内容到 github pages
			# 重要:
			# 如果你的源码文件与Html文件在两个仓库,请在源码文件仓库设置
			# secrets 的 ACTIONS_DEPLOY_KEY 值为密钥内容,
			# 在html文件仓库即youname.github.io中设置 Deploy keys 的值设置为公钥内容,
			# 在构建过程中会使用密钥对youname.github.io进行操作
      - name: Deploy Github Page
        uses: peaceiris/actions-gh-pages@v3
        with:
          # 在 hexo.git 上设置的私钥
          deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} # ACTIONS_DEPLOY_KEY 不能修改
          external_repository: ${{ env.DEPLOY_REPO }} # Hexo.git 的仓库地址
          publish_branch: ${{ env.DEPLOY_BRANCH }}
          publish_dir: ./public # 使用Hexo/hugo等生成静态页面的目录
          user_name: ${{ env.GIT_USER }}
          user_email: ${{ env.GIT_EMAIL }}

    	# 7. 同步静态页到Aliyun服务器
      - name: Deploy Github Page on Aliyun
        uses: easingthemes/ssh-deploy@main
        env:
            SSH_PRIVATE_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
            ARGS: "-rltgoDzvO --delete"
            SOURCE: "public/" # 使用Hexo/hugo等生成静态页面的目录
            REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
            REMOTE_USER: ${{ secrets.REMOTE_USER }}
            TARGET: ${{ secrets.REMOTE_TARGET }}

可以点击仓库主页上的Actions,查看正在运行的workflows,里面有详细的日志信息

GitHub Actions Workflows

参考链接