让你满意的 GitHub Actions 详解 - 简书
本文由 简悦 SimpRead 转码, 原文地址 www.jianshu.com
GitHub Actions 指南
GitHub Actions
使你可以直接在你的GitHub
库中创建自定义的工作流,工作流指的就是自动化的流程,比如构建、测试、打包、发布、部署等等,也就是说你可以直接进行 CI
(持续集成)和 CD
(持续部署)。
基本概念
(1)workflow
: 一个 workflow
工作流就是一个完整的过程,每个workflow
包含一组 jobs
任务。
(2)job : jobs
任务包含一个或多个job
,每个 job
包含一系列的 steps
步骤。
(3)step
: 每个 step
步骤可以执行指令或者使用一个 action
动作。
(4)action
: 每个 action
动作就是一个通用的基本单元。
配置 workflow
workflow
必须存储在你的项目库根路径下的 .github/workflows
目录中,每一个 workflow
对应一个具体的.yml
文件(或者 .yaml
)。
workflow
示例:
1 | name:GreetEveryone |
说明:
(1)最外层的 name
指定了 workflow
的名称。
(2)on
声明了一旦发生了 push
操作就会触发这个 workflow
。
(3)jobs
定义了任务集,其中可以有一个或多个job
任务,示例中只有一个。
(4)runs-on
声明了运行的环境。
(5)steps
定义需要执行哪些步骤。
(6)每个 step
可以定义自己的 name
和id
,通过 uses
可以声明使用一个具体的 action
,通过run
声明需要执行哪些指令。
(7)${{}}
可以使用上下文参数。
上述示例可以抽象为:
1 | name: <workflow name> |
on
on
声明了何时触发 workflow
,它可以是:
(1)一个或多个GitHub
事件,比如 ush
了一个 commit
、创建了一个issue
、产生了一次pull`` request
等等,示例:
1 | on:[push,pull_request] |
(2)预定的时间,示例(每天零点零分触发):
1 | on: |
(3)某个外部事件。所谓外部事件触发,简而言之就是你可以通过REST API
向 GitHub
发送请求去触发,具体请查阅官方文档: repository-dispatch-event
配置多个事件,示例:
1 | on: |
详细文档请参考: 触发事件
jobs
jobs
可以包含一个或多个 job
,如:
1 | jobs: |
如果多个job
之间存在依赖关系,那么你可能需要使用 needs
:
1 | jobs: |
这里的needs
声明了job2
必须等待 job1
成功完成,job3
必须等待 job1
和 job2
依次成功完成。
每个任务默认超时时间最长为 360
分钟,你可以通过 timeout-minutes
进行配置:
1 | jobs: |
runs-on & strategy
runs-on
指定了任务的 runner
即执行环境,runner
分两种:GitHub-hosted runner
和 self-hosted runner
。
所谓的 self-hosted runner
就是用你自己的机器,但是需要 GitHub
能进行访问并给与其所需的机器权限,这个不在本文描述范围内,有兴趣可参考 self-hosted runner
。
GitHub-hosted runner
其实就是 GitHub
提供的虚拟环境,目前有以下四种:
(1)windows-latest : Windows Server 2019
(2)ubuntu-latest
或 ubuntu-18.04 : Ubuntu 18.04
(3)ubuntu-16.04 : Ubuntu 16.04
(4)macos-latest : macOS Catalina 10.15
比较常见的:
1 | runs-on:ubuntu-latest |
runs-on 多环境
有时候我们常常需要对多个操作系统、多个平台、多个编程语言版本进行测试,为此我们可以配置一个构建矩阵。
例如:
1 | runs-on: ${{ matrix.os }} |
示例中配置了两种os
操作系统和三种 node
版本即总共六种情况的构建矩阵, ${{matrix.os}}
是一个上下文参数。
strategy
策略,包括:
(1)matrix
: 构建矩阵。
(2)fail-fast
: 默认为true
,即一旦某个矩阵任务失败则立即取消所有还在进行中的任务。
(3)max-paraller
: 可同时执行的最大并发数,默认情况下 GitHub
会动态调整。
示例:
1 | runs-on: ${{ matrix.os }} |
include
声明了 os
为 windows-latest
时,增加一个 node
和npm
分别使用特定的版本的矩阵环境。
与include
相反的就是exclude
:
1 | runs-on: ${{ matrix.os }} |
exclude
用来删除特定的配置项,比如这里当os
为 macos-latest
,将 node
为 4 的版本从构建矩阵中移除。
steps
steps
的通用格式类似于:
1 | steps: |
每个 step
步骤可以有:
(1)id
: 每个步骤的唯一标识符
(2)name
: 步骤的名称
(3)uses
: 使用哪个action
(4)run
: 执行哪些指令
(5)with
: 指定某个action
可能需要输入的参数
(6)continue-on-error
: 设置为 true
允许此步骤失败job
仍然通过
(7)timeout-minutes : step
的超时时间
action
action
动作通常是可以通用的,这意味着你可以直接使用别人定义好的action
。
checkout action
checkout action
是一个标准动作,当以下情况时必须且需要率先使用:
(1)workflow
需要项目库的代码副本,比如构建、测试、或持续集成这些操作。
(2)workflow
中至少有一个 action
是在同一个项目库下定义的。
使用示例:
1 | - users:action/checkout@v1 |
如果你只想浅克隆你的库,或者只复制最新的版本,你可以在 with
中使用fetch-depth
声明,例如:
1 | - user:action/checkout@v1 |
引用 action
(1)官方action
标准库: github.com/actions
(2)社区库:marketplace
引用公有库中的 action
引用 action
的格式是{owner}/{repo}@{ref}
或 {owner}/{repo}/{path}@{ref}
,例如上例的中actions/checkout@v1
,你还可以使用标准库中的其它 action
,如设置 node
版本:
1 | jobs: |
引用同一个库中的 action
引用格式:{owner}/{repo}@{ref}
或 ./path/to/dir
。
例如项目文件结构为:
1 | -- hello-world (repository) |
当你想要在workflow
中引用自己的action
时可以:
1 | jobs: |
引用 Docker Hub 上的 container
如果某个 action
定义在了一个docker container image
中且推送到了Docker Hub
上,你也可以引入它,格式是docker://{image}:{tag}
,示例:
1 | jobs: |
更多信息参考:Docker-image.yml workflow
和Creating a Docker container ``action
。
构建 actions
请参考:building-actions
env
环境变量可以配置在以下地方:
(1)env
(2)jobs.<job_id>.env
(3)jobs.<job_id>.steps.env
示例:
1 | env: |
如果重复,优先使用最近的那个。
if & context
你可以在 job
和step
中使用if
条件语句,只有满足条件时才执行具体的job
或 step
:
(1)jobs.<job_id>.if
(2)jobs.<job_id>.steps.if
任务状态检查函数:
(1)success()
: 当上一步执行成功时返回 true
(2)always()
: 总是返回 true
(3)cancelled()
: 当 workflow
被取消时返回 true
(4)failure()
: 当上一步执行失败时返回 true
例如:
1 | steps: |
意思就是 step1
总是执行,step2
需要上一步执行成功才执行,step3
只有当上一步执行失败才执行。
${{
上下文和表达式: ${{
有时候我们需要与第三方平台进行交互,这时候通常需要配置一个token
,但是显然这个 token
不可能明文使用,这种个情况下我们要做的就是:
(1)在具体 repository
库Settings
的 Secrets
中添加一个密钥,如 SOMEONE_TOKEN
(2)然后在workflow
中就可以通过 ${{secrets.SOMEONE_TOKEN}}
将 token
安全地传递给环境变量。
1 | steps: |
这里的secrets
就是一个上下文,除此之外还有很多,比如:
(1)github.event_name
: 触发workflow
的事件名称
(2)job.status
: 当前job
的状态,如 success, failure, or cancelled
(3)steps.<step id>.outputs
: 某个 action
的输出
(4)runner.os : runner
的操作系统如 Linux, Windows, or macOS
这里只列举了少数几个。
另外在if
中使用时不需要 ${{}}
符号,比如:
1 | steps: |
上下文和表达式详细信息请参考:contexts-and-expression
结语
最后给个自己写的示例,仅供参考:
1 | name: GitHub Actions CI |
以上就是小编今天带来的内容,小编本身就是一名 python 开发工程师,我自己花了三天时间整理了一套 python 学习教程,从最基础的 python 脚本到 web 开发,爬虫,数据分析,数据可视化,机器学习,等,这些资料有想要的小伙伴点击下方链接即可领取
https://docs.qq.com/doc/DTGpFa2lVeE9jUkRv