简介
本指南帮助您从 Travis CI 迁移到 GitHub Actions。它比较了它们的概念和语法,描述了相似之处,并演示了它们对常见任务的不同方法。
开始之前
在开始迁移到 GitHub Actions 之前,熟悉它的工作原理将很有帮助。
- 有关演示 GitHub Actions 作业的快速示例,请参阅“GitHub Actions 快速入门”。
- 要了解 GitHub Actions 的基本概念,请参阅“了解 GitHub Actions”。
比较作业执行
为了让您能够控制 CI 任务的执行时间,GitHub Actions 的 *工作流* 使用 *作业*,这些作业默认情况下会并行运行。每个作业包含 *步骤*,这些步骤按照您定义的顺序执行。如果您需要为作业运行设置和清理操作,可以在每个作业中定义步骤来执行这些操作。
主要相似之处
GitHub Actions 和 Travis CI 有一些相似之处,提前了解这些相似之处可以帮助您顺利完成迁移过程。
使用 YAML 语法
Travis CI 和 GitHub Actions 都使用 YAML 来创建作业和工作流,这些文件存储在代码的存储库中。有关 GitHub Actions 如何使用 YAML 的更多信息,请参阅“了解 GitHub Actions”。
自定义变量
Travis CI 允许您设置变量并在阶段之间共享它们。同样,GitHub Actions 允许您为工作流定义变量。有关更多信息,请参阅“变量”。
默认变量
Travis CI 和 GitHub Actions 都包含默认的环境变量,您可以在 YAML 文件中使用这些变量。对于 GitHub Actions,您可以在“变量”中查看这些变量的列表。
并行作业处理
Travis CI 可以使用 stages
来并行运行作业。同样,GitHub Actions 也并行运行 jobs
。有关更多信息,请参阅“关于工作流”。
状态徽章
Travis CI 和 GitHub Actions 都支持状态徽章,这些徽章可以指示构建是通过还是失败。有关更多信息,请参阅“添加工作流状态徽章”。
使用矩阵
Travis CI 和 GitHub Actions 都支持矩阵,允许您使用操作系统和软件包的组合执行测试。有关更多信息,请参阅“为您的作业使用矩阵”。
下面是一个比较每个系统语法的示例。
Travis CI 矩阵语法
matrix:
include:
- rvm: '2.5'
- rvm: '2.6.3'
GitHub Actions 矩阵语法
jobs:
build:
strategy:
matrix:
ruby: ['2.5', '2.6.3']
针对特定分支
Travis CI 和 GitHub Actions 都允许您将 CI 针对特定分支。有关更多信息,请参阅“GitHub Actions 的工作流程语法”。
以下是每个系统的语法示例。
Travis CI 针对特定分支的语法
branches:
only:
- main
- 'mona/octocat'
GitHub Actions 针对特定分支的语法
on:
push:
branches:
- main
- 'mona/octocat'
检出子模块
Travis CI 和 GitHub Actions 都允许您控制是否将子模块包含在存储库克隆中。
以下是每个系统的语法示例。
Travis CI 检出子模块的语法
git:
submodules: false
GitHub Actions 检出子模块的语法
- uses: actions/checkout@v4
with:
submodules: false
在矩阵中使用环境变量
Travis CI 和 GitHub Actions 都可以在测试矩阵中添加自定义变量,这使您可以在后面的步骤中引用该变量。
在 GitHub Actions 中,您可以使用 `include` 键将自定义环境变量添加到矩阵。在此示例中,`node-version` 的矩阵条目都配置为使用 `site` 和 `datacenter` 环境变量的不同值。然后,`Echo site details` 步骤使用 `env: ${{ matrix.env }}` 来引用自定义变量。
name: Node.js CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
include:
- node-version: '14.x'
site: "prod"
datacenter: "site-a"
- node-version: '16.x'
site: "dev"
datacenter: "site-b"
steps:
- name: Echo site details
env:
SITE: ${{ matrix.site }}
DATACENTER: ${{ matrix.datacenter }}
run: echo $SITE $DATACENTER
GitHub Actions 的关键功能
从 Travis CI 迁移时,请考虑 GitHub Actions 中的以下关键功能。
存储秘密
GitHub Actions 允许您存储秘密并在作业中引用它们。GitHub Actions 组织可以限制哪些存储库可以访问组织秘密。部署保护规则可能需要手动批准才能让工作流程访问环境秘密。有关更多信息,请参阅“在 GitHub Actions 中使用秘密”。
在作业和工作流程之间共享文件
GitHub Actions 包含对工件存储的集成支持,允许您在工作流程中的作业之间共享文件。您还可以保存结果文件并与其他工作流程共享。有关更多信息,请参阅“GitHub Actions 的基本功能”。
托管您自己的运行器
如果您的作业需要特定的硬件或软件,GitHub Actions 允许您托管您自己的运行器并将您的作业发送到它们以进行处理。GitHub Actions 还允许您使用策略来控制这些运行器的访问方式,在组织或存储库级别授予访问权限。有关更多信息,请参阅“托管您自己的运行器”。
并发作业和执行时间
GitHub Actions 中的并发作业和工作流执行时间可能因您的 GitHub 计划而异。有关更多信息,请参阅“使用限制、计费和管理”。
在 GitHub Actions 中使用不同的语言
在 GitHub Actions 中使用不同的语言时,您可以在作业中创建一个步骤来设置语言依赖项。有关使用特定语言的更多信息,请参阅特定指南
- 构建和测试 Node.js
- 构建和测试 Python
- 构建和测试 PowerShell
- 使用 Maven 构建和测试 Java
- 使用 Gradle 构建和测试 Java
- 使用 Ant 构建和测试 Java
执行脚本
GitHub Actions 可以使用 run
步骤来运行脚本或 shell 命令。要使用特定 shell,您可以在提供脚本路径时指定 shell
类型。有关更多信息,请参阅“GitHub Actions 的工作流语法”。
例如
steps:
- name: Run build script
run: ./.github/scripts/build.sh
shell: bash
GitHub Actions 中的错误处理
迁移到 GitHub Actions 时,您可能需要了解不同的错误处理方法。
脚本错误处理
如果其中一个步骤返回错误代码,GitHub Actions 会立即停止作业。有关更多信息,请参阅“GitHub Actions 的工作流语法”。
作业错误处理
GitHub Actions 使用 if
条件语句在特定情况下执行作业或步骤。例如,您可以在另一个步骤导致 failure()
时运行一个步骤。有关更多信息,请参阅“GitHub Actions 的工作流语法”。您还可以使用 continue-on-error
来防止工作流运行在作业失败时停止。
迁移条件语句和表达式的语法
为了在条件表达式下运行作业,Travis CI 和 GitHub Actions 共享类似的if
条件语法。GitHub Actions 允许您使用if
条件来阻止作业或步骤在未满足条件的情况下运行。有关更多信息,请参阅“表达式”。
此示例演示了if
条件如何控制是否执行步骤。
jobs:
conditional:
runs-on: ubuntu-latest
steps:
- run: echo "This step runs with str equals 'ABC' and num equals 123"
if: env.str == 'ABC' && env.num == 123
将阶段迁移到步骤
Travis CI 使用阶段来运行步骤,而 GitHub Actions 则使用步骤来执行操作。您可以在GitHub Marketplace中找到预构建的操作,也可以创建自己的操作。有关更多信息,请参阅“创建操作”。
以下是每个系统的语法示例。
Travis CI 阶段和步骤的语法
language: python
python:
- "3.7"
script:
- python script.py
GitHub Actions 步骤和操作的语法
jobs:
run_python:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-python@v5
with:
python-version: '3.7'
architecture: 'x64'
- run: python script.py
缓存依赖项
Travis CI 和 GitHub Actions 允许您手动缓存依赖项以供以后重复使用。
这些示例演示了每个系统的缓存语法。
Travis CI 缓存语法
language: node_js
cache: npm
GitHub Actions 缓存语法
- name: Cache node modules
uses: actions/cache@v3
with:
path: ~/.npm
key: v1-npm-deps-${{ hashFiles('**/package-lock.json') }}
restore-keys: v1-npm-deps-
常见任务示例
本节比较了 GitHub Actions 和 Travis CI 如何执行常见任务。
配置环境变量
您可以在 GitHub Actions 作业中创建自定义环境变量。
Travis CI 环境变量语法
env:
- MAVEN_PATH="/usr/local/maven"
具有环境变量的 GitHub Actions 工作流程
jobs:
maven-build:
env:
MAVEN_PATH: '/usr/local/maven'
使用 Node.js 构建
使用 Node.js 构建的 Travis CI
install:
- npm install
script:
- npm run build
- npm test
使用 Node.js 构建的 GitHub Actions 工作流程
name: Node.js CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: '16.x'
- run: npm install
- run: npm run build
- run: npm test
下一步
要继续学习有关 GitHub Actions 主要功能的更多信息,请参阅“了解 GitHub Actions”。