{"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/get-started/quickstart)。\n* 若要了解基本 GitHub Actions 概念，请参阅 [使用工作流工件存储和共享数据](/zh/actions/tutorials/store-and-share-data#passing-data-between-jobs-in-a-workflow)。\n\n## 比较作业执行\n\n为了让你控制何时执行 CI 任务， GitHub Actions\\_工作流\\_ 使用默认情况下并行运行的 *作业* 。 每个作业都包含按你定义的顺序执行的步骤。 如果需要为作业运行设置和清理操作，可以在每个作业中定义执行这些操作的步骤。\n\n## 主要相似之处\n\nGitHub Actions Travis CI 共享某些相似之处，并提前了解这些相似之处有助于顺利完成迁移过程。\n\n### 使用 YAML 语法\n\nTravis CI 并使用 GitHub Actions YAML 创建作业和工作流，这些文件存储在代码的存储库中。 有关如何使用 YAML 的详细信息 GitHub Actions ，请参阅 [创建示例工作流](/zh/actions/tutorials/create-an-example-workflow)。\n\n### 自定义变量\n\nTravis CI 支持设置变量并在各个阶段之间共享它们。 同样， GitHub Actions 允许为工作流定义变量。 有关详细信息，请参阅“[在变量中存储信息](/zh/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables)”。\n\n### 默认变量\n\nTravis CI 和 GitHub Actions 两者都包含可在 YAML 文件中使用的默认环境变量。 对于 GitHub Actions，可以看到 [变量参考](/zh/actions/reference/workflows-and-actions/variables#default-environment-variables) 中列出的这些内容。\n\n### 并行任务处理\n\nTravis CI 可以使用 `stages` 并行运行作业。 同样， GitHub Actions 并行运行 `jobs` 。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idneeds)”。\n\n### 状态徽章\n\nTravis CI 和 GitHub Actions 都支持状态徽章，可用于表明构建是成功还是失败。\n有关详细信息，请参阅“[添加工作流状态徽章](/zh/actions/how-tos/monitor-workflows/add-a-status-badge)”。\n\n### 使用矩阵\n\nTravis CI 和 GitHub Actions 两者都支持矩阵，允许你使用操作系统和软件包的组合来执行测试。 有关详细信息，请参阅“[在工作流中运行作业变体](/zh/actions/how-tos/write-workflows/choose-what-workflows-do/run-job-variations)”。\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/reference/workflows-and-actions/workflow-syntax#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 允许你存储机密并将其引用到作业中。\nGitHub Actions 组织可以限制哪些存储库可以访问组织机密。 部署保护规则可能需要手动批准工作流才能访问环境机密。 有关详细信息，请参阅“[机密](/zh/actions/concepts/security/secrets)”。\n\n### 在作业和工作流程之间共享文件\n\nGitHub Actions 集成了对制品存储的支持，使你能够在工作流中的作业之间共享文件。 您还可以保存生成的文件，并与其他工作流程共享它们。 有关详细信息，请参阅“[了解GitHub Actions](/zh/actions/get-started/understand-github-actions)”。\n\n### 托管您自己的运行器\n\n如果您的作业需要特定的硬件或软件，GitHub Actions 允许您托管自己的运行器，并将作业发送到这些运行器进行处理。\nGitHub Actions 还允许你使用策略来控制对这些运行器的访问方式，并在组织或仓库级别授予访问权限。 有关详细信息，请参阅“[使用自承载运行器](/zh/actions/how-tos/manage-runners/self-hosted-runners)”。\n\n### 并行作业和执行时间\n\n在 GitHub Actions 中，并发作业数和工作流执行时间可能会因您的 GitHub 套餐而异。 有关详细信息，请参阅“[计费和使用情况](/zh/actions/concepts/billing-and-usage)”。\n\n### 在 GitHub Actions 中使用不同语言\n\n使用不同语言 GitHub Actions时，可以在作业中创建一个步骤来设置语言依赖项。 有关使用特定语言的信息，请参阅“[构建和测试代码](/zh/actions/tutorials/build-and-test-code)”。\n\n## 执行脚本\n\nGitHub Actions 可以使用 `run` 步骤来运行脚本或 shell 命令。 若要使用特定的 shell，可以在提供脚本路径时指定 `shell` 类型。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax#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\nGitHub Actions 如果其中一个步骤返回错误代码，则立即停止作业。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax#exit-codes-and-error-action-preference)”。\n\n### 作业错误处理\n\nGitHub 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) 防止工作流在作业失败时停止运行。\n\n## 将条件和表达式的语法进行转换\n\n若要在条件表达式下运行作业，Travis CI 并 GitHub Actions 共享类似的 `if` 条件语法。               通过 GitHub Actions，可以使用 `if` 条件来使作业或步骤仅在满足条件时才运行。 有关详细信息，请参阅“[对工作流和操作中的表达式求值](/zh/actions/reference/workflows-and-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/how-tos/reuse-automations)”。\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@v7\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/how-tos/write-workflows)。"}