跳至主要内容

从 Travis CI 迁移到 GitHub Actions

GitHub Actions 与 Travis CI 具有多项相似之处,这使得迁移到 GitHub Actions 相对简单。

简介

本指南帮助您从 Travis CI 迁移到 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 的矩阵条目分别配置了不同的 sitedatacenter 环境变量值。随后,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 的主要特性,请参阅 编写工作流

© . This site is unofficial and not affiliated with GitHub, Inc.