引言
在开发者的工作中,编写代码是最重要的任务。然而,有时候他们也需要处理非核心或重复性的任务。为了节省开发人员的时间,自动化重复性任务是非常必要的。通过自动化任务,我们可以提高开发人员的生产力。
随着持续集成 / 持续部署 (CI/CD) 流程的兴起,自动化任务的过程变得比以往更加简单。通过 CI, 我们可以将代码集成到共享存储库中,并运行自动化测试以及早地发现错误。与此同时,CD 则可以根据代码和环境变量的变化自动化部署过程。其目标是交付快速可靠的代码。
GitHub 也推出了一个名为 GitHub Actions 的 CI/CD 流程来自动化任务。它旨在帮助开发人员自动化软件开发生命周期。所以,今天我们将深入了解 GitHub Actions 的不同方面。
让我们开始吧。
GitHub Actions
GitHub Action 最早于 2018 年宣布,并在 2019 年作为一个 CI/CD 流程公开可用,用于直接从 GitHub 存储库中自动化软件开发生命周期的各个方面。用于自动化的代码定义在一个 YAML 文件中。YAML 是一种人类可读的数据序列化语言,可用于编写配置文件。
触发 GitHub Action 的方式可以是拉取 (pull)、推送 (push) 或其他外部触发器。您可以使用 GitHub Actions 来运行构建、测试或部署网站等任务。
让我们创建一个 GitHub Action 来更好地理解它。
创建 GitHub Actions
创建 GitHub Action 非常简单。在 GitHub 页面或本地存储库上,创建一个名为.github/workflows 的目录。在创建的目录中,您可以创建一个任意命名的 YAML 文件。YAML 文件的扩展名为.yml。因此,文件的名称可以是 name.yml。
YAML 文件的基本结构
在顶部,我们需要使用 YAML 文件中的 name 关键字提供 Action 的名称。
1 | name: GitHub Actions |
之后,我们可以添加触发器。触发器可以是拉取、推送或定时触发。要定义触发器,我们使用关键字 on。
对于 GitHub 定义的事件,例如推送,您可以使用以下语法。您还可以添加多个触发器。
1 | # 单个触发器 |
可以在这里查看可以触发工作流的所有事件。
要定时触发,我们可以使用 schedule 关键字和 cron 表达式。
1 | on: |
Cron 表达式可以分解为以下部分:
0
: 第一个字段是分钟。它表示每小时的第 0 分钟运行。*/12
: 它表示小时字段。它将每 12 小时运行一次。*/12
表示每 12 小时运行一次,而只指定12
会导致在上午 12 点和下午 12 点运行任务。您还可以使用 24 小时制的时间,例如 23 表示晚上 11 点。*
: 它是运行的日字段。将每天运行。*
: 下一个星号是月份。它将每个月运行一次。*
: 最后一个星号定义了星期几。它表示每个工作日运行。它以数字形式表示星期几,星期日是一周的第一天,值为 0。使用逗号分隔不同的星期几,例如0,2,3
。
因此,较简单的语法可以写为:
1 | cron: "分钟 小时 日 月 星期几" |
现在,是时候添加实际的功能了,在触发工作流时运行的功能。YAML 中的 jobs 关键字用于定义不同的作业。
让我们先来看看完整的语法,然后再详细了解它:
1 | jobs: |
build 是作业的名称。其中,runs-on 定义了作业将运行的机器。您可以在这里找到完整的运行器列表。
现在,我们有了至关重要的 steps 关键字,用于定义运行工作流时应执行的所有步骤。您可以按顺序定义各个步骤,主要使用 name 和 uses 这两个关键字。name 关键字用于为工作流中的特定步骤提供描述性名称,而 uses 关键字用于定义应运行以执行任务的操作或 Docker 容器。
第一步使用了 actions/checkout 操作,它将获取存储库、检查引用 (如分支、标签或提交 SHA) 并准备后续步骤的工作区。接下来的步骤是使用所需的工具设置。在我们的例子中,我们使用的是 Node.js。之后,我们运行了一个命令来安装依赖项。
最后一步是实际运行代码,产生输出。在我们的例子中,我们使用 npm test 命令来运行测试。您也可以运行存储库中存在的任何 Node.js 文件。
1 | - name: Update README |
现在,完整的 YAML 文件的代码如下:
1 | name: GitHub Actions |
调试和故障排除
在编写 GitHub Actions 时,您可能会遇到诸如作业执行失败或语法无效等错误。由于 YAML 没有内置的调试器,因此调试任何错误变得具有挑战性。但是,有一些方法和工具可以帮助您调试 GitHub Actions。以下是一些方法:
GitHub Actions 扩展:GitHub 为 VS Code 提供了官方的 Actions 扩展。它可以帮助您管理和运行 Actions。它的验证和代码补全功能可以帮助您编写正确的语法。您可以从这里获取该扩展。
条件调试: 这种方法不仅适用于 YAML, 也适用于其他编程语言。通过使用条件来有选择性地启用步骤运行,可以帮助您找到错误的位置。您可以使用
if
条件来进行测试。工作流日志:GitHub 在运行 GitHub Actions 时会生成日志。这些日志详细说明了每个步骤的执行情况。它可以帮助您了解哪些步骤失败了。您可以通过单击存储库中的 “Actions” 选项卡来查看日志。
Act : 这是一个终端,可帮助您在本地运行 GitHub Actions。它可以帮助您在 GitHub 之前先在本地测试 Actions, 然后再将其推送到 GitHub。这样可以节省时间,因为您不必每次都推送 / 分叉 / 拉取来触发 Actions。您可以在这里查看其存储库。
使用 GitHub Actions 的好处
使用 GitHub Actions 有以下一些好处:
定时作业:GitHub Actions 可以执行定时作业。您可以定义代码并使用 GitHub Actions 在特定时间段运行它。
丰富的生态系统:GitHub 为您提供了与 Git 集成的生态系统,可以帮助您轻松地将 Actions 整合到工作流中。关于拉取、推送或分叉的触发器可以轻松地在 GitHub 上使用。此外,GitHub 还有一个市场,提供了许多有用的预构建 Action。
可扩展性: 正如您所知,GitHub 可以管理从小型到大型项目的项目。除此之外,GitHub 允许创建多个工作流和 Actions, 以根据触发器触发不同的作业。
安全性: 您可以在存储库设置中定义 GitHub Secrets, 例如 API 密钥。YAML 文件将访问这些秘密。这样使用环境变量就更加安全。可以使用以下代码访问该秘密:
1 | - name: Update README |
结论
正如我们在本文中所看到的,GitHub Actions 可以根据您的需求执行各种任务。我们详细了解了 Actions 的概念,学习了定义 Actions 的语法和流程。最后,我们还了解了使用 GitHub Actions 的一些好处。市场使得快速添加预构建的 Actions 到您的工作流程变得更加容易。
希望本文对您理解 GitHub Actions 有所帮助。感谢阅读本文