5 GitHub Actions 手册

学习资源:

学习 Actions

记录学习 Github Actions 的笔记。

学习资料:使用 GitHub 操作 自动化工作流程

1 GitHub 操作使用入门

GitHub 操作 可让您直接在 GitHub 仓库中创建自定义的软件开发生命周期工作流程。GitHub 操作的核心概念:

  • Workflow:工作流程是您可以在仓库中创建的自定义自动化的流程,用于在 GitHub 上构建、测试、封装、发行或部署任何代码项目。Workflows 由一个或者多个 jobs 组成 并且可以借由 event 部署和激活。
  • Workflow run:workflow 的一个在 pre-configured event 发生时运行的实例。您可以看到每个工作流运行的作业、操作、日志和状态。
  • Workflow file:使用至少一个作业定义的工作流配置(configuration)的 YAML 文件。此文件位于 GitHub 存储库的根目录中的 .github/workflows 位置。
  • Job:作业(或称为任务)是由 step 组成的 task 定义。每个作业均在虚拟环境的新实例中运行。您可以定义工作流文件中作业的运行方式的依赖项规则。作业可以并行运行,也可以依赖于上一个作业的状态,按顺序运行。例如,工作流可以有两个顺序作业: build 和 test,其中测试作业取决于生成作业的状态。如果生成作业失败,则测试作业将不会运行。
  • Step:步骤是作业执行的一组任务。作业中的每个步骤都在同一虚拟环境中执行,允许该作业中的操作使用文件系统共享信息。步骤可以通过 commands 或者 actions 运行。
  • Action:操作作为创建作业的步骤合并的独立任务。操作是工作流中最小的可移植构建基块。您可以创建自己的操作,使用从 GitHub 社区共享的操作,以及自定义公共操作。要在工作流中使用操作,必须将其作为步骤包含在内。
  • Continuous integration (CI):持续集成通过提供有关代码更改的即时反馈来更快地检测和解决 Bug,从而节省了开发人员的时间。
  • Continuous deployment (CD):持续部署基于持续集成。提交新代码并通过 CI 测试时,代码将自动部署到生产中。使用 GitHub ,您可以创建自定义 CD 工作流,以自动将代码部署到存储库中的任何云、自托管服务或平台。CD 通过自动化部署过程并更快地向客户部署经过测试、稳定的代码更改来节省开发人员的时间。
  • Virtual environment:GitHub 托管(hosts) Linux、macOS 和 Windows 虚拟环境以运行工作流。
  • Runner:在每个虚拟环境中等待可用作业的 GitHub 服务,当 Runner 拾取作业时,它将运行作业的操作,并将进度、日志和最终结果报告回 GitHub。Runner 一次运行一个作业。
  • Event:触发(triggers)工作流运行的特定活动。例如,当有人将提交推送到存储库或创建问题或拉取请求时,活动可能来自 GitHub。您还可以将工作流配置为在使用存储库调度 Webhook 发生外部事件时运行。
  • Artifact:项目(构件或工件)是生成(build)和测试(test)代码时创建的文件。例如,项目可能包括二进制文件或包文件、测试结果、屏幕截图或日志文件。项目与创建项目的位置的工作流运行相关联,并且可以由其他作业使用或部署。

2 配置 worflow

如果您对某仓库具有写入或管理员权限,您可以创建、查看或编辑该仓库的工作流程。您可以根据工作流程中包含的操作类型自定义工作流程配置。

您可以在仓库中创建多个工作流程,但是必须将工作流程存储在仓库根目录的 .github/workflows 目录中。

工作流程必须至少有一项作业,并且作业包含一组用于执行个别任务的步骤。 步骤可以运行命令或使用操作。

您可以配置工作流程在 GitHub 事件发生时开始,按时间表开始,或者由外部事件触发。

您需要使用 YAML 语法配置工作流程,并将其在仓库中存储为工作流程文件。 在成功创建 YAML 工作流程文件并触发工作流程后,您会看到工作流程每个步骤的创建日志、测试结果、构件和状态。

2.1 创建工作流程文件

添加工作流程文件的步骤如下:

  • 在仓库根目录创建目录 .github/workflows 并在此目录下新建文件 .yml。 例如 .github/workflows/continuous-integration-workflow.yml
  • 使用“GitHub 操作 的工作流程语法”参考文档选择可触发操作的事件、添加操作以及自定义工作流程。
  • 将您在工作流程文件中的更改提交到您希望其中运行工作流程的分支。

2.1.1 通过事件触发工作流程

事件:

  • GitHub 上的事件,例如有人推送提交到仓库或者创建议题或拉取请求时。
  • 安排或计划的事件。
  • 外部事件发生。

