Skip to content

GitHub Actions

引言

GitHub Actions是github推出的持续集成服务,它比 Travis CI更加强大方便;在 GitHub Actions 的仓库中自动化、自定义和执行软件开发工作流程。您可以发现、创建和共享操作以执行您喜欢的任何作业(包括 CI/CD,并将操作合并到完全自定义的工作流程中。本文将通过一个hexo博客自动发布的例子来了解GitHub Actions。

GitHub Actions 基础入门

众所周知,自动化集成包括很多动作,如代码拉取,环境安装,数据库安装配置,打包,代码测试等等,这些操作就被定义为action。很多操作在不同项目中都是一样的,比如从github拉取代码,node环境安装等等,所以这些操作是可以共享的,这一点GitHub Actions设计者也想到了,所以我们是可以将一些公共的操作单独写发布在github仓库中供别人使用的。github官方也提供了一个action市场,在我们写我们自己的集成流程时,可以通过userName/repoName引用他人写好的actions来简化我们的action编写。

image-20211015153039085

名词解释

  • workflow(工作流程):一次集成的过程称为一个工作流程。
  • jos(任务):一个workflow由多个job组成。
  • step(步骤):一个job包含多个步骤。
  • action(动作):每个 step 可以依次执行一个或多个命令(action)。

配置文件介绍

GitHub Actions 的配置文件叫做 workflow 文件,存放在代码仓库的.github/workflows目录,是一个 YAML 格式文件,一个workflow 文件由以上四个部分组成。

yaml
# name:工作流名称,不填 GitHub 将其设置为相对于仓库根目录的工作流程文件路径
name: hexo-ci 

# on:触发流程的事件;必填
## 写法1:使用单一事件
on:push
## 写法2:使用事件列表
on: [push, pull_request]
## 写法3:使用具有活动类型或配置的多个事件
on
  push:
    branches: [master]
    
# jobs:任务
jobs:
  # job id
  job1:
  	......
  job2:
  	# job id
  	name: bulid-name
  	# 识别在此作业运行之前必须成功完成的任何作业
  	needs:[job1]
  	# 必填。 要运行作业的机器类型
    runs-on: ubuntu-latest
    # 步骤
    steps:
      # 引用他人的actions
      - uses: actions/checkout@v2
      # 步骤名称
      - name: Use Node.js ${{ matrix.node_version }}
        uses: actions/setup-node@v1
        # 有些引用的action需要外部提供的一些参数;通过with传递
        with:
          version: ${{ matrix.node_version }}
      - name: Setup hexo
      	 # step环境变量
        env:
          ACTION_DEPLOY_KEY: ${{ secrets.HEXO_DEPLOY_PRI }}
        # 执行一些具体的命令(action)
        run: |
          mkdir -p ~/.ssh/
          echo "$ACTION_DEPLOY_KEY" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          ssh-keyscan github.com >> ~/.ssh/known_hosts
          git config --global user.email "youremail@.com"
          git config --global user.name "your name"
          npm install hexo-cli -g
          npm install
      - name: Hexo deploy
        run: |
          hexo clean
          hexo d

上面只是列举了一些常用的字段,GitHub Action 的配置字段非常多,可以通过官方中文文档查阅

下面是一个自动部署hexo的例子

案例基本需求

有两个仓库git仓库A、B,A存放的是hexo博客的资源文件,即markdown文件,B仓库则是 github page 仓库,存放的是hexo编译之后的文件;通常情况下我们每次写完博客需要进行编译,然后把编译好的文件push到B仓库,同时把资源文件push到A仓库。这样显得比较繁琐,现在我们利用GitHub Actions实现在每次push资源文件到A仓库时,github自动编译资源文件,并且将编译好的文件发布到B仓库。

创建两个仓库

  • blog:存放资源文件
  • caiwuu.github.io:github page 静态文件仓库

image-20211009000947355

生成公钥私钥

bash
cd blog
ssh-keygen -t rsa -b 4096 -C "$(git config user.email)" -f github-deploy-key -N ""

此时在当前目录下会生成两个文件github-deploy-key(私钥)和github-deploy-key.pub(公钥)

给caiwuu.github.io仓库添加公钥

image-20211009005049817

给blog仓库添加secrets'变量HEXO_DEPLOY_PUB

这个变量存的就是私钥,这个变量在Github Action 中可以通过变量名获取

image-20211009005450131

创建action脚本文件

GitHub Actions 的配置文件叫做 workflow 文件,存放在代码仓库的.github/workflows目录,是一个以yml为后缀的文件

yml
name: CI
on
  push:
    branches: [master]
  workflow_dispatch:
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node_version }}
        uses: actions/setup-node@v1
        with:
          version: ${{ matrix.node_version }}
      - name: Setup hexo
        env:
          ACTION_DEPLOY_KEY: ${{ secrets.HEXO_DEPLOY_PRI }}
        run: |
          mkdir -p ~/.ssh/
          echo "$ACTION_DEPLOY_KEY" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          ssh-keyscan github.com >> ~/.ssh/known_hosts
          git config --global user.email "youremail@.com"
          git config --global user.name "your name"
          npm install hexo-cli -g
          npm install
      - name: Hexo deploy
        run: |
          hexo clean
          hexo d

Hexo deploy 配置

yml
deploy:
  type: 'git'
  repository: git@github.com:caiwuu/caiwuu.github.io.git # 这里一定要用ssh地址
  branch: master

验证

尝试修改一点博客的内容,然后提交,查看CI集成是否成功

image-20211009010711752

action执行成功后可以看到编译的静态文件已经成功部署到了github page仓库,代开github page地址博客已经更新

image-20211009010941631