关于工作流
**工作流**是一个可配置的自动化流程,它将运行一个或多个作业。工作流由一个检入到存储库的 YAML 文件定义,并在存储库中发生事件时触发运行,或者可以手动触发,或者按照定义的计划触发。
工作流在存储库的.github/workflows
目录中定义。一个存储库可以有多个工作流,每个工作流都可以执行不同的任务集,例如
- 构建和测试拉取请求。
- 每次创建发布时都部署您的应用程序。
- 每当打开新问题时添加标签。
工作流基础知识
工作流必须包含以下基本组件
- 一个或多个将触发工作流的事件。
- 一个或多个作业,每个作业将在运行器机器上执行并运行一系列一个或多个步骤。
- 每个步骤都可以运行您定义的脚本或运行操作,操作是可重用的扩展,可以简化您的工作流。
有关这些基本组件的更多信息,请参阅“了解 GitHub Actions”。
触发工作流
工作流触发器是导致工作流运行的事件。这些事件可以是
- 工作流存储库中发生的事件
- 在 GitHub 外部发生的事件并在 GitHub 上触发
repository_dispatch
事件 - 计划时间
- 手动
例如,您可以配置您的工作流,使其在将推送内容推送到存储库的默认分支时、创建发布时或打开问题时运行。
有关更多信息,请参阅“触发工作流”,以及有关事件完整列表的信息,请参阅“触发工作流的事件”。
工作流语法
工作流使用 YAML 定义。有关编写工作流的 YAML 语法完整参考,请参阅“GitHub Actions 的工作流语法”。
有关管理工作流运行的更多信息,例如重新运行、取消或删除工作流运行,请参阅“管理工作流运行和部署”。
使用工作流模板
GitHub 提供预配置的工作流模板,您可以按原样使用或自定义这些模板来创建您自己的工作流。GitHub 会分析您的代码并向您显示可能对您的存储库有用的工作流模板。例如,如果您的存储库包含 Node.js 代码,您将看到有关 Node.js 项目的建议。
这些工作流模板旨在帮助您快速入门,提供一系列配置,例如
将这些工作流用作构建自定义工作流的起点,或按原样使用它们。您可以在actions/starter-workflows存储库中浏览工作流模板的完整列表。有关更多信息,请参阅“使用工作流模板”。
高级工作流功能
本节简要介绍了 GitHub Actions 的一些高级功能,这些功能可以帮助您创建更复杂的工作流。
存储机密
如果您的工作流使用敏感数据(例如密码或证书),您可以将这些数据作为机密保存在 GitHub 中,然后在工作流中将其用作环境变量。这意味着您将能够创建和共享工作流,而无需将敏感值直接嵌入到工作流的 YAML 源代码中。
此示例作业演示了如何将现有机密作为环境变量引用,并将其作为参数发送到示例命令。
jobs:
example-job:
runs-on: ubuntu-latest
steps:
- name: Retrieve secret
env:
super_secret: ${{ secrets.SUPERSECRET }}
run: |
example-command "$super_secret"
有关更多信息,请参阅“在 GitHub Actions 中使用机密”。
创建依赖作业
默认情况下,工作流中的所有作业都同时并行运行。如果您有一个作业必须在另一个作业完成后才能运行,则可以使用needs
关键字创建此依赖关系。如果其中一个作业失败,则所有依赖作业都将跳过;但是,如果您需要作业继续,则可以使用if
条件语句进行定义。
在此示例中,setup
、build
和test
作业按顺序运行,build
和test
依赖于其前面作业的成功完成
jobs:
setup:
runs-on: ubuntu-latest
steps:
- run: ./setup_server.sh
build:
needs: setup
runs-on: ubuntu-latest
steps:
- run: ./build_server.sh
test:
needs: build
runs-on: ubuntu-latest
steps:
- run: ./test_server.sh
有关更多信息,请参阅“在工作流中使用作业”。
使用矩阵
矩阵策略允许您在一个作业定义中使用变量来自动创建多个基于变量组合的作业运行。例如,您可以使用矩阵策略在多种语言版本或多个操作系统上测试您的代码。矩阵是使用strategy
关键字创建的,该关键字将构建选项作为数组接收。例如,此矩阵将多次运行作业,使用不同的 Node.js 版本
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node: [14, 16]
steps:
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
有关更多信息,请参阅“在工作流中运行作业的变体”。
缓存依赖项
如果您的作业定期重用依赖项,您可以考虑缓存这些文件以帮助提高性能。创建缓存后,它将可用于同一存储库中的所有工作流。
此示例演示了如何缓存~/.npm
目录
jobs:
example-job:
steps:
- name: Cache node modules
uses: actions/cache@v3
env:
cache-name: cache-node-modules
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
有关更多信息,请参阅“缓存依赖项以加快工作流速度”。
使用数据库和服务容器
如果您的作业需要数据库或缓存服务,您可以使用services
关键字创建短暂容器来托管服务;生成的容器随后将可用于该作业中的所有步骤,并在作业完成后删除。此示例演示了作业如何使用services
创建postgres
容器,然后使用node
连接到服务。
jobs:
container-job:
runs-on: ubuntu-latest
container: node:20-bookworm-slim
services:
postgres:
image: postgres
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: Install dependencies
run: npm ci
- name: Connect to PostgreSQL
run: node client.js
env:
POSTGRES_HOST: postgres
POSTGRES_PORT: 5432
有关更多信息,请参阅“使用容器化服务”。
使用标签路由工作流
如果您希望确保特定类型的运行器将处理您的作业,则可以使用标签来控制作业执行的位置。除了其默认标签self-hosted
之外,您还可以将标签分配给自托管运行器。然后,您可以在 YAML 工作流中引用这些标签,确保作业以可预测的方式路由。GitHub 托管的运行器具有分配的预定义标签。
此示例显示了工作流如何使用标签指定所需的运行器
jobs:
example-job:
runs-on: [self-hosted, linux, x64, gpu]
工作流将仅在具有runs-on
数组中所有标签的运行器上运行。该作业将优先转到具有指定标签的空闲自托管运行器。如果不可用并且存在具有指定标签的 GitHub 托管运行器,则该作业将转到 GitHub 托管运行器。
要了解有关自托管运行器标签的更多信息,请参阅“将标签与自托管运行器一起使用”。
要了解有关 GitHub 托管运行器标签的更多信息,请参阅“使用 GitHub 托管的运行器”。
重用工作流
您可以在一个工作流中调用另一个工作流。这使您可以重用工作流,避免重复并使您的工作流更易于维护。有关更多信息,请参阅“重用工作流”。
工作流的安全强化
GitHub 提供安全功能,您可以使用这些功能来提高工作流的安全性。您可以使用 GitHub 的内置功能来确保您收到有关您使用的操作中漏洞的通知,或自动执行使工作流中的操作保持最新的过程。有关更多信息,请参阅“使用 GitHub 的安全功能来保护您对 GitHub Actions 的使用”。
使用环境
您可以使用环境配置保护规则和机密来控制工作流中作业的执行。工作流中的每个作业都可以引用单个环境。在将引用环境的作业发送到运行器之前,必须通过为该环境配置的任何保护规则。有关更多信息,请参阅“管理部署环境”。