# 从 Jenkins 迁移到 GitHub Actions

GitHub Actions 和 Jenkins 共享多个相似之处，这使得迁移到 GitHub Actions 相对简单。

## 简介

Jenkins 和 GitHub Actions 两者都允许你创建可自动生成、测试、发布、发布和部署代码的工作流。 Jenkins 并在 GitHub Actions 工作流配置中共享一些相似之处：

* Jenkins 使用 \_声明性管道\_创建工作流，这类似于 GitHub Actions 工作流文件。
* Jenkins 使用 *阶段* 来运行步骤集合，而 GitHub Actions 使用作业对一个或多个步骤或单个命令进行分组。
* Jenkins 和 GitHub Actions 支持基于容器的构建。 有关详细信息，请参阅“[创建 Docker 容器操作](/zh/actions/tutorials/use-containerized-services/create-a-docker-container-action)”。
* 步骤或任务可以重复使用并与社区共享。

有关详细信息，请参阅“[了解GitHub Actions](/zh/actions/get-started/understand-github-actions)”。

## 主要差异

* Jenkins 有两种类型的语法用来创建管道：Declarative Pipeline 和 Scripted Pipeline。
  GitHub Actions 使用 YAML 创建工作流和配置文件。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax)”。
* Jenkins 部署通常是自托管的，用户在自己的数据中心维护服务器。
  GitHub Actions 通过托管自己可用于运行作业的运行器提供混合云方法，同时也支持自托管运行器。 有关详细信息，请参阅“[自托管运行程序](/zh/actions/concepts/runners/self-hosted-runners)”。

## 比较功能

### 分发版本

Jenkins 可让您发送版本到单个构建代理，或者您可以在多个代理之间进行分发。 您也可以根据不同的属性（例如操作系统类型）对这些代理进行分类。

同样，GitHub Actions 也可以将作业发送到由 GitHub 托管的运行器或自托管运行器，并且你可以使用标签根据各种属性对运行器进行分类。 有关详细信息，请参阅 [了解GitHub Actions](/zh/actions/get-started/understand-github-actions#runners) 和 [自托管运行程序](/zh/actions/concepts/runners/self-hosted-runners)。

### 使用区段组织管道

Jenkins 将其 Declarative Pipelines 分为多个区段。 同样， GitHub Actions 将其工作流组织成单独的部分。 下表将 Jenkins 部分与 GitHub Actions 工作流进行比较。

| Jenkins 指令                                                      | GitHub Actions                                                                                                                                                                                                             |
| --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`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) |
| [`post`](https://jenkins.io/doc/book/pipeline/syntax/#post)     | 无                                                                                                                                                                                                                          |
| [`stages`](https://jenkins.io/doc/book/pipeline/syntax/#stages) | [`jobs`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobs)                                                                                                                                                 |
| [`steps`](https://jenkins.io/doc/book/pipeline/syntax/#steps)   | [`jobs.<job_id>.steps`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idsteps)                                                                                                                       |

## 使用指令

Jenkins 使用指令来管理 Declarative Pipelines。 这些指令定义工作流程的特性及其执行方式。 下表展示了这些指令如何对应到 GitHub Actions 中的概念。

| Jenkins 指令                                                                                                      | GitHub Actions                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| --------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`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)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| [`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)                                                                                                                                                                                                                                                                                                                       |
| [`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)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| [`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) |
| [`triggers { upstreamprojects() }`](https://jenkins.io/doc/book/pipeline/syntax/#triggers)                      | [`jobs.<job_id>.needs`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idneeds)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| [Jenkins cron 语法](https://jenkins.io/doc/book/pipeline/syntax/#cron-syntax)                                     | [`on.schedule`](/zh/actions/reference/workflows-and-actions/workflow-syntax#onschedule)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| [`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)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| [`tools`](https://jenkins.io/doc/book/pipeline/syntax/#tools)                                                   |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| \[                                                                                                              |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| GitHub 托管运行器规范]\(/actions/concepts/runners/github-hosted-runners#preinstalled-software-for-github-owned-images) |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| [`input`](https://jenkins.io/doc/book/pipeline/syntax/#input)                                                   | [`inputs`](/zh/actions/reference/workflows-and-actions/metadata-syntax#inputs)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| [`when`](https://jenkins.io/doc/book/pipeline/syntax/#when)                                                     | [`jobs.<job_id>.if`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idif)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |

## 使用连续阶段

### 并行任务处理

Jenkins 可以并行运行 `stages` 和 `steps`。
GitHub Actions 并行运行作业，还可以使用步骤级语法在作业中并发运行步骤。 有关详细信息，请参阅 [GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsbackground)。

| Jenkins Parallel                                                    | GitHub Actions                                                                                                                      |
| ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| [`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) |

### Matrix

GitHub Actions 和 Jenkins 都允许你使用矩阵来定义各种系统组合。

| Jenkins                                                                  | GitHub Actions                                                                                                                                                                                      |
| ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`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) |
| [`stages`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-stages)   | [`steps-context`](/zh/actions/reference/workflows-and-actions/contexts#steps-context)                                                                                                               |
| [`excludes`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-stages) | 无                                                                                                                                                                                                   |

### 通过步骤执行任务

Jenkins 将 `steps` 分组在 `stages` 中。 每个步骤都可以是脚本、函数或命令等。 同样，GitHub Actions使用`jobs`来执行特定的`steps`组。

| Jenkins                                                       | GitHub Actions                                                                                       |
| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| [`steps`](https://jenkins.io/doc/book/pipeline/syntax/#steps) | [`jobs.<job_id>.steps`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idsteps) |

## 常见任务示例

### 计划管道以与 `cron` 一起运行

#### 包含 `cron` 的 Jenkins 管道

```yaml
pipeline {
  agent any
  triggers {
    cron('H/15 * * * 1-5')
  }
}
```

#### GitHub Actions 工作流（使用 `cron`）

```yaml
on:
  schedule:
    - cron: '*/15 * * * 1-5'
```

有关 `schedule` 事件和接受的 cron 语法的详细信息，请参阅“[触发工作流的事件](/zh/actions/reference/workflows-and-actions/events-that-trigger-workflows#schedule)”。

### 配置管道中的环境变量

#### 包含环境变量的 Jenkins 管道

```yaml
pipeline {
  agent any
  environment {
    MAVEN_PATH = '/usr/local/maven'
  }
}
```

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

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

### 从上游项目构建

#### 从上游项目生成的 Jenkins 管道

```yaml
pipeline {
  triggers {
    upstream(
      upstreamProjects: 'job1,job2',
      threshold: hudson.model.Result.SUCCESS
    )
  }
}
```

#### GitHub Actions 从上游项目生成的工作流

```yaml
jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]
```

### 构建兼容多个操作系统的环境

#### 使用多个操作系统生成的 Jenkins 管道

```yaml
pipeline {
  agent none
  stages {
    stage('Run Tests') {
      matrix {
        axes {
          axis {
            name: 'PLATFORM'
            values: 'macos', 'linux'
          }
        }
        agent { label "${PLATFORM}" }
        stages {
          stage('test') {
            tools { nodejs "node-20" }
            steps {
              dir("scripts/myapp") {
                sh(script: "npm install -g bats")
                sh(script: "bats tests")
              }
            }
          }
        }
      }
    }
  }
}
```

#### GitHub Actions 在多个操作系统上构建的工作流

```yaml
name: demo-workflow
on:
  push:
jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, ubuntu-latest]
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v7
        with:
          node-version: 20
      - run: npm install -g bats
      - run: bats tests
        working-directory: ./scripts/myapp
```