GitHub Actions 如何自动执行开发任务?

已完成

在这里,我们将介绍 GitHub Actions 和工作流。 你需要了解可用的操作类型以及在何处查找它们。 你还需要查看这些操作类型的示例,以及它们如何适用于工作流。

GitHub 缩短了从构想到部署的时间

GitHub 旨在帮助开发人员和 DevOps 工程师团队快速生成和部署应用程序。 GitHub 中有许多功能可以实现这一点,但它们通常分为以下两类:

  • 沟通:请考虑 GitHub 提供的可以让开发团队轻松地就软件开发项目进行沟通的所有方式:拉取请求中的代码评审、GitHub 问题、项目板、Wiki、通知等。
  • 自动化:GitHub Actions 可以让团队在软件开发过程中的每一步(从集成到交付到部署)都自动执行工作流。 它甚至可以让你自动向拉取请求添加标签,以及自动检查过时的问题和拉取请求。

结合使用这些功能,可以让成千上万个开发团队有效地缩短从最初构想到部署所需的时间。

使用工作流自动化缩短开发时间

在本模块中,我们将重点介绍自动化,那么让我们来花一点时间了解团队如何使用自动化来减少完成常见开发和部署工作流所需的时间。

请考虑必须在编写代码之后以及你能够可靠地将代码用于其预期目的之前执行的所有任务。 你可能需要执行以下一项或多项任务,具体取决于组织的目标:

  • 确保代码通过所有单元测试
  • 执行代码质量和合规性检查以确保源代码满足组织的标准
  • 检查代码及其依赖项是否存在已知安全问题
  • 生成集成了(可能)来自多个参与者的新源的代码
  • 确保软件通过集成测试
  • 对新生成进行版本控制
  • 将新二进制文件传递到适当的文件系统位置
  • 将新二进制文件部署到一个或多个服务器
  • 如果这些任务中的任何一项没有通过,请将该问题报告给适当的个人或团队予以解决

难题在于以可持续的方式可靠且一致地完成这些任务。 这是工作流自动化的理想作业。 如果已依赖于 GitHub,则可能需要使用 GitHub Actions 来设置工作流自动化。

什么是 GitHub Actions?

GitHub Actions 是打包的脚本,用于在 GitHub 中自动执行软件开发工作流中的任务。 可以将 GitHub Actions 配置为每次开发人员以固定时间间隔或手动方式将新的源代码检入特定分支时,触发满足组织需求的复杂工作流。 其结果是一个可靠的和可持续的自动化工作流,从而大大减少了开发时间。

可从何处找到 GitHub Actions?

GitHub Actions 是遵循 yml 数据格式的脚本。 每个存储库都有一个“操作”选项卡,可提供一种快速简单的方法来设置第一个脚本。 如果你认为可以从某个工作流着手,则只需选择“配置”按钮即可添加脚本并开始编辑源 yml。

Screenshot of the *Actions tab* in GitHub Actions displaying a simple workflow and a button to set up this workflow.

但是,除了“操作”选项卡上提供 GitHub Actions 功能意外,你还可以:

  • GitHub 市场中搜索 GitHub Actions。 可以通过 GitHub 市场发现并购买用于扩展工作流的工具。
  • 搜索开源项目。 例如,GitHub Actions 组织具有许多热门的开源存储库,其中包含可以使用的 GitHub Actions。
  • 从头开始编写自己的 GitHub Actions。 此外,如果需要,可以将其设为开源,甚至可将其发布到 GitHub 市场。

使用开放源代码 GitHub Actions

许多 GitHub Actions 都是开源的,任何人都可以使用。 但是,与任何开源软件一样,在项目中使用这些操作之前,需要仔细检查。 与使用开源软件的推荐社区标准(例如,包含 README、行为准则、参与文件和问题模板等)类似,在使用 GitHub 操作时,可以遵循以下建议:

  • 检查操作的 action.yml 文件的输入、输出,确保代码正确无误。
  • 检查该操作是否在 GitHub 市场中提供。 即使一个操作不一定要在 GitHub 市场上才有效,进行这样的检查也是有好处的。
  • 检查该操作是否在 GitHub 市场中经过验证。 这意味着 GitHub 已批准使用该操作。 但在使用该操作之前,仍应进行检查。
  • 通过指定 Git 引用、SHA 或标记来添加正在使用的操作版本。

GitHub 操作的类型

GitHub 操作有三种类型:容器操作和 JavaScript 操作和复合操作。

对于容器操作,环境是操作代码的一部分。 这些操作只能在 GitHub 托管的 Linux 环境中运行。 容器操作支持多种不同的语言。

JavaScript 操作不包括代码中的环境。 必须指定环境才能执行这些操作。 可以在云中或本地的 VM 中运行这些操作。 JavaScript 操作支持 Linux、macOS 和 Windows 环境。

使用复合操作,可以在一个操作中合并多个工作流步骤。 例如,您可以使用此功能将多个运行命令捆绑到一个操作中,然后获得使用该操作在单一步骤中执行捆绑命令的工作流程。

GitHub 操作剖析

