{"meta":{"title":"从 Jenkins 迁移到 GitHub Actions","intro":"GitHub Actions 和 Jenkins 共享多个相似之处，这使得迁移到 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-jenkins","title":"从 Jenkins 迁移"}],"documentType":"article"},"body":"# 从 Jenkins 迁移到 GitHub Actions\n\nGitHub Actions 和 Jenkins 共享多个相似之处，这使得迁移到 GitHub Actions 相对简单。\n\n## 简介\n\nJenkins 和 GitHub Actions 两者都允许你创建可自动生成、测试、发布、发布和部署代码的工作流。 Jenkins 并在 GitHub Actions 工作流配置中共享一些相似之处：\n\n* Jenkins 使用 \\_声明性管道\\_创建工作流，这类似于 GitHub Actions 工作流文件。\n* Jenkins 使用 *阶段* 来运行步骤集合，而 GitHub Actions 使用作业对一个或多个步骤或单个命令进行分组。\n* Jenkins 和 GitHub Actions 支持基于容器的构建。 有关详细信息，请参阅“[创建 Docker 容器操作](/zh/actions/tutorials/use-containerized-services/create-a-docker-container-action)”。\n* 步骤或任务可以重复使用并与社区共享。\n\n有关详细信息，请参阅“[了解GitHub Actions](/zh/actions/get-started/understand-github-actions)”。\n\n## 主要差异\n\n* Jenkins 有两种类型的语法用来创建管道：Declarative Pipeline 和 Scripted Pipeline。\n  GitHub Actions 使用 YAML 创建工作流和配置文件。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax)”。\n* Jenkins 部署通常是自托管的，用户在自己的数据中心维护服务器。\n  GitHub Actions 通过托管自己可用于运行作业的运行器提供混合云方法，同时也支持自托管运行器。 有关详细信息，请参阅“[自托管运行程序](/zh/actions/concepts/runners/self-hosted-runners)”。\n\n## 比较功能\n\n### 分发版本\n\nJenkins 可让您发送版本到单个构建代理，或者您可以在多个代理之间进行分发。 您也可以根据不同的属性（例如操作系统类型）对这些代理进行分类。\n\n同样，GitHub Actions 也可以将作业发送到由 GitHub 托管的运行器或自托管运行器，并且你可以使用标签根据各种属性对运行器进行分类。 有关详细信息，请参阅 [了解GitHub Actions](/zh/actions/get-started/understand-github-actions#runners) 和 [自托管运行程序](/zh/actions/concepts/runners/self-hosted-runners)。\n\n### 使用区段组织管道\n\nJenkins 将其 Declarative Pipelines 分为多个区段。 同样， GitHub Actions 将其工作流组织成单独的部分。 下表将 Jenkins 部分与 GitHub Actions 工作流进行比较。\n\n| Jenkins 指令                                                      | GitHub Actions                                                                                                                                                                                                             |\n| --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| [`agent`](https://jenkins.io/doc/book/pipeline/syntax/#agent)   | [`jobs.<job_id>.runs-on`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idruns-on) <br> [`jobs.<job_id>.container`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idcontainer) |\n| [`post`](https://jenkins.io/doc/book/pipeline/syntax/#post)     | 无                                                                                                                                                                                                                          |\n| [`stages`](https://jenkins.io/doc/book/pipeline/syntax/#stages) | [`jobs`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobs)                                                                                                                                                 |\n| [`steps`](https://jenkins.io/doc/book/pipeline/syntax/#steps)   | [`jobs.<job_id>.steps`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idsteps)                                                                                                                       |\n\n## 使用指令\n\nJenkins 使用指令来管理 Declarative Pipelines。 这些指令定义工作流程的特性及其执行方式。 下表展示了这些指令如何对应到 GitHub Actions 中的概念。\n\n| Jenkins 指令                                                                                                      | GitHub Actions                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n| --------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| [`environment`](https://jenkins.io/doc/book/pipeline/syntax/#environment)                                       | [`jobs.<job_id>.env`](/zh/actions/reference/workflows-and-actions/workflow-syntax#env) <br> [`jobs.<job_id>.steps[*].env`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsenv)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n| [`options`](https://jenkins.io/doc/book/pipeline/syntax/#options)                                               | [`jobs.<job_id>.strategy`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategy) <br> [`jobs.<job_id>.strategy.fail-fast`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategyfail-fast) <br> [`jobs.<job_id>.timeout-minutes`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idtimeout-minutes)                                                                                                                                                                                                                                                                                                                       |\n| [`parameters`](https://jenkins.io/doc/book/pipeline/syntax/#options)                                            | [`inputs`](/zh/actions/reference/workflows-and-actions/metadata-syntax#inputs) <br> [`outputs`](/zh/actions/reference/workflows-and-actions/metadata-syntax#outputs-for-docker-container-and-javascript-actions)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n| [`triggers`](https://jenkins.io/doc/book/pipeline/syntax/#triggers)                                             | [`on`](/zh/actions/reference/workflows-and-actions/workflow-syntax#on) <br> [`on.<event_name>.types`](/zh/actions/reference/workflows-and-actions/workflow-syntax#onevent_nametypes) <br> [<code>on.\\<push>.\\<branches\\|tags></code>](/zh/actions/reference/workflows-and-actions/workflow-syntax#onpushbranchestagsbranches-ignoretags-ignore) <br> [<code>on.\\<pull\\_request>.\\<branches></code>](/zh/actions/reference/workflows-and-actions/workflow-syntax#onpull_requestpull_request_targetbranchesbranches-ignore) <br> [<code>on.\\<push\\|pull\\_request>.paths</code>](/zh/actions/reference/workflows-and-actions/workflow-syntax#onpushpull_requestpull_request_targetpathspaths-ignore) |\n| [`triggers { upstreamprojects() }`](https://jenkins.io/doc/book/pipeline/syntax/#triggers)                      | [`jobs.<job_id>.needs`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idneeds)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n| [Jenkins cron 语法](https://jenkins.io/doc/book/pipeline/syntax/#cron-syntax)                                     | [`on.schedule`](/zh/actions/reference/workflows-and-actions/workflow-syntax#onschedule)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n| [`stage`](https://jenkins.io/doc/book/pipeline/syntax/#stage)                                                   | [`jobs.<job_id>`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_id) <br> [`jobs.<job_id>.name`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idname)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n| [`tools`](https://jenkins.io/doc/book/pipeline/syntax/#tools)                                                   |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n| \\[                                                                                                              |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n| GitHub 托管运行器规范]\\(/actions/concepts/runners/github-hosted-runners#preinstalled-software-for-github-owned-images) |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n| [`input`](https://jenkins.io/doc/book/pipeline/syntax/#input)                                                   | [`inputs`](/zh/actions/reference/workflows-and-actions/metadata-syntax#inputs)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n| [`when`](https://jenkins.io/doc/book/pipeline/syntax/#when)                                                     | [`jobs.<job_id>.if`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idif)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n\n## 使用连续阶段\n\n### 并行任务处理\n\nJenkins 可以并行运行 `stages` 和 `steps`。\nGitHub Actions 并行运行作业，还可以使用步骤级语法在作业中并发运行步骤。 有关详细信息，请参阅 [GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsbackground)。\n\n| Jenkins Parallel                                                    | GitHub Actions                                                                                                                      |\n| ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |\n| [`parallel`](https://jenkins.io/doc/book/pipeline/syntax/#parallel) | [`jobs.<job_id>.strategy.max-parallel`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategymax-parallel) |\n\n### Matrix\n\nGitHub Actions 和 Jenkins 都允许你使用矩阵来定义各种系统组合。\n\n| Jenkins                                                                  | GitHub Actions                                                                                                                                                                                      |\n| ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| [`axis`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-axes)       | [`strategy/matrix`](/zh/actions/how-tos/write-workflows/choose-what-workflows-do/run-job-variations#about-matrix-strategies) <br> [`context`](/zh/actions/reference/workflows-and-actions/contexts) |\n| [`stages`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-stages)   | [`steps-context`](/zh/actions/reference/workflows-and-actions/contexts#steps-context)                                                                                                               |\n| [`excludes`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-stages) | 无                                                                                                                                                                                                   |\n\n### 通过步骤执行任务\n\nJenkins 将 `steps` 分组在 `stages` 中。 每个步骤都可以是脚本、函数或命令等。 同样，GitHub Actions使用`jobs`来执行特定的`steps`组。\n\n| Jenkins                                                       | GitHub Actions                                                                                       |\n| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| [`steps`](https://jenkins.io/doc/book/pipeline/syntax/#steps) | [`jobs.<job_id>.steps`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idsteps) |\n\n## 常见任务示例\n\n### 计划管道以与 `cron` 一起运行\n\n#### 包含 `cron` 的 Jenkins 管道\n\n```yaml\npipeline {\n  agent any\n  triggers {\n    cron('H/15 * * * 1-5')\n  }\n}\n```\n\n#### GitHub Actions 工作流（使用 `cron`）\n\n```yaml\non:\n  schedule:\n    - cron: '*/15 * * * 1-5'\n```\n\n有关 `schedule` 事件和接受的 cron 语法的详细信息，请参阅“[触发工作流的事件](/zh/actions/reference/workflows-and-actions/events-that-trigger-workflows#schedule)”。\n\n### 配置管道中的环境变量\n\n#### 包含环境变量的 Jenkins 管道\n\n```yaml\npipeline {\n  agent any\n  environment {\n    MAVEN_PATH = '/usr/local/maven'\n  }\n}\n```\n\n#### GitHub Actions 具有环境变量的工作流\n\n```yaml\njobs:\n  maven-build:\n    env:\n      MAVEN_PATH: '/usr/local/maven'\n```\n\n### 从上游项目构建\n\n#### 从上游项目生成的 Jenkins 管道\n\n```yaml\npipeline {\n  triggers {\n    upstream(\n      upstreamProjects: 'job1,job2',\n      threshold: hudson.model.Result.SUCCESS\n    )\n  }\n}\n```\n\n#### GitHub Actions 从上游项目生成的工作流\n\n```yaml\njobs:\n  job1:\n  job2:\n    needs: job1\n  job3:\n    needs: [job1, job2]\n```\n\n### 构建兼容多个操作系统的环境\n\n#### 使用多个操作系统生成的 Jenkins 管道\n\n```yaml\npipeline {\n  agent none\n  stages {\n    stage('Run Tests') {\n      matrix {\n        axes {\n          axis {\n            name: 'PLATFORM'\n            values: 'macos', 'linux'\n          }\n        }\n        agent { label \"${PLATFORM}\" }\n        stages {\n          stage('test') {\n            tools { nodejs \"node-20\" }\n            steps {\n              dir(\"scripts/myapp\") {\n                sh(script: \"npm install -g bats\")\n                sh(script: \"bats tests\")\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n```\n\n#### GitHub Actions 在多个操作系统上构建的工作流\n\n```yaml\nname: demo-workflow\non:\n  push:\njobs:\n  test:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [macos-latest, ubuntu-latest]\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-node@v7\n        with:\n          node-version: 20\n      - run: npm install -g bats\n      - run: bats tests\n        working-directory: ./scripts/myapp\n```"}