- 前提:有指定仓库的写权限或管理权限
- 就可以创建/查看/编辑 wrokflow
- 一个仓库可以有多个工作流 在仓库的.github/worklflows/下
- workflow至少要有一个job
- job包含多个step,每个step执行一个独立的小任务,step可以是运行命令,或使用一个action
- action可以自己创建,也可以去社区找
- 配置的工作流的启动可以通过github事件触发,通过调度触发,或通过外部事件触发
- 配置文件用yaml格式,并将配置文件保存到仓库里
创建一个配置文件:
- 在.github/workflows/下创建一个.yml文件
- 按workflow语法构建一个配置文件
- 将配置文件提到到仓库的指定分支,如果想这个分支上运行工作流。
name: Greet Everyone
# This workflow is triggered on pushes to the repository.
on: [push]
jobs:
build:
# Job name is Greeting
name: Greeting
# This job runs on Linux
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
# This step uses the hello-world-action stored in this workflow's repository.
- uses: ./hello-world-action
with:
who-to-greet: Octocat
id: hello
# This step prints the time.
- run: echo The time was ${{ steps.hello.outputs.time }}
- 通过事件触发工作流(目前有3种:github事件/调度/外部事件)
- 工作流的名称对应着name:
- 触发事件对应着on:,push表示任何分支的push操作都会触发这个工作流
- 调度触发或外部事件触发,可查看文档
- 也可以指定工作流只对部分分支起作用
- 可选择每个job的虚拟环境(操作系统/工具/包/设置)
- 一个job的虚拟环境是不变的,job里的action通过文件系统共享信息
- runs-on: 就可以指定具体的虚拟环境实例,目前可选的有ubuntu/linux/macos
- 配置build矩阵
- 为了同一时间在多操作系统/多平台/多语言版本下测试通过,可配置一个build矩阵
- 使用build矩阵,要使用strategy
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-14.04, ubuntu-18.04]
node: [6, 8, 10]
# 这个build矩阵要测试14和18下node版本为6/8/10 各种情况的组合
- 有很多官方的action也是可以直接使用的
- uses: actions/checkout@v1 就是github官方维护的github.com/actions/checkout仓库,v1表示使用v1版本
- 针对clone,也可以只克隆最新代码
- uses: actions/checkout@v1
with:
fetch-depth: 1 # 只拉取最新代码
- action的类型
- docker容器 action
- javascript action
- 在工作流中引用action
- 工作流中的action可能来至公共仓库/同一个仓库的其他地方/docker hub的镜像
- 如果是私有仓库,那workflow file和action要在同一个仓库
- 不能引用另一个私有仓库的action,即使这个私有仓库和当前仓库属于同一个组织
- 可以通过git或docker的tag来指定action的版本
- 引用一个公共仓库的action,写法是{owner}/{repo}@{ref} 或是{owner}/{repo}/{path}@{ref}
- 引用同一个仓库中的action,写法是{owner}/{repo}@{ref} 或是./path/to/dir
- 引用docker hub中的容器,写法是docker://{image}:{tag}
# 引用公共仓库的action
jobs:
my_first_job:
name: My Job Name
steps:
- uses: actions/setup-node@v1 # 引用github.com/actions/setup-node v1就是tag
with:
node-version: 10.x
# 引用同一仓库的action
jobs:
build:
runs-on: ubuntu-latest
steps:
# This step checks out a copy of your repository.
- uses: actions/checkout@v1 # 引用公共仓库的
# This step references the directory that contains the action.
- uses: ./.github/actions/hello-world-action # 引用同一仓库的action
# 引用docker hub的容器
jobs:
my_first_job:
steps:
- name: My first step
uses: docker://alpine:3.8
我们做以下的事:
- 查看workflow中每个step的状态和结果
- 取消阻塞的workflow
- 调试或重新运行一个失败的workflow
- 查找或下载日志
- 下载输出
github actions利用github的api,让管理工作流(就是上面那些事)成为了可能, 也可以浏览工作流的历史,可以重新运行workflow run,可以取消正在运行的workflow run, 可以查看每个step的详细运行信息,可以在运行信息中进行搜索,以及下载
说明:
- yaml语法,文件扩展名是.yml或是.yaml
- 配置文件放在.github/workflows/下
- 限制
- 一个仓库最多20个workflow并发
- 一个仓库总的api请求,不能超过1000次/小时
- workflow中的job运行不能超过6小时
- 一个仓库的所有workflow,不能超过20个job的并发
语法:
- name
- 工作流的名称
- 如果省略,就取配置文件名
- on
- 必选
- 用string来表示单个事件
- on: push 单个事件触发工作流
- 用array来表示多个事件
- on: [push, pull_request] 多个事件
- 用map来配置一个工作流调度
- on.schedule
- 通过 posix corn 定时任务来触发
- 用指定文件/指定tag/指定branch来限制工作流的执行
- on.<push|pull_request>.<tags|branches>
- tag branch 都可以使用通配符来进行匹配
- 如果只指定分支或tag中的一个,那其他类型的都不会触发工作流
- 多个匹配过程可能会发生交集,以最后一个匹配为准
- on.<push|pull_request>.paths
- 这个就是通过文件目录来进行匹配
- jobs
- workflow就是由多个job组成
- job默认都是并发执行,也可以配置成顺序执行
- job通过runs-on指定一个新的虚拟环境
- jobs.job_id 每个job都有一个id关联,job_id以字母和_开头,包含字母数组-_
- jobs.job_id.name job名用于github上显示
- jobs.job_id.needs 指明这个job的前置job
- jobs.job_id.runs-on 指定新的虚拟环境,目前(20190906)可用虚拟环境是
- ubuntu-latest, ubuntu-18.04, or ubuntu-16.04
- windows-latest, windows-2019, or windows-2016
- macOS-latest or macOS-10.14
- jobs.job_id.steps job的步骤叫step
- step可运行命令,可设置任务,可运行action
- 多个step之间可共享工作区间和文件系统
- 但step中修改的环境变量不会影响到其他step,她们都有各自的进程
- jobs.<job_id>.steps.id 标识step
- jobs.<job_id>.steps.if 可利用if来设置条件,满足就执行job
- jobs.<job_id>.steps.name step名称
- jobs.<job_id>.steps.uses 选择使用哪些action,action是可重用的最小单元
- 推荐:在使用action时带上git 引用或sha或docker的tag
- 使用提交的sha,最安全可靠
- 使用action的版本,有可能是分支名或tag,在一定范围内是可以进行修复,维护需要注意兼容性
- 使用master分支是最方便的,如果发布了一个主版本,就可能导致工作流失败
- 部分action是需要with关键字的,是否需要,需要查看action的README
- action要么是js脚本,要么是docker容器,docker容器要运行在linux环境中
- jobs.job_id.steps.run 操作系统shell执行的命令
- 执行shell会在虚拟环境中的新进程内执行
- 可以通过shell指定命令执行的shell,可以是bash sh cmd python等
- jobs.<job_id>.steps.with 参数,是一个map,kv对
- 这些参数是作为环境变量传进去的
- 这些参数对应的环境变量是加上前缀 INPUT_, 并转换成大写
- jobs.<job_id>.steps.with.args 参数,这个是给docker容器的参数
- jobs.<job_id>.steps.with.entrypoint 覆盖docker容器的entrypoint
- jobs.<job_id>.steps.env 设置虚拟环境的环境变量
- jobs.<job_id>.steps.working-directory 设置job的工作目录
- jobs.<job_id>.steps.continue-on-error 设置为true表示step失败后可以继续执行后面的step
- jobs.<job_id>.steps.timeout-minutes job运行的最大时长,超过就kill
- jobs.job_id.timeout-minutes 工作流运行的最大时长 默认是360=6小时
- jobs.job_id.strategy 创建构建矩阵
- jobs.job_id.strategy.matrix 具体的构建矩阵
- 构建矩阵的每个条件都可以对应多个版本等,这样会创建多个job
- 可以用include来指定某个条件下的新约束
- 可以用exclude来排除某个条件下的约束
- 设置fail-fast 为true表示如果某个job出错,会取消所有矩阵对应的job,默认是true
- max-parallel 可指定矩阵运行的job的最大并发数,github 会默认执行所有的矩阵
- jobs.job_id.container
- 在job中一个容器包含任意个step
- 如果指定了,这个job的所有step都跑在这个容器中
- 如果step也指定了容器,同时还有js脚本action,那么step指定的容器和job的容器是兄弟容器,一起运行
- 并这些容器共享网络和存储
- 如果不设置容器,那所有的step都运行在虚拟环境
- 容器可指定相关参数,如果不指定,可省略image关键字
- image:docker镜像,生成的容器用于运行action
- env:容器的环境变量,可用数组传递
- ports:容器暴露端口
- volumes:容器存储
- options:附加选项
- jobs.job_id.services
- 工作流中一个job的附加容器
- eg:创建db服务,创建缓存redis服务,虚拟环境实例自动管理网络和这些服务容器的生命周期
- 这种服务的ip是动态变化的
- 端口由service_name.ports指定
- image: docker镜像
- env: 环境变量
- ports: 就是上面说到的端口
- volumens:存储
- options:附加选项
- 事件,可配置什么事件发生时触发什么样的workflow
- 当然除了github事件,还有调度和外部事件都能触发wrokflow,这些都可以算成事件
限制:
- workflow中的action并不能触发另一个新的workflow
webhook事件:
- 可利用一个或多个webhook事件触发workflow
- eg: on:push 或是 on:[push,pull_request]
- 在一个workflow run中,GITHUB_SHA, GITHUB_REF都作为环境变量存在虚拟环境中
- github事件有多种触发类型
- release,当有一个release版本执行发布/下架/创建/编辑/删除/预发布时触发
- 也有部分事件只有一个触发类型
- 这时,action关键字会直接使用webhook payload
- eg: commit_commnet 只在提交comment时触发事件,push事件也是类似的
- eg:多触发类型: pull_request 里面有分配 取消分配 标签 取消标签 打开 编辑 repoen 加锁等多个触发类型
- 对于每一个事件,可以设置一个触发类型,如果不设置,就会有一个默认设置
- 具体的默认设置可以查看传送们
- pull_request事件中,默认只打开了少数几个触发类型
- 目前github提供的api v3 有50个rust api,对应到github actions的事件有28个
- fork 一个仓库,并提交pr
- 只会触发上游仓库的pull_request事件
- 由于一些GITHUB_TOKEN机制,如果像让pr触发ci测试,要开启监听push事件
调度事件:
- 调度工作流基于默认分支或上游分支的最后一次提交
- 使用的是posix corn语法
- on.schedule.corn
- corn有5个由空格间隔的部分
- 5个部分分别是:分0-59/时0-23/每月的第几号1-31/月1-12/每周第几天0-6
- 这5个部分的交集就是指定时间
- *表示匹配任何值
- ,表示当前字段是一个数组,可选多个值
-
- 表示是一个范围值
- / 步长 字段分上的20/15 表示20 35 50 是条件
外部事件:
- 可以使用github 的api来触发一个webhook事件(repository_dispatch)
- 这是在github外部触发工作流的事件
- 如果要触发这个外部事件,需要用POST请求等,具体可查看文档
- 这个虚拟环境由github提供,里面包含了一些工具/包/可设置的action
- 这些虚拟环境跑在微软的azure(一个云服务),具体是Standard_DS2_v2机器,毕竟github给微软收购了
- windows和linux跑在Standard_DS2_v2虚拟机,macos跑在macstadium
- 可以直接跑在虚拟环境中,或跑在docker容器中
- 每个job都放在一个独立的虚拟环境实例中
- job中的step都在这个虚拟环境实例中运行
- 所有action就能利用文件系统共享通信
- 当然,也可以配置成job都跑在同一个环境中
- 每个虚拟环境可用资源是 双核cpu/7G内存/14G ssd磁盘空间
直接跑在虚拟环境中,部分文件系统路径:
- docker容器运行的action,是在/github目录下,而脚本的的目录并不是静态的
- github actions中可配置 home/workspace/workflow目录
- home: 用户数据,环境变量对应HOME
- workspace: actions执行目录,环境变量对应 GITHUB_WORKSAPCE
- workflow/event.json: 触发工作流的webhook事件的POST payload,环境变量对应GITHUB_EVENT_PATH
跑在docker容器,部分文件系统路径:
- /github/home /github/workspace /github/workflow
- 上面是默认路径,github推荐不要修改默认的环境变量
关于环境变量:
- workflow run中的每个step都可以访问环境变量
- 一般在配置文件 workflow file中指定环境变量
- 可以通过jobs.job_id.steps.env 来为一个spte指定环境变量
- github会自动将环境变量转成大写,所以在配置中写环境变量时,大小写均是支持的
- 推荐在actions中使用环境变量来访问文件系统,而不是硬编码(直接将文件路径写在actins中)
- 虚拟环境已经提供了一些默认的环境变量,具体可查看文档
- 自定义的环境变量来表示文件路径,推荐使用_PATH作为后缀
安全:
- 加密,环境变量也可以进行加密来保证安全
- 这些加密信息只能用于github actions
- 这些安全加密的信息要在github 仓库页去设置,然后通过配置文件,通过环境变量传递给action
- 具体的安全信息的配置和使用,可查看文档
结束代码和状态:
- 可以用返回码来表示action的执行状态
- 0 表示成功
- 非0 表示失败
这里列出来虚拟环境中可用的一些软件,针对于ubuntu16 18/ windows server 2016 2019/ macOS10.14
表达式:
- 可以通过表达示来设置workflow file中的值,并访问上下文
- 表达式可以是 文字值 上下文引用 函数 进行组合,组合的方式是通过操作符
- 配置中是可以使用if语句的,if语句后使用表达式,是表达式最常使用场景
- 使用if 后接表达式, 此时表达式不用使用$, 因为此时github会自动当成表达式去计算
- 表达式第二个场景是用在环境变量设置时 env_var:${{<表达式>}}
上下文:
- 上下文是访问信息的一种方式,这些信息包括:工作流实例,虚拟环境,job,step
- 书写方式是: ${{<上下文>}},和表达式有点类似
- 具体上下文对象有哪些:
- github: 表示wrokflow run 就是工作流运行实例
- job:当前执行的job对象
- steps: 当前运行job中包含的step
- runner: 当前job运行实例
- secrets: 开启访问github 安全设置
- strategy: 策略参数,包括快速失败 最大并发 最大job数 job索引
- matrix: 矩阵
- 每个对象都有很多属性可以访问
字面量:
- boolean: 值有true和false
- null:值是null
- number: json支持的数值格式
- string:单引号包围的字符串,里面如果含有单引号,是需要转义的
- 这些字面量可以直接用于组合表达式
还有一些操作符,具体可以查看文档:
- 松散式比较
- 类型不同就转换成成number再比较
- NaN和NaN的比较结果不一定是true
- 比较字符串时,不区分大小写
- 对象和数组只有是在都是相同实例才算是相等
- 字面来转number具体看文档
函数:
- contains 字符串包含
- startsWith 字符串前缀比较
- endsWith 比较后缀
- format 字符串替换
- join 数组转字符串
- toJson 转json
- job状态检查函数:
- success 是否成功
- always 强制认为条件是成功的,就是直接返回true
- cancelled 是否取消了
- failure 是否失败了
对象过滤:支持通配符