Contents

使用Github Action进行自动部署

最近接触了“持续集成”的概念,就是代码提交之后的自动化测试、打包、部署等工作,github actions就是一个持续集成的工具,给代码托管在github上的开源项目带来了便利。我的需求是依据多个markdown文档生成pdf文件,为了排版需要使用sphinx、pandoc以及LATEX环境,部署环境比较复杂,因此尝试使用github actions。

1. 查找可用的actions

很多常用的actions都被发布到官方的市场中了,另外,awesome-actions仓库也搜集了一些常用的actions。因为我的需求是比较特异的,不具普遍性,也比较简单,因此没有必要写一个新的actions,直接在别人的action基础上进行配置就好。

2. 写workflow 文件

2.2 设置触发器

workflow的触发事件,有两种方式:

1.用户的事件
每个push事件运行

1
2
name: descriptive-workflow-name
on: push

2.定时事件

最短的执行间隔为5分钟,以下为每小时执行一次

1
2
3
on:
  schedule:
    - cron: '0 * * * *'

详细的官方文档可参见Events that trigger workflows

本次项目为了避免重复构建,设置的触发事件为指定分支、指定目录文件的push

1
2
3
4
5
6
on:
  push:
    branches:
      - master
    paths:
      - 'document/content/*'

2.2 选择 runner

2.2.1 指定单个runner

对于每一个job,需要制定运行的runner,可以选择github托管的runner或者自建的runner,github托管的runner有一下几种选择

虚拟环境 workflow标签
Windows Server 2019 windows-latest or windows-2019
Ubuntu 20.04 ubuntu-20.04
Ubuntu 18.04 ubuntu-latest or ubuntu-18.04
Ubuntu 16.04 ubuntu-16.04
macOS Catalina 10.15 macos-latest or macos-10.15

这里选择比较常见的ubuntu-latest

2.2.2 配置构建矩阵

有时候测试、编译等过程需要在不同的环境下进行,因此需要指定一个构建矩阵,具体实例如下:

1
2
3
4
5
runs-on: ${{ matrix.os }}
strategy:
  matrix:
    os: [ubuntu-16.04, ubuntu-18.04]
    node: [6, 8, 10]

2.3 使用checkout action

checkout action是比较常用的标准action之一,job使用仓库代码的副本的时候需要这个action

1
- uses: actions/checkout@v2

2.4 引用操作

语法为{owner}/{repo}@{ref}{owner}/{repo}/{path}@{ref}

3.总体项目

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
name: build docs PDF
on:
  push:
    branches:
    - master
    paths:
    - 'document/content/**'
jobs:
  build:
    # 安装依赖
    name: publish PDF
    # This job runs on Linux
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: '3.7'
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
        sudo apt-get update -y 
        sudo apt-get install -y latexmk texlive-latex-recommended texlive-latex-extra texlive-fonts-recommended
        sudo apt-get install texlive-xetex latex-cjk-all
        sudo apt-get install pandoc
        wget https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SourceHanSansSC.zip
        wget https://github.com/adobe-fonts/source-han-serif/raw/release/OTF/SourceHanSerifSC_SB-H.zip
        wget https://github.com/adobe-fonts/source-han-serif/raw/release/OTF/SourceHanSerifSC_EL-M.zip
        unzip SourceHanSansSC.zip
        unzip SourceHanSerifSC_EL-M.zip
        unzip SourceHanSerifSC_SB-H.zip
        sudo mv SourceHanSansSC SourceHanSerifSC_EL-M SourceHanSerifSC_SB-H /usr/share/fonts/opentype/
        wget -O source-serif-pro.zip https://www.fontsquirrel.com/fonts/download/source-serif-pro
        unzip source-serif-pro -d source-serif-pro
        sudo mv source-serif-pro /usr/share/fonts/opentype/
        wget -O source-sans-pro.zip https://www.fontsquirrel.com/fonts/download/source-sans-pro
        unzip source-sans-pro -d source-sans-pro
        sudo mv source-sans-pro /usr/share/fonts/opentype/
        wget -O source-code-pro.zip https://www.fontsquirrel.com/fonts/download/source-code-pro
        unzip source-code-pro -d source-code-pro
        sudo mv source-code-pro /usr/share/fonts/opentype/
        sudo fc-cache -f -v        
    - name: generate PDF
      run: |
        bash generatePDF.sh
        bash generatePDF.sh en        
    - name: commit PDF
      run: |
        git config user.name github-actions
        git config user.email [email protected]
        git add *.pdf -f
        git commit -m "Add changes"
        git push -u origin master        

参考

  1. GitHub Actions Documentation https://docs.github.com/en/actions
  2. GitHub Actions 入门教程 http://www.ruanyifeng.com/blog/2019/09/getting-started-with-github-actions.html
  3. Github Marketplace https://github.com/marketplace?type=actions
  4. awesome-actions https://github.com/sdras/awesome-actions