Skip to main content

从 Travis CI 迁移到 GitHub Actions

GitHub Actions 和 Travis CI 有多个相似之处,这有助于很简便地迁移到 GitHub Actions。

简介

本指南可帮助您从 Travis CI 迁移到 GitHub Actions。 它会比较它们的概念和语法、描述相似之处,并演示了它们处理常见任务的不同方法。

开始之前

在开始迁移到 GitHub Actions 之前,熟悉其工作原理很有用:

比较作业执行

为了让你控制 CI 任务的执行时间,GitHub Actions 工作流使用默认并行运行的作业 。 每个作业都包含按你定义的顺序执行的步骤。 如果需要为作业运行设置和清理操作,可以在每个作业中定义执行这些操作的步骤。

主要相似之处

GitHub Actions 和 Travis CI 具有某些相似之处,提前了解这些相似之处有助于顺利迁移过程。

Using YAML syntax

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 环境变量使用不同的值。 然后,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 中使用不同语言时,您可以在作业中创建步骤来设置语言依赖项。 有关使用特定语言的信息,请参阅特定指南:

执行脚本

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 构建

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