跳至主要内容

从 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@v4
  with:
    submodules: false

在矩阵中使用环境变量

Travis CI 和 GitHub Actions 都可以在测试矩阵中添加自定义变量,这使您可以在后面的步骤中引用该变量。

在 GitHub Actions 中,您可以使用 include 键将自定义环境变量添加到矩阵。在此示例中,node-version 的矩阵条目都配置为对 sitedatacenter 环境变量使用不同的值。然后,“回显站点详细信息”步骤使用 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 中使用不同的语言时,您可以在作业中创建一个步骤来设置语言依赖项。有关使用特定语言的更多信息,请参阅相应的指南。

执行脚本

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 的主要功能,请参阅“编写工作流”。