下面是执行存储库 git 签出的操作的示例。 此操作,即 actions/checkout@v1,是工作流中某个步骤的一部分。 此步骤还会生成已签出的 Node.js 代码。我们将在下一部分讨论工作流、作业和步骤。

steps:
  - uses: actions/checkout@v1
  - name: npm install and build webpack
    run: |
      npm install
      npm run build

假设你希望使用容器操作来运行容器化代码。 操作可能如下所示:

name: "Hello Actions"
description: "Greet someone"
author: "octocat@github.com"

inputs:
    MY_NAME:
      description: "Who to greet"
      required: true
      default: "World"

runs:
    uses: "docker"
    image: "Dockerfile"

branding:
    icon: "mic"
    color: "purple"

请注意 inputs 部分。 此处你将获得名为 MY_NAME 的变量的值。 此变量将在运行此操作的工作流中设置。

runs 部分中,请注意在 uses 属性中指定“docker”。 执行此操作时,需要提供 Docker 映像文件的路径。 此处名为“Dockerfile”。 这里不会介绍 Docker 的具体信息,但如果你想要了解更多信息,请参阅 Docker 容器简介模块。

最后一部分是“品牌设置”,该部分用于在 GitHub 市场中对操作进行个性化(如果决定在该市场中将其发布)。

可以在 GitHub Actions 的元数据语法中找到操作元数据的完整列表。

什么是 GitHub Actions 工作流?

GitHub Actions 工作流是在存储库中设置的一个流程,用于自动执行软件开发生命周期任务,包括 GitHub Actions。 利用工作流,可以在 GitHub 上生成、测试、打包、发布和部署任何项目。

若要创建工作流,需在 GitHub 存储库中将操作添加到 .github/workflows 目录中的 .yml 文件。

在接下来的练习中,你的工作流文件 (main.yml) 将如下所示

name: A workflow for my Hello World file
on: push
jobs:
  build:
    name: Hello world action
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - uses: ./action-a
      with:
        MY_NAME: "Mona"

请注意 on: 属性。 这是一个用于指定此工作流运行时间的触发器。 在此处,它会在有到存储库的推送事件时触发运行。 你可以指定单个事件(如 on: push)、事件数组(如 on: [push, pull_request])或事件配置映射(用于计划工作流或将工作流的执行限制为特定文件、标记或分支更改)。 映射可能如下所示:

on:
  # Trigger the workflow on push or pull request,
  # but only for the main branch
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
  # 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

除非指定一个或多个类型,否则事件会针对该事件的所有活动类型执行触发。 有关事件及其活动类型的完整列表,请参阅:GitHub 文档中触发工作流的事件

工作流必须有至少一个作业。 作业是工作流中与运行器关联的一个部分。 运行程序可以是 GitHub 托管的,也可以是自托管的,而且作业可以在计算机上或容器中运行。 需指定带 runs-on: 属性的运行器。 此处,需指示工作流在 ubuntu-latest 上运行此作业。

每个作业都有需要完成的步骤。 在本例中,该步骤使用 actions/checkout@v1 操作签出存储库。 有趣的是 uses: ./action-a 值,这是你在 action.yml 文件中生成的容器操作的路径。 在“什么是 GitHub Actions?”部分中,我们已经查看了 action.yml 文件的内容。

此工作流文件的最后一部分为此工作流设置 MY_NAME 变量值。 回顾一下,容器操作接收了名为 MY_NAME 的输入。

有关工作流语法的详细信息,请参阅 GitHub Actions 的工作流语法

GitHub 托管和自托管运行程序

我们简短地提到过,运行程序与作业有关。 运行程序就是安装了 GitHub Actions 运行程序应用程序的服务器。 在前面的工作流示例中,作业块中有一个 runs-on: ubuntu-latest 属性,它告诉工作流,该作业将使用正在 ubuntu-latest 环境中运行的 GitHub 托管运行器运行。

在运行器方面,有两个选项可供选择:GitHub 托管运行器或自承载运行器。 如果你使用了 GitHub 托管运行器,则每个作业都在虚拟环境的新实例中运行,该实例由你定义的 GitHub 托管运行器类型 runs-on: {operating system-version} 指定。 对于自托管运行程序,你需要应用自托管标签、其操作系统和系统体系结构。 例如,具有 Linux 操作系统和 ARM32 体系结构的自承载运行器将类似于下例:runs-on: [self-hosted, linux, ARM32]

每种类型的运行器都有其各自的优点,但 GitHub 托管的运行器可提供一种更快、更简单的方法来运行工作流,但选项有限。 自托管运行程序是一种高度可配置的方式,可以在你自己的自定义本地环境中运行工作流。 可以在本地或云中运行自承载运行器。 你还可以使用自托管运行程序创建具有更强大的处理能力或更大内存的自定义硬件配置,以运行更大型的作业、安装本地网络可用的软件,并选择 GitHub 托管的运行程序无法提供的操作系统。

GitHub Actions 可能具有使用限制

GitHub Actions 有一些使用限制,具体取决于你的 GitHub 计划,以及你的运行器是 GitHub 托管还是自承载的。 有关用量限制的详细信息,请参阅 GitHub 文档中的用量限制、计费和管理