要在 GitHub 上通过事件触发工作流程,请在工作流程名称后面添加 on:(指定触发 workflow 的条件,通常是某些事件)和事件值(如 push)。例如,工作流程在更改推送到仓库中的任何分支时触发:

name: descriptive-workflow-name
on: push

on 字段也可以是事件的数组:

on: [push, pull_request]

要计划工作流程的运行,可以在工作流程文件中使用 POSIX cron 语法。 例如,工作流程每小时触发一次:

on:
  schedule:
    # * is a special character in YAML so you have to quote this string
  - cron:  '0 * * * *'

下面的例子表示设定 workflow 运行的时间为周一至周五的 2:00 UTC 时间:

on:
  schedule:
  - cron: "0 2 * * 1-5"

要在外部事件发生后触发工作流程,您可以回调“创建仓库分发事件”REST API 端点来调用 repository_dispatch web 挂钩事件。 更多信息参阅 "Create a repository dispatch event" in GitHub 开发者文档。

更多信息和示例请参阅“触发工作流程的事件”。

2.1.2 过滤特定分支

您可以设置工作流程仅在特定分支上运行。

例如,工作流程限定在 master 分支上发生推送时运行:

on:
  push:
    branches:
    - master
    # file paths to consider in the event. Optional; defaults to all.
    paths:
      - test/*

有关在工作流程中引用分支的更多信息,请参阅“GitHub 操作 的工作流程语法”。

2.1.3 选择虚拟环境

您可以在 GitHub 托管的虚拟机上或者 Docker 容器中运行工作流程。可以为工作流程中的每项作业指定虚拟环境。

要指定想在其中运行工作流程的虚拟环境的操作系统、工具、软件包和设置,必须在工作流程文件中使用特殊语法。更多信息请参阅“GitHub 操作 的虚拟环境”。

您可以选择不同类型和版本的虚拟主机,包括 Ubuntu、Linux 和 macOS。 工作流程中的每项作业在同一虚拟环境中执行,让该作业中的操作使用文件系统共享信息。

要在全新的虚拟环境实例上运行作业,可以指定虚拟主机运行作业:

runs-on: ubuntu-18.04

有关详细信息,包括支持的版本,请参阅“GitHub 操作 的工作流程语法”。

2.1.4 配置构建矩阵

要同时在多个操作系统、平台和语言版本上测试,可以配置构建矩阵。构建矩阵提供不同的配置供虚拟环境测试。 例如,工作流程可为多个支持的语言、操作系统或工具版本运行作业。对于每项配置,将运行作业的副本并报告状态。您可以使用矩阵在 strategy: 下列出配置选项,在工作流程文件中指定构建矩阵。

例如,构建矩阵将通过不同版本的 Node.jsUbuntuLinux 操作系统运行作业:

strategy:
  matrix:
    node: [6, 8, 10]
    os: [ubuntu-14.04, ubuntu-18.04]

2.1.5 使用检出(checkout)操作

在工作流程中可以使用多个标准操作。检出操作是标准操作,在以下情况下,在工作流程中必须位于其他操作前面:

  • 工作流程需要仓库代码的副本,比如在创建并测试仓库或使用持续集成时。
  • 工作流程中至少有一项操作在同一仓库中定义。 更多信息请参阅“在工作流程中引用操作”。

要使用标准检出操作而不做进一步的指定,请包含此步骤:

<br />- uses: actions/checkout@v1

此示例中使用 v1 确保您使用检出操作的稳定版本。

要浅层克隆仓库,或者只复制仓库的最新版本,请使用 with 语法设置 fetch-depth

- uses: actions/checkout@v1
  with:
    fetch-depth: 1

更多信息请参阅检出操作

2.1.6 选择用于工作流程的操作类型

您可以根据项目需求在工作流程中使用不同类型的操作:

  • Docker 容器操作
  • JavaScript 操作

更多信息请参阅“关于操作”。

选择要在工作流程中使用的操作类型时,建议探索公共仓库中或 Docker Hub 上的现有操作,并根据需要为项目自定义这些操作。

您可以在 github.com/actions 组织中找到并使用 GitHub 创建的操作。 要访问 Docker Hub,请参阅 Docker 网站上的“Docker Hub”。

2.1.7 在工作流程中引用操作

要在工作流程文件中使用正确的语法引用操作,必须考虑定义操作的位置。工作流程可以使用以下位置定义的操作:

  • 公共仓库
  • 工作流程文件引用操作的同一仓库
  • Docker Hub 上发布的 Docker 容器图像

要使用私人仓库中定义的操作,工作流程文件和操作必须在同一仓库中。您的工作流程不能使用在其他私人仓库中定义的操作,即使该仓库在同一组织中。为使工作流程在操作有更新时也保持稳定,您可以在工作流程文件中指定 Git 引用或 Docker 标记号以引用所用操作的版本。

从公共仓库引用操作:如果操作定义在公共仓库中,必须使用语法 {owner}/{repo}@{ref}{owner}/{repo}/{path}@{ref} 引用操作。

jobs:
   my_first_job:
       name: My Job Name
       steps:
       - uses: actions/setup-node@v1
        with:
          node-version: 10.x

要查看完整的工作流程示例,请参阅设置节点模板仓库。下面简单列出一些说明:

jobs.<job_id>.steps.name:步骤名称。
jobs.<job_id>.steps.run:该步骤运行的命令或者 action。
jobs.<job_id>.steps.env:该步骤所需的环境变量。

再看一个完整的例子:

name: Greet Everyone
# This workflow is triggered on pushes to the repository.
on: [push]

jobs:
  build:
    # 作业名称为 Greeting
    name: Greeting
    # 此作业在 Linux 上运行
    runs-on: ubuntu-latest
    steps:
      # 此步骤使用 GitHub 的 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
      # 此步骤打印上一步操作的输出(时间)。
      - name: Echo the greeting's time
        run: echo 'The time was ${{ steps.hello.outputs.time }}.'

在工作流程文件使用操作的同一仓库中引用操作:如果操作在工作流程文件使用该操作的同一仓库中定义,您可以在工作流程文件中通过 ‌{owner}/{repo}@{ref}./path/to/dir 语法引用操作。

示例仓库文件结构:

.github
└── workflows
    └── my-first-workflow.yml
.
└── hello-world-action
    └── action.yml

示例工作流程文件:

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: ./hello-world-action

引用 Docker Hub 上的容器:如果操作在 Docker Hub 上发布的 Docker 容器的镜像中定义,您必须在工作流程文件中通过 docker://{image}:{tag} 语法引用操作。为保护代码和数据,强烈建议先验证 Docker Hub 中 Docker 容器镜像的完整性后再将其用于工作流程。

jobs:
  my_first_job:
    steps:
      - name: My first step
        uses: docker://alpine:3.8

有关 Docker 操作的部分示例,请参阅 Docker-image.yml 工作流程或 Docker 操作仓库

2.2 创建多个任务的 workflow

workflow 文件的主体是 jobs 字段,表示要执行的一项或多项任务。

jobs 字段里面,需要写出每一项任务的 job_id,具体名称自定义。job_id 里面的 name 字段是任务的说明。比如:

jobs:
  first_job:
    name: My first job
  second_job:
    name: My second job

上面代码的 jobs 字段包含两项任务,job_id 分别是 first_job 和 second_job。

有时,我们需要创建有依赖关系的任务,此时需要借助 needs 字段:

jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]

上面代码中,job1 必须先于 job2 完成,而 job3 等待 job1 和 job2 的完成才能运行。因此,这个 workflow 的运行顺序依次为:job1、job2、job3。

2.3 将工作流程状态徽章添加到您的仓库

状态徽章显示工作流程目前失败还是通过。 添加状态徽章的常见位置是仓库的 README.md 文件,但也可将其添加到您喜欢的任何网页。 徽章显示默认分支(通常是 master)的状态。 您也可以在 URL 中使用 branch 和 event 查询参数显示特定分支或事件运行的工作流程状态。具体的格式:

https://github.com/<OWNER>/<REPOSITORY>/workflows/<WORKFLOW_NAME>/badge.svg

2.4 为操作创建自述文件

如果计划公开分享您的操作,建议创建自述文件以帮助人们了解如何使用您的操作。 您可以将此信息包含在 README.md 中:

  • 操作的详细描述
  • 必要的输入和输出变量
  • 可选的输入和输出变量
  • 操作使用的密码
  • 操作使用的环境变量
  • 如何在工作流程中使用操作的示例

配置工作流程

构建操作

在 GitHub 上设置持续集成

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容

  • Git global setup git config --global user.name "your name...
    Lucifer黄阅读 142评论 0 0
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,961评论 1 3
  • 2008年,当汤姆·普雷斯顿-沃纳(Tom Preston Werner)、克里斯·万斯特拉斯(Chris Wan...
    小哈公社阅读 1,027评论 0 9
  • 请允许我借鉴前辈们的东西~~~~ 感激不尽~~~~~ 以下为Android 框架排行榜 么么哒~ Android...
    嗯_新阅读 2,017评论 3 32
  • 图、文/龙小烛 -1- 青岚被接回殷家老宅的那天是一个日头晃眼的大晴天,南方的初夏一旦翻跳过了雷雨期,便迎来这样长...
    龙小烛阅读 1,268评论 13 23