持续集成
随着软件工程的发展,目前软件的开发、已经形成了一套比较成熟的流程,「持续集成(Continuous integration,CI)」就是其中一个重要概念。简单来说,「持续集成」就是频繁地将代码提交到主干分支。这样做的目的,就是为了快速发现bug,避免分支与主干差异太大。与「持续集成」相关的概念还有「持续交付」和「持续部署」。这篇文章主要的目的是介绍GitHub的持续集成服务,所以在开始前简单介绍了一下概念。接下来就是「GitHub Actions」的介绍。
GitHub Actions
2018年,GitHub推出了持续集成服务,即GitHub Actions。持续集成由很多操作组成,比如抓取代码、运行测试、登录远程服务器,发布到第三方服务等等,基本上这些操作都是固定的,流程化的,GitHub 允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用,并把这些操作命名为 Actions
。如果你需要某个 action,不必自己写复杂的脚本,直接引用他人写好的 action 即可,整个持续集成过程,就变成了一个 actions 的组合,也就是你的抓取代码、运行测试、登录远程服务器,发布……等等的一些列流程操作步骤。
GitHub 做了一个官方市场,可以搜索到他人提交的 actions
。另外,还有一个 awesome actions 的仓库,也可以找到很多 actions
。
基本概念
GitHub Actions 有一些自己的术语。
- workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
- job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
- step(步骤):每个job 由多个 step 构成,一步步完成。
- action (动作):每个 step 可以依次执行一个或多个命令(action)。
workflow 文件
GitHub Actions 的配置文件叫做 workflow 文件,存放在代码仓库的.github/workflows/
目录。workflow 文件采用 YAML
格式,文件名可以任意取,但是后缀名统一为 .yml
,比如 main.yml
。workflow 文件的配置字段非常多,详见官方文档。下面是一些基本字段。
name
name
字段是 workflow 的名称。如果省略该字段,默认为当前 workflow 的文件名。
name: GitHub Actions Demo
on
单一事件
on
字段指定触发 workflow 的条件,通常是某些事件。下面代码指定,push
事件触发 workflow。
on: push
事件数组
on
字段也可以是事件的数组。下面代码指定,push
事件或pull_request
事件都可以触发 workflow。
on: [push, pull_request]
限定分支或标签
指定触发事件时,可以限定分支或标签,语法格式为on.<push|pull_request>.<tags|branches>
。下面代码指定,只有 master
分支发生 push
事件时,才会触发 workflow。
on:
push:
branches:
- master
完整的事件列表,请查看官方文档。除了代码库事件,GitHub Actions 也支持外部事件触发,或者定时运行。
jobs
workflow 文件的主体是 jobs
字段,表示要执行的一项或多项任务。
jobs.<job_id>.name
jobs
字段里面,需要写出每一项任务的 job_id
,具体名称自定义。job_id
里面的 name
字段是任务的说明。下面代码的 jobs
字段包含两项任务,job_id
分别是 my_first_job
和 my_second_job
。
jobs:
my_first_job:
name: My first job
my_second_job:
name: My second job
jobs.<job_id>.needs
needs
字段指定当前任务的依赖关系,即运行顺序。
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]
上面代码中,job1
必须先于 job2
完成,而 job3
等待 job1
和 job2
的完成才能运行。因此,这个 workflow 的运行顺序依次为:job1
、job2
、job3
。
jobs.<job_id>.runs-on
runs-on
字段指定运行所需要的虚拟机环境。它是必填字段。目前可用的虚拟机如下。
- ubuntu-latest,ubuntu-18.04或ubuntu-16.04
- windows-latest,windows-2019或windows-2016
- macOS-latest或macOS-10.14
下面代码指定虚拟机环境为 ubuntu-18.04
。
runs-on: ubuntu-18.04
jobs.<job_id>.steps
steps
字段指定每个 Job 的运行步骤,可以包含一个或多个步骤。每个步骤都可以指定以下三个字段。
- jobs.<job_id>.steps.name:步骤名称
- jobs.<job_id>.steps.run:该步骤运行的命令或者 action
- jobs.<job_id>.steps.env:该步骤所需的环境变量
下面代码中,steps
字段只包括一个步骤。该步骤先注入四个环境变量,然后执行一条 Bash 命令。
name: Greeting from Mona
on: push
jobs:
my-job:
name: My Job
runs-on: ubuntu-latest
steps:
- name: Print a greeting
env:
MY_VAR: Hi there! My name is
FIRST_NAME: Mona
MIDDLE_NAME: The
LAST_NAME: Octocat
run: |
echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.