在当今的 DevOps 环境中,自动化是开发团队能够更快地交付功能并维护高质量代码库的关键。这就是像 GitHub Actions 这样的工具变得不可或缺的地方,因为它能够直接在存储库中自动化、自定义和执行 GitHub 工作流程。
当然,随着项目的规模和存储库数量的增加,在所有项目之间保持一致和高效的工作流程成为一项重大挑战。这就是 GitHub 可重用工作流的用武之地,它改变了我们处理 CI/CD pipline 的方式。
可重用的工作流程提供了一种跨多个项目轻松优化、标准化和扩展我们的流程的方法。通过将通用工作流封装到可重用的模板中,我们可以减少冗余,最大限度地减少错误,并确保整个组织都遵循最佳实践。
这篇博文将探讨 GitHub 可重用工作流、它们的优势,以及如何构建它们并将其集成到开发流程中。无论是管理少量存储库还是监督大量项目,学习在 GitHub Actions 中创建可重用的工作流程都可以改变团队的生产力和代码质量。
了解 GitHub 可重用工作流
GitHub 可重用工作流是 YAML 定义的工作流,可以在多个存储库之间共享和调用。它们将一组作业和步骤(例如测试、构建或部署)封装到一个可重用的文件中。这种方法允许团队通过在不同项目中引用相同的工作流程来保持一致性并减少重复。
为什么要使用可重用的工作流程?
在多个存储库具有相似 CI/CD 需求的环境中,GitHub Actions 可重用工作流消除了重复工作流代码的冗余。通过定义一次工作流程并在其他位置引用它,更新和更改会自动传播到所有依赖存储库。
这减少了重复性任务并确保了统一的方法,这对于旨在在众多存储库中实施一致标准的组织尤其有价值。
GitHub 可重用工作流的工作原理是什么?
可重用工作流利用 workflow_call 事件,允许一个 GitHub 工作流触发另一个 GitHub 工作流。此机制使工作流能够接受输入并提供输出,其方式与可调用函数相同。与执行单个任务的独立操作不同,可重用工作流可以包含整个pipline 并与 GitHub 的 YAML 配置无缝集成,从而提供灵活的模块化工作流程管理方法。
可重用工作流的主要优势
使用 GitHub Actions 可重用工作流带来了一些关键优势,可增强 CI/CD pipline。
效率
它们消除了跨项目重复 GitHub 工作流的需要,从而节省了时间并减少了冗余。通过标准化测试和部署等任务,团队可以更专注于开发,而不是重复配置。
改进维护
集中工作流逻辑可简化更新和错误修复。对 GitHub 可重用工作流所做的更改会自动应用于所有相关项目,从而确保一致性并减少维护所需的工作量。
可扩展性和灵活性
GitHub 中的可重用工作流允许针对特定项目需求进行自定义,同时保持一致的基本结构,从而支持可扩展性。这种灵活性使得在添加新项目时可以轻松采用标准化工作流程。
增强的协作
一致的工作流程有助于更好的团队协作并简化入职流程。它们有效地缩短了新团队成员的学习曲线,帮助他们更有效地融入项目。
可重用工作流的限制和注意事项
虽然 GitHub 可重用工作流提供了显著的好处,但它们也有一些限制需要考虑。
配置复杂性
为不同的环境配置可重用的工作流程可能很复杂。处理环境变量和密钥的限制需要仔细规划,以确保工作流在各种项目中正常运行。
依赖项管理
管理跨 GitHub 工作流的依赖项至关重要,尤其是在复杂的设置中。如果没有适当的策略,可能会出现冲突,从而导致执行失败。实施有效的依赖关系解析对于顺利的工作流操作至关重要。
版本控制挑战
保持稳定性需要对可重用工作流进行适当的版本控制。否则,更新可能会无意中中断依赖的工作流程。特定标签或提交哈希有助于控制使用的版本,从而确保可预测性和稳定性。
在 GitHub Actions 中构建可重用的工作流程:分步指南
现在,我们来演练如何在 GitHub Actions 中创建可重用的工作流程。
创建基本工作流程
您首先需要在仓库中创建标准 GitHub 工作流程。因此,前往 .github/workflows/ 目录并创建一个名为 ci-pipeline.yml 的新 YAML 文件:
name: CI Pipeline
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
– name: Checkout code
uses: actions/checkout@v3
– name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: ’14’
– name: Install dependencies
run: npm install
– name: Run tests
run: npm test
此基本工作流程在每次推送到主分支时运行,执行代码签出、设置 Node.js、安装依赖项和运行测试。
添加环境变量和 secret
您可以添加环境变量和密钥,使工作流程更加动态。环境变量在 env 部分中定义,而 secret 安全地存储在存储库或组织设置中:
env:
NODE_ENV: production
jobs:
build:
steps:
– name: Deploy
env:
API_KEY: ${{ secrets.API_KEY }}
run: npm run deploy
在此代码段中,Node.js 应用程序的当前环境是 production,而 API 密钥将从存储库的密钥中检索。请记住,密钥不会暴露在日志或输出中,从而确保敏感数据保持安全。
将标准工作流程转换为可重用的工作流程
要将工作流程转换为 GitHub Action 可重用工作流程,请修改 on 部分以使用 workflow_call 并定义工作流程所需的任何输入。
name: CI Pipeline
on:
workflow_call:
inputs:
node-version:
description: ‘Node.js version’
required: true
type: string
run-tests:
description: ‘Flag to run tests’
required: false
type: boolean
default: true
jobs:
build:
runs-on: ubuntu-latest
steps:
– name: Checkout code
uses: actions/checkout@v3
– name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: ${{ inputs[‘node-version’] }}
– name: Install dependencies
run: npm install
– name: Run tests
if: ${{ inputs[‘run-tests’] }}
run: npm test
通过引入输入,您可以启用调用此可重用工作流的任何工作流,以轻松定制其操作。在此示例中,node-version 和 run-tests 是控制Node.js 版本以及是否应运行测试的输入。
使用 workflow_call 实现可重用性
在 call-workflow 部分中,您将使用 uses 关键字指定可重用工作流并提供其所需的输入。通过这样做,您可以触发可重用工作流以使用您选择的参数运行,从而有效地根据当前项目的需要定制其执行:
name:使用可重用工作流
on:
push:
branches: [ main ]
jobs:
call-workflow:
uses: your-org/your-repo/.github/workflows/ci-pipeline.yml@v1
with:
node-version: ’16’
run-tests: false
在这里,我们将 node-version 指定为 16 并将 run-tests 设置为 false,以说明如何根据项目的当前优先级调整工作流的环境和行为,无论是更新运行时还是暂时跳过测试以加速反馈。
测试和验证可重用工作流
在多个项目中推出可重用工作流之前,必须对其进行全面测试。因此,在创建测试存储库以使用各种输入和场景调用工作流后,请验证:
- 输入得到正确处理
- 步骤按预期执行
- 密钥和环境变量已正确访问
- 边缘情况和错误条件得到妥善管理
此外,请考虑为可重用工作流实施自动化测试。虽然测试 GitHub 工作流可能具有挑战性,但您可以使用 act 等工具在本地运行工作流,或设置 CI pipline 来验证对工作流的更改。
投入时间进行测试可确保可重用工作流程稳健可靠,从而降低其他项目采用它们时出现问题的可能性。
比较:可重用工作流、自定义操作与复合操作
了解可重用工作流、自定义操作和复合操作之间的区别将有助于您选择适合您需求的工具。
功能 | 可重用的工作流程 | 定义操作 | 复合操作 |
定义 | 可由其他工作流调用的完整工作流,包括作业和步骤 | 可由其他工作流调用的完整工作流,包括作业和步骤 | 多个操作合并为一个操作,在 YAML 中定义 |
优势 | 封装整个工作流,支持多个作业,并保持存储库之间的一致性 | 高度可定制,可以执行复杂的任务,并支持任何语言/运行时 | 通过组合步骤简化复杂的工作流程,易于创建和维护 |
局限性 | 管理可能很复杂,在跨存储库处理密钥和环境变量方面受到限制 | 需要更多的设置和维护,可能需要手动管理依赖项 | 仅限于组合现有操作,不如自定义操作灵活 |
最佳用例 | 跨多个项目标准化 CI/CD pipline | 当您需要具有自定义逻辑的可重用组件时 | 简化工作流中的重复性任务 |
使用 Incredibuild 简化 GitHub 可重用工作流程
Incredibuild 是一个开发加速平台,它通过在多台机器(本地或云端)分配任务来加快开发流程。它通过并行执行和分布式构建来增强 DevOps 流程,从而显著缩短构建时间。
通过利用整个网络中的空闲 CPU 周期,Incredibuild 将构建机器转变为具有计算能力的私有云。这种加速适用于各种构建工具和编译器,使其成为 CI/CD 工具包的多功能补充。
要将 Incredibuild 与工作流程无缝集成,了解 GitHub Actions 架构的基础知识至关重要。无论您是将 GitLab 与 GitHub 进行比较以满足 CI/CD 需求,还是深入研究特定语言的高级工具,Incredibuild 都能为涉及计算密集型任务的工作流提供卓越的加速。
对于使用 C++ 的开发人员来说,利用 C++ GitHub 工作流可以显著缩短构建时间并提高效率。Incredibuild 在多台机器之间分配任务的能力使其成为 C++ 构建的游戏规则改变者,其中较长的编译时间是常见的瓶颈。
通过集成 Incredibuild,您可以实现更快的反馈循环和更好的资源利用率,使团队能够更智能地工作并更快地交付结果。
将 Incredibuild 与可重用工作流集成
要将 Incredibuild 与 GitHub 可重用工作流集成,请执行以下步骤:
- 设置 Incredibuild 协调器和代理:安装 Incredibuild 协调器,并在构建计算机上设置 Initiator 和 Helper Agent。
- 配置自托管运行器: 如果使用自托管运行器,请在这些计算机上安装 Incredibuild,并将它们与 Incredibuild 协调器关联。
- 修改工作流 YAML:更新工作流 YAML 文件以包含调用 Incredibuild 命令的步骤。例如:
jobs:
build:
runs-on: self-hosted
steps:
– name: Checkout code
uses: actions/checkout@v3
– name: Build with Incredibuild
run: ib_console build.sln /build
此配置签出代码并使用 Incredibuild 构建解决方案文件。
将 Incredibuild 与可重用工作流程结合使用的好处
将 Incredibuild 与 GitHub 可重用工作流相结合具有多项优势:
- 加快构建时间:通过在多个代理之间分配任务,Incredibuild 缩短了构建时间,从而加快了反馈循环。
- 优化资源利用率:Incredibuild 可有效利用现有基础设施,最大限度地减少空闲时间并最大限度地提高吞吐量。
- 可扩展性:随着项目的增长,Incredibuild 会随着基础设施而扩展,从而保持性能和可靠性。
Incredibuild 集成可增强构建性能并简化开发流程,使团队能够更快地交付高质量的软件。
结论
GitHub 可重用工作流是一项强大的功能,可以通过提高效率、一致性和协作来显著改进 CI/CD pipline。将通用流程封装到可重用的模板中可以减少冗余,并有助于在所有项目中遵守最佳实践。
当与 Incredibuild 等工具结合使用时,可以进一步增强工作流程,以实现更快的构建和部署。这种集成可最大限度地提高资源利用率并加速反馈循环,使团队能够快速响应不断变化的需求。
立即免费试用 Incredibuild,采用 GitHub Actions 可重用工作流,并改变管理 CI/CD pipline 的方式。