# 从 Travis CI 迁移到 GitHub Actions

GitHub Actions 和 Travis CI 共享多个相似之处，这有助于使其相对简单地迁移到 GitHub Actions。

## 简介

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

## 开始之前

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

* 要快速查看一个演示 GitHub Actions 作业的示例，请参阅 [GitHub Actions快速入门](/zh/actions/get-started/quickstart)。
* 若要了解基本 GitHub Actions 概念，请参阅 [使用工作流工件存储和共享数据](/zh/actions/tutorials/store-and-share-data#passing-data-between-jobs-in-a-workflow)。

## 比较作业执行

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

## 主要相似之处

GitHub Actions Travis CI 共享某些相似之处，并提前了解这些相似之处有助于顺利完成迁移过程。

### 使用 YAML 语法

Travis CI 并使用 GitHub Actions YAML 创建作业和工作流，这些文件存储在代码的存储库中。 有关如何使用 YAML 的详细信息 GitHub Actions ，请参阅 [创建示例工作流](/zh/actions/tutorials/create-an-example-workflow)。

### 自定义变量

Travis CI 支持设置变量并在各个阶段之间共享它们。 同样， GitHub Actions 允许为工作流定义变量。 有关详细信息，请参阅“[在变量中存储信息](/zh/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables)”。

### 默认变量

Travis CI 和 GitHub Actions 两者都包含可在 YAML 文件中使用的默认环境变量。 对于 GitHub Actions，可以看到 [变量参考](/zh/actions/reference/workflows-and-actions/variables#default-environment-variables) 中列出的这些内容。

### 并行任务处理

Travis CI 可以使用 `stages` 并行运行作业。 同样， GitHub Actions 并行运行 `jobs` 。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idneeds)”。

### 状态徽章

Travis CI 和 GitHub Actions 都支持状态徽章，可用于表明构建是成功还是失败。
有关详细信息，请参阅“[添加工作流状态徽章](/zh/actions/how-tos/monitor-workflows/add-a-status-badge)”。

### 使用矩阵

Travis CI 和 GitHub Actions 两者都支持矩阵，允许你使用操作系统和软件包的组合来执行测试。 有关详细信息，请参阅“[在工作流中运行作业变体](/zh/actions/how-tos/write-workflows/choose-what-workflows-do/run-job-variations)”。

下面的示例比较每个系统的语法。

#### Travis CI 的矩阵语法

```yaml
matrix:
  include:
    - rvm: '2.5'
    - rvm: '2.6.3'
```

#### GitHub Actions 矩阵的语法

```yaml
jobs:
  build:
    strategy:
      matrix:
        ruby: ['2.5', '2.6.3']
```

### 定向特定分支

Travis CI 和 GitHub Actions 两者都允许将 CI 定向到特定分支。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax#onpushbranchestagsbranches-ignoretags-ignore)”。

下面是每个系统的语法示例：

#### Travis CI 定向特定分支的语法

```yaml
branches:
  only:
    - main
    - 'mona/octocat'
```

#### GitHub Actions 面向特定分支的语法

```yaml
on:
  push:
    branches:
      - main
      - 'mona/octocat'
```

### 检出子模块

Travis CI 和 GitHub Actions 两者都允许你控制子模块是否包含在存储库克隆中。

下面是每个系统的语法示例：

#### Travis CI 的语法用于检出子模块

```yaml
git:
  submodules: false
```

#### GitHub Actions 用于签出子模块的语法

```yaml
- uses: actions/checkout@v6
  with:
    submodules: false
```

### 在矩阵中使用环境变量

Travis CI 和 GitHub Actions 都可以向测试矩阵中添加自定义变量，这样你就可以在后续步骤中引用该变量。

在 GitHub Actions 中，可以使用 `include` 键将自定义环境变量添加到矩阵中。 在此示例中，`node-version` 的每个矩阵条目都配置为对 `site` 和 `datacenter` 环境变量使用不同的值。 然后，`Echo site details` 步骤使用 `env: ${{ matrix.env }}` 来引用自定义变量：

```yaml
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 组织可以限制哪些存储库可以访问组织机密。 部署保护规则可能需要手动批准工作流才能访问环境机密。 有关详细信息，请参阅“[机密](/zh/actions/concepts/security/secrets)”。

### 在作业和工作流程之间共享文件

GitHub Actions 集成了对制品存储的支持，使你能够在工作流中的作业之间共享文件。 您还可以保存生成的文件，并与其他工作流程共享它们。 有关详细信息，请参阅“[了解GitHub Actions](/zh/actions/get-started/understand-github-actions)”。

### 托管您自己的运行器

如果您的作业需要特定的硬件或软件，GitHub Actions 允许您托管自己的运行器，并将作业发送到这些运行器进行处理。
GitHub Actions 还允许你使用策略来控制对这些运行器的访问方式，并在组织或仓库级别授予访问权限。 有关详细信息，请参阅“[使用自承载运行器](/zh/actions/how-tos/manage-runners/self-hosted-runners)”。

### 并行作业和执行时间

在 GitHub Actions 中，并发作业数和工作流执行时间可能会因您的 GitHub 套餐而异。 有关详细信息，请参阅“[计费和使用情况](/zh/actions/concepts/billing-and-usage)”。

### 在 GitHub Actions 中使用不同语言

使用不同语言 GitHub Actions时，可以在作业中创建一个步骤来设置语言依赖项。 有关使用特定语言的信息，请参阅“[构建和测试代码](/zh/actions/tutorials/build-and-test-code)”。

## 执行脚本

GitHub Actions 可以使用 `run` 步骤来运行脚本或 shell 命令。 若要使用特定的 shell，可以在提供脚本路径时指定 `shell` 类型。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsrun)”。

例如：

```yaml
steps:
  - name: Run build script
    run: ./.github/scripts/build.sh
    shell: bash
```

## GitHub Actions中的错误处理

迁移到 GitHub Actions时，可能需要注意不同的错误处理方法。

### 脚本错误处理

GitHub Actions 如果其中一个步骤返回错误代码，则立即停止作业。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax#exit-codes-and-error-action-preference)”。

### 作业错误处理

GitHub Actions 在某些情况下，使用 `if` 条件来执行作业或步骤。 例如，你可以在某个步骤导致 `failure()` 时运行另一个步骤。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax#example-using-status-check-functions)”。 还可以使用 [`continue-on-error`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idcontinue-on-error) 防止工作流在作业失败时停止运行。

## 将条件和表达式的语法进行转换

若要在条件表达式下运行作业，Travis CI 并 GitHub Actions 共享类似的 `if` 条件语法。               通过 GitHub Actions，可以使用 `if` 条件来使作业或步骤仅在满足条件时才运行。 有关详细信息，请参阅“[对工作流和操作中的表达式求值](/zh/actions/reference/workflows-and-actions/expressions)”。

此示例演示 `if` 条件如何控制是否执行步骤：

```yaml
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](https://github.com/marketplace?type=actions)查找预生成操作，也可以创建自己的操作。 有关详细信息，请参阅“[重用自动化](/zh/actions/how-tos/reuse-automations)”。

下面是每个系统的语法示例：

### Travis CI 的阶段和步骤语法

```yaml
language: python
python:
  - "3.7"

script:
  - python script.py
```

### GitHub Actions 步骤和操作的语法

```yaml
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 的缓存语法

```yaml
language: node_js
cache: npm
```

### 用于缓存的GitHub Actions语法

```yaml
- 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 环境变量的语法规则

```yaml
env:
  - MAVEN_PATH="/usr/local/maven"
```

#### GitHub Actions 具有环境变量的工作流

```yaml
jobs:
  maven-build:
    env:
      MAVEN_PATH: '/usr/local/maven'
```

### 使用 Node.js 构建

#### Travis CI 中使用 Node.js 构建

```yaml
install:
  - npm install
script:
  - npm run build
  - npm test
```

#### GitHub Actions 用于使用 Node.js 进行构建的工作流

```yaml
name: Node.js CI
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Use Node.js
        uses: actions/setup-node@v7
        with:
          node-version: '16.x'
      - run: npm install
      - run: npm run build
      - run: npm test
```

## 后续步骤

若要继续了解主要功能 GitHub Actions，请参阅 [撰写工作流程](/zh/actions/how-tos/write-workflows)。