{"meta":{"title":"从 Travis CI 迁移到 GitHub Actions","intro":"GitHub Actions 和 Travis CI 有多个相似之处，这有助于很简便地迁移到 GitHub Actions。","product":"GitHub Actions","breadcrumbs":[{"href":"/zh/actions","title":"GitHub Actions"},{"href":"/zh/actions/tutorials","title":"教程"},{"href":"/zh/actions/tutorials/migrate-to-github-actions","title":"迁移到 GitHub Actions"},{"href":"/zh/actions/tutorials/migrate-to-github-actions/manual-migrations","title":"手动迁移"},{"href":"/zh/actions/tutorials/migrate-to-github-actions/manual-migrations/migrate-from-travis-ci","title":"从 Travis CI 迁移"}],"documentType":"article"},"body":"# 从 Travis CI 迁移到 GitHub Actions\n\nGitHub Actions 和 Travis CI 有多个相似之处，这有助于很简便地迁移到 GitHub Actions。\n\n## 简介\n\n本指南可帮助您从 Travis CI 迁移到 GitHub Actions。 它会比较它们的概念和语法、描述相似之处，并演示了它们处理常见任务的不同方法。\n\n## 开始之前\n\n在开始迁移到 GitHub Actions 之前，熟悉其工作原理很有用：\n\n* 如需演示 GitHub Actions 作业的快速示例，请参阅“[GitHub Actions快速入门](/zh/actions/quickstart)”。\n* 若要了解基本的 GitHub Actions 概念，请参阅“[了解GitHub Actions](/zh/actions/learn-github-actions/understanding-github-actions)”。\n\n## 比较作业执行\n\n为了让你控制 CI 任务的执行时间，GitHub Actions *工作流\\_使用默认并行运行的\\_作业*。 每个作业都包含按你定义的顺序执行的步骤。 如果需要为作业运行设置和清理操作，可以在每个作业中定义执行这些操作的步骤。\n\n## 主要相似之处\n\nGitHub Actions 和 Travis CI 具有某些相似之处，提前了解这些相似之处有助于顺利迁移过程。\n\n### 使用 YAML 语法\n\nTravis CI 和 GitHub Actions 同时使用 YAML 创建作业和工作流程，并且这些文件存储在代码仓库中。 若要详细了解 GitHub Actions 如何使用 YAML，请参阅“[了解GitHub Actions](/zh/actions/learn-github-actions/understanding-github-actions#create-an-example-workflow)”。\n\n### 自定义变量\n\nTravis CI 支持设置变量并在各个阶段之间共享它们。 同样，GitHub Actions 支持为工作流定义变量。 有关详细信息，请参阅“[在变量中存储信息](/zh/actions/learn-github-actions/variables)”。\n\n### 默认变量\n\nTravis CI 和 GitHub Actions 都包括可以在 YAML 文件中使用的默认环境变量。 对于 GitHub Actions，可在“[变量参考](/zh/actions/reference/variables-reference#default-environment-variables)”中查看这些内容。\n\n### 并行任务处理\n\nTravis CI 可以使用 `stages` 并行运行作业。 同样，GitHub Actions 并行运行 `jobs`。 有关详细信息，请参阅“[工作流](/zh/actions/using-workflows/about-workflows#creating-dependent-jobs)”。\n\n### 状态徽章\n\nTravis CI 和 GitHub Actions 都支持状态徽章，用于表示构建是通过还是失败。\n有关详细信息，请参阅“[添加工作流状态徽章](/zh/actions/monitoring-and-troubleshooting-workflows/adding-a-workflow-status-badge)”。\n\n### 使用矩阵\n\nTravis CI 和 GitHub Actions 都支持矩阵，你可以使用操作系统和软件包的组合执行测试。 有关详细信息，请参阅“[在工作流中运行作业变体](/zh/actions/using-jobs/using-a-matrix-for-your-jobs)”。\n\n下面的示例比较每个系统的语法。\n\n#### Travis CI 的矩阵语法\n\n```yaml\nmatrix:\n  include:\n    - rvm: '2.5'\n    - rvm: '2.6.3'\n```\n\n#### GitHub Actions 的矩阵语法\n\n```yaml\njobs:\n  build:\n    strategy:\n      matrix:\n        ruby: ['2.5', '2.6.3']\n```\n\n### 定向特定分支\n\nTravis CI 和 GitHub Actions 允许您将 CI 定向到特定分支。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/using-workflows/workflow-syntax-for-github-actions#onpushbranchestagsbranches-ignoretags-ignore)”。\n\n下面是每个系统的语法示例：\n\n#### Travis CI 定向特定分支的语法\n\n```yaml\nbranches:\n  only:\n    - main\n    - 'mona/octocat'\n```\n\n#### GitHub Actions 用于定向到特定分支的语法\n\n```yaml\non:\n  push:\n    branches:\n      - main\n      - 'mona/octocat'\n```\n\n### 检出子模块\n\nTravis CI 和 GitHub Actions 都允许您控制子模块是否包含在仓库克隆中。\n\n下面是每个系统的语法示例：\n\n#### Travis CI 的语法用于检出子模块\n\n```yaml\ngit:\n  submodules: false\n```\n\n#### GitHub Actions 用于检出子模块的语法\n\n```yaml\n- uses: actions/checkout@v6\n  with:\n    submodules: false\n```\n\n### 在矩阵中使用环境变量\n\nTravis CI 和 GitHub Actions 可以将自定义变量添加到测试矩阵，这可让你在后面的步骤中引用该变量。\n\n在 GitHub Actions 中，可以使用 `include` 键将自定义环境变量添加到矩阵。 在此示例中，`node-version` 的每个矩阵条目都配置为对 `site` 和 `datacenter` 环境变量使用不同的值。 然后，`Echo site details` 步骤使用 `env: ${{ matrix.env }}` 来引用自定义变量：\n\n```yaml\nname: Node.js CI\non: [push]\njobs:\n  build:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n       include:\n         - node-version: '14.x'\n           site: \"prod\"\n           datacenter: \"site-a\"\n         - node-version: '16.x'\n           site: \"dev\"\n           datacenter: \"site-b\"\n    steps:\n      - name: Echo site details\n        env:\n          SITE: ${{ matrix.site }}\n          DATACENTER: ${{ matrix.datacenter }}\n        run: echo $SITE $DATACENTER\n```\n\n## GitHub Actions 中的关键功能\n\n从 Travis CI 迁移时，请考虑 GitHub Actions 中的以下关键功能：\n\n### 存储机密\n\nGitHub Actions 允许您存储密码并在作业中引用它们。 GitHub Actions 组织可以限制哪些仓库能够访问组织机密。 部署保护规则可能需要手动批准工作流才能访问环境机密。 有关详细信息，请参阅“[机密](/zh/actions/security-for-github-actions/security-guides/about-secrets)”。\n\n### 在作业和工作流程之间共享文件\n\nGitHub Actions 包括对构件存储的集成支持，允许您在工作流程中的作业之间共享文件。 您还可以保存生成的文件，并与其他工作流程共享它们。 有关详细信息，请参阅“[了解GitHub Actions](/zh/actions/learn-github-actions/essential-features-of-github-actions#sharing-data-between-jobs)”。\n\n### 托管您自己的运行器\n\n如果您的作业需要特定的硬件或软件，GitHub Actions 允许您托管自己的运行器，并将其作业发送给它们进行处理。 GitHub Actions 还允许您使用策略来控制访问这些运行器的方式，在组织或仓库级别授予访问权限。 有关详细信息，请参阅“[使用自承载运行器](/zh/actions/how-tos/managing-self-hosted-runners)”。\n\n### 并行作业和执行时间\n\nGitHub Actions 中的并行作业和工作流程执行时间因 GitHub 计划而异。 有关详细信息，请参阅“[计费和使用情况](/zh/actions/learn-github-actions/usage-limits-billing-and-administration)”。\n\n### 在 GitHub Actions 中使用不同的语言\n\n在 GitHub Actions 中使用不同语言时，您可以在作业中创建步骤来设置语言依赖项。 有关使用特定语言的信息，请参阅“[构建和测试代码](/zh/actions/use-cases-and-examples/building-and-testing)”。\n\n## 执行脚本\n\nGitHub Actions 可以使用 `run` 步骤运行脚本或 shell 命令。 若要使用特定的 shell，可以在提供脚本路径时指定 `shell` 类型。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun)”。\n\n例如：\n\n```yaml\nsteps:\n  - name: Run build script\n    run: ./.github/scripts/build.sh\n    shell: bash\n```\n\n## GitHub Actions 中的错误处理\n\n迁移到 GitHub Actions 时，可能需要注意不同的错误处理方法。\n\n### 脚本错误处理\n\n如果其中一个步骤返回错误代码，GitHub Actions 将立即停止作业。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/using-workflows/workflow-syntax-for-github-actions#exit-codes-and-error-action-preference)”。\n\n### 作业错误处理\n\nGitHub Actions 使用 `if` 条件在特定情况下执行作业或步骤。 例如，你可以在某个步骤导致 `failure()` 时运行另一个步骤。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/using-workflows/workflow-syntax-for-github-actions#example-using-status-check-functions)”。 还可以使用 [`continue-on-error`](/zh/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idcontinue-on-error) 防止工作流在作业失败时停止运行。\n\n## 将条件和表达式的语法进行转换\n\n若要在条件表达式下运行作业，Travis CI 和 GitHub Actions 将具有类似的 `if` 条件语法。 通过 GitHub Actions，您可以使用 `if` 条件来设置作业或步骤仅在满足特定条件时才运行。 有关详细信息，请参阅“[对工作流和操作中的表达式求值](/zh/actions/learn-github-actions/expressions)”。\n\n此示例演示 `if` 条件如何控制是否执行步骤：\n\n```yaml\njobs:\n  conditional:\n    runs-on: ubuntu-latest\n    steps:\n      - run: echo \"This step runs with str equals 'ABC' and num equals 123\"\n        if: env.str == 'ABC' && env.num == 123\n```\n\n## 将阶段转换为步骤\n\nTravis CI 使用\\_阶段\\_来运行\\_步骤\\_，而 GitHub Actions 具有\\_步骤\\_来执行\\_操作\\_。 可以在 [GitHub Marketplace](https://github.com/marketplace?type=actions) 中找到预生成的操作，也可以创建自己的操作。 有关详细信息，请参阅“[重用自动化](/zh/actions/creating-actions)”。\n\n下面是每个系统的语法示例：\n\n### Travis CI 的阶段和步骤语法\n\n```yaml\nlanguage: python\npython:\n  - \"3.7\"\n\nscript:\n  - python script.py\n```\n\n### GitHub Actions 的步骤和操作语法\n\n```yaml\njobs:\n  run_python:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/setup-python@v5\n        with:\n          python-version: '3.7'\n          architecture: 'x64'\n      - run: python script.py\n```\n\n## 缓存依赖项\n\nTravis CI 和 GitHub Actions 可让您手动缓存依赖供以后使用。\n\n这些示例演示了各个系统的缓存语法。\n\n### Travis CI 的缓存语法\n\n```yaml\nlanguage: node_js\ncache: npm\n```\n\n### 用于缓存的GitHub Actions语法\n\n```yaml\n- name: Cache node modules\n  uses: actions/cache@v4\n  with:\n    path: ~/.npm\n    key: v1-npm-deps-${{ hashFiles('**/package-lock.json') }}\n    restore-keys: v1-npm-deps-\n```\n\n## 常见任务示例\n\n本节比较了 GitHub Actions 和 Travis CI 执行共同任务的方式。\n\n### 配置环境变量\n\n您可以在 GitHub Actions 作业中创建自定义环境变量。\n\n#### Travis CI 环境变量的语法规则\n\n```yaml\nenv:\n  - MAVEN_PATH=\"/usr/local/maven\"\n```\n\n#### 包含环境变量的 GitHub Actions 工作流\n\n```yaml\njobs:\n  maven-build:\n    env:\n      MAVEN_PATH: '/usr/local/maven'\n```\n\n### 使用 Node.js 构建\n\n#### Travis CI 中使用 Node.js 构建\n\n```yaml\ninstall:\n  - npm install\nscript:\n  - npm run build\n  - npm test\n```\n\n#### GitHub Actions 使用 Node.js 构建的工作流\n\n```yaml\nname: Node.js CI\non: [push]\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - name: Use Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: '16.x'\n      - run: npm install\n      - run: npm run build\n      - run: npm test\n```\n\n## 后续步骤\n\n若要继续了解 GitHub Actions 的主要功能，请参阅“[撰写工作流程](/zh/actions/learn-github-actions)”。"}