简介
本指南帮助您从 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@v5
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 计划而异。更多信息请参阅 计费与使用。
在 GitHub Actions 中使用不同语言
在 GitHub Actions 中使用不同语言时,您可以在作业中创建步骤来设置相应语言的依赖。有关使用特定语言的更多信息,请参阅 构建与测试代码。
执行脚本
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@v4
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 构建
Travis CI 使用 Node.js 构建
install:
- npm install
script:
- npm run build
- npm test
GitHub Actions 使用 Node.js 构建的工作流
name: Node.js CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- 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 的主要特性,请参阅 编写工作流。