引言

在开发者的工作中,编写代码是最重要的任务。然而,有时候他们也需要处理非核心或重复性的任务。为了节省开发人员的时间,自动化重复性任务是非常必要的。通过自动化任务,我们可以提高开发人员的生产力。

随着持续集成 / 持续部署 (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 的名称。

plaintext
1
name: GitHub Actions

之后,我们可以添加触发器。触发器可以是拉取、推送或定时触发。要定义触发器,我们使用关键字 on。

对于 GitHub 定义的事件,例如推送,您可以使用以下语法。您还可以添加多个触发器。

plaintext
1
2
3
4
5
# 单个触发器
on: [push]

# 多个触发器
on: [push, fork]

可以在这里查看可以触发工作流的所有事件。

要定时触发,我们可以使用 schedule 关键字和 cron 表达式。

plaintext
1
2
3
on:
schedule:
- cron: "0 */12 * * *"

Cron 表达式可以分解为以下部分:

  • 0: 第一个字段是分钟。它表示每小时的第 0 分钟运行。
  • */12: 它表示小时字段。它将每 12 小时运行一次。*/12 表示每 12 小时运行一次,而只指定 12 会导致在上午 12 点和下午 12 点运行任务。您还可以使用 24 小时制的时间,例如 23 表示晚上 11 点。
  • *: 它是运行的日字段。将每天运行。
  • *: 下一个星号是月份。它将每个月运行一次。
  • *: 最后一个星号定义了星期几。它表示每个工作日运行。它以数字形式表示星期几,星期日是一周的第一天,值为 0。使用逗号分隔不同的星期几,例如 0,2,3

因此,较简单的语法可以写为:

plaintext
1
cron: "分钟 小时 日 月 星期几"

现在,是时候添加实际的功能了,在触发工作流时运行的功能。YAML 中的 jobs 关键字用于定义不同的作业。

让我们先来看看完整的语法,然后再详细了解它:

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2

- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: '14'

- name: Install dependencies
run: npm install

- name: Run tests
run: npm test

build 是作业的名称。其中,runs-on 定义了作业将运行的机器。您可以在这里找到完整的运行器列表。

现在,我们有了至关重要的 steps 关键字,用于定义运行工作流时应执行的所有步骤。您可以按顺序定义各个步骤,主要使用 name 和 uses 这两个关键字。name 关键字用于为工作流中的特定步骤提供描述性名称,而 uses 关键字用于定义应运行以执行任务的操作或 Docker 容器。

第一步使用了 actions/checkout 操作,它将获取存储库、检查引用 (如分支、标签或提交 SHA) 并准备后续步骤的工作区。接下来的步骤是使用所需的工具设置。在我们的例子中,我们使用的是 Node.js。之后,我们运行了一个命令来安装依赖项。

最后一步是实际运行代码,产生输出。在我们的例子中,我们使用 npm test 命令来运行测试。您也可以运行存储库中存在的任何 Node.js 文件。

plaintext
1
2
- name: Update README
run: node update-readme.js

现在,完整的 YAML 文件的代码如下:

yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
name: GitHub Actions

on:
schedule:
- cron: "0 */12 * * *"

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2

- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: '14'

- name: Install dependencies
run: npm install

- name: Run tests
run: npm test

调试和故障排除

在编写 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 文件将访问这些秘密。这样使用环境变量就更加安全。可以使用以下代码访问该秘密:

plaintext
1
2
3
4
- name: Update README
run: node update-readme.js
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

结论

正如我们在本文中所看到的,GitHub Actions 可以根据您的需求执行各种任务。我们详细了解了 Actions 的概念,学习了定义 Actions 的语法和流程。最后,我们还了解了使用 GitHub Actions 的一些好处。市场使得快速添加预构建的 Actions 到您的工作流程变得更加容易。

希望本文对您理解 GitHub Actions 有所帮助。感谢阅读本文