itHub Actions 指南
GitHub Actions 使你可以直接在你的 GitHub 库中创建自定义的工作流,工作流指的就是自动化的流程,比如构建、测试、打包、发布、部署等等,也就是说你可以直接进行 CI(持续集成)和 CD (持续部署)。
基本概念
- workflow : 一个 workflow 工作流就是一个完整的过程,每个 workflow 包含一组 jobs 任务。
- job : jobs 任务包含一个或多个 job ,每个 job 包含一系列的 steps 步骤。
- step : 每个 step 步骤可以执行指令或者使用一个 action 动作。
- action : 每个 action 动作就是一个通用的基本单元。
配置 workflow
workflow 必须存储在你的项目库根路径下的 .github/workflows
目录中,每一个 workflow 对应一个具体的 .yml
文件(或者 .yaml
)。
workflow 示例:
name: Greet Everyone # This workflow is triggered on pushes to the repository. on: [push] jobs: your_job_id: # Job name is Greeting name: Greeting # This job runs on Linux runs-on: ubuntu-latest steps: # This step uses GitHub's hello-world-javascript-action: https://github.com/actions/hello-world-javascript-action - name: Hello world uses: actions/hello-world-javascript-action@v1 with: who-to-greet: 'Mona the Octocat' id: hello # This step prints an output (time) from the previous step's action. - name: Echo the greeting's time run: echo 'The time was ${{ steps.hello.outputs.time }}'
说明:
- 最外层的
name
指定了 workflow 的名称。 on
声明了一旦发生了 push 操作就会触发这个 workflow 。jobs
定义了任务集,其中可以有一个或多个 job 任务,示例中只有一个。runs-on
声明了运行的环境。steps
定义需要执行哪些步骤。- 每个
step
可以定义自己的name
和id
,通过uses
可以声明使用一个具体的action
,通过run
声明需要执行哪些指令。 ${{}}
可以使用上下文参数。
上述示例可以抽象为:
name: <workflow name> on: <events that trigger workflows> jobs: <job_id>: name: <job_name> runs-on: <runner> steps: - name: <step_name> uses: <action> with: <parameter_name>: <parameter_value> id: <step_id> - name: <step_name> run: <commands>
on
on
声明了何时触发 workflow ,它可以是:
- 一个或多个 GitHub 事件,比如 push 了一个 commit、创建了一个 issue、产生了一次 pull request 等等,示例:
on: [push, pull_request]
- 预定的时间,示例(每天零点零分触发):
on: schedule: - cron: '0 0 * * *'
- 某个外部事件。所谓外部事件触发,简而言之就是你可以通过 REST API 向 GitHub 发送请求去触发,具体请查阅官方文档: repository-dispatch-event
配置多个事件,示例:
on: # Trigger the workflow on push or pull request, # but only for the master branch push: branches: - master pull_request: branches: - master # Also trigger on page_build, as well as release created events page_build: release: types: # This configuration does not affect the page_build event above - created
详细文档请参考: 触发事件
jobs
jobs 可以包含一个或多个 job ,如:
jobs: my_first_job: name: My first job my_second_job: name: My second job
如果多个 job 之间存在依赖关系,那么你可能需要使用 needs
:
jobs: job1: job2: needs: job1 job3: needs: [job1, job2]
这里的 needs
声明了 job2 必须等待 job1 成功完成,job3 必须等待 job1 和 job2 依次成功完成。
每个任务默认超时时间最长为 360 分钟,你可以通过 timeout-minutes
进行配置:
jobs: job1: timeout-minutes:
runs-on & strategy
runs-on
指定了任务的 runner 即执行环境,runner 分两种:GitHub-hosted runner 和 self-hosted runner 。
所谓的 self-hosted runner 就是用你自己的机器,但是需要 GitHub 能进行访问并给与其所需的机器权限,这个不在本文描述范围内,有兴趣可参考 self-hosted runner 。
GitHub-hosted runner 其实就是 GitHub 提供的虚拟环境,目前有以下四种:
windows-latest
: Windows Server 2019ubuntu-latest
或ubuntu-18.04
: Ubuntu 18.04ubuntu-16.04
: Ubuntu 16.04macos-latest
: macOS Catalina 10.15
比较常见的:
runs-on: ubuntu-latest
runs-on 多环境
有时候我们常常需要对多个操作系统、多个平台、多个编程语言版本进行测试,为此我们可以配置一个构建矩阵。
例如:
runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-16.04, ubuntu-18.04] node: [6, 8, 10]
示例中配置了两种 os 操作系统和三种 node 版本即总共六种情况的构建矩阵, ${{matrix.os}}
是一个上下文参数。
strategy
策略,包括:
matrix
: 构建矩阵。fail-fast
: 默认为 true ,即一旦某个矩阵任务失败则立即取消所有还在进行中的任务。max-paraller
: 可同时执行的最大并发数,默认情况下 GitHub 会动态调整。
示例:
runs-on: ${{ matrix.os }} strategy: matrix: os: [macos-latest, windows-latest, ubuntu-18.04] node: [4, 6, 8, 10] include: # includes a new variable of npm with a value of 2 for the matrix leg matching the os and version - os: windows-latest node: 4 npm: 2
include
声明了 os 为 windows-latest 时,增加一个 node 和 npm 分别使用特定的版本的矩阵环境。
与 include
相反的就是 exclude
:
runs-on: ${{ matrix.os }} strategy: matrix: os: [macos-latest, windows-latest, ubuntu-18.04] node: [4, 6, 8, 10] exclude: # excludes node 4 on macOS - os: macos-latest node: 4
exclude
用来删除特定的配置项,比如这里当 os 为 macos-latest ,将 node 为 4 的版本从构建矩阵中移除。