# Migrating from Jenkins

> 原文：[https://docs.gitlab.com/ee/ci/jenkins/](https://docs.gitlab.com/ee/ci/jenkins/)

*   [Managing the organizational transition](#managing-the-organizational-transition)
*   [JenkinsFile Wrapper](#jenkinsfile-wrapper)
*   [Important product differences](#important-product-differences)
*   [Agents vs. Runners](#agents-vs-runners)
*   [Groovy vs. YAML](#groovy-vs-yaml)
*   [Artifact publishing](#artifact-publishing)
*   [Integrated features](#integrated-features)
    *   [Templates](#templates)
*   [Converting a declarative Jenkinsfile](#converting-a-declarative-jenkinsfile)
    *   [Sections](#sections)
        *   [`agent`](#agent)
        *   [`post`](#post)
        *   [`stages`](#stages)
        *   [`steps`](#steps)
    *   [Directives](#directives)
        *   [`environment`](#environment)
        *   [`options`](#options)
        *   [`parameters`](#parameters)
        *   [`triggers` / `cron`](#triggers--cron)
        *   [`tools`](#tools)
        *   [`input`](#input)
        *   [`when`](#when)

# Migrating from Jenkins[](#migrating-from-jenkins "Permalink")

许多 GitLab 用户已经从 Jenkins 成功迁移到 GitLab CI / CD. 为了使您入门时更容易，我们在这里收集了一些您可能会在使用之前可能会发现有用的资源.请将此页面视为" Jenkins 用户的 GitLab CI / CD"指南.

建议的步骤的以下列表是在观察能够快速完成此迁移的组织之后创建的：

1.  首先阅读《 GitLab CI / CD [快速入门指南》](../quick_start/README.html)和[重要的产品差异](#important-product-differences) .
2.  了解[管理组织过渡](#managing-the-organizational-transition)的重要性.
3.  [将 Runners 添加](../runners/README.html)到您的 GitLab 实例.
4.  教育开发人员并使他们能够在他们的项目中独立执行以下步骤：
    1.  查看《 [快速入门指南](../quick_start/README.html)和[管道配置参考》](../yaml/README.html) .
    2.  使用[Jenkins 包装器](#jenkinsfile-wrapper)暂时维护脆弱的 Jenkins 作业.
    3.  迁移构建和 CI 作业并将其配置为直接在合并请求中显示结果. 他们可以使用[Auto DevOps](../../topics/autodevops/index.html)作为起点，并[根据](../../topics/autodevops/customize.html)需要[自定义](../../topics/autodevops/customize.html)或[分解](../../topics/autodevops/customize.html#using-components-of-auto-devops)配置.
    4.  添加[评论应用](../review_apps/index.html) .
    5.  使用[云部署模板](../cloud_deployment/index.html) ，添加[环境](../environments/index.html)和[部署板](../..//user/project/deploy_boards.html)来迁移部署作业.
    6.  使用 Jenkins 包装器解开仍在运行的所有作业的包装.
5.  盘点所有常见的 CI / CD 作业定义，然后为其创建和共享[模板](#templates) .

有关如何将 Jenkins 管道转换为 GitLab CI / CD 管道的示例，或如何使用 Auto DevOps 自动测试代码的示例，请观看[从 Jenkins 迁移到 GitLab 的](https://www.youtube.com/watch?v=RlEVGOpYF5Y)视频.

否则，请继续阅读以获取重要信息，这些信息将帮助您取得成功. 欢迎来到 GitLab！

如果您有未在此处回答的问题， [GitLab 社区论坛](https://forum.gitlab.com/)将是一个很好的资源.

## Managing the organizational transition[](#managing-the-organizational-transition "Permalink")

从詹金斯过渡到 GitLab 的一个重要部分是随之而来的文化和组织变革，并成功地对其进行了管理. 我们发现了一些有助于解决问题的方法：

*   为您的迁移目标设定并传达清晰的愿景有助于您的用户理解为什么值得付出努力. 当工作完成时，该值将很明显，但是在进行过程中，人们也需要意识到.
*   有关领导团队的赞助和配合有助于上述观点.
*   花时间对用户进行不同的教育，与他们共享此文档等等，将有助于确保您成功.
*   寻找顺序或延迟部分迁移的方法可能会很有帮助，但是您不想让事物长时间处于未迁移（或部分迁移）状态. 要获得 GitLab 的所有好处，仅将现有的 Jenkins 设置转移到原样上（包括任何当前问题）是不够的. 您需要利用 GitLab 提供的改进，这最终需要（最终）更新您的实现.

## JenkinsFile Wrapper[](#jenkinsfile-wrapper "Permalink")

我们正在构建一个[JenkinsFile 包装器](https://gitlab.com/gitlab-org/jfr-container-builder/) ，它将允许您在 GitLab 作业（包括插件）中运行完整的 Jenkins 实例. 通过让您将不太紧急的管道的迁移延迟一段时间，可以帮助简化过渡过程.

如果您有兴趣帮助 GitLab 测试包装器，请加入我们的[公共测试问题](https://gitlab.com/gitlab-org/gitlab/-/issues/215675)以获取说明并提供您的反馈.

## Important product differences[](#important-product-differences "Permalink")

值得一提的产品之间存在一些高级差异：

*   使用 GitLab，您不需要根`pipeline`关键字即可包装所有内容.
*   管道触发和[触发其他管道的](../yaml/README.html#trigger)方式与詹金斯不同. 可以触发 GitLab 管道：

    *   在推
    *   on [schedule](../pipelines/schedules.html)
    *   从[GitLab UI](../pipelines/index.html#run-a-pipeline-manually)
    *   by [API call](../triggers/README.html)
    *   by [webhook](../triggers/README.html#triggering-a-pipeline-from-a-webhook)
    *   by [ChatOps](../chatops/README.html)
*   您可以使用[`rules`语法](../yaml/README.html#rules)来控制在哪种情况下运行哪些作业，具体取决于触发方式.
*   GitLab [管道调度概念](../pipelines/schedules.html)也与 Jenkins 不同.
*   您可以使用[`include`关键字](../yaml/README.html#include)和[模板](#templates)重复使用管道配置. 您的模板可以保存在中央存储库中（具有不同的权限），然后任何项目都可以使用它们. 这个中央项目也可以包含脚本或其他可重用的代码.
*   You can also use the [`extends` keyword](../yaml/README.html#extends) to reuse configuration within a single pipeline configuration.
*   单个阶段中的所有作业始终并行运行，并且所有阶段均按顺序运行. 我们计划通过我们的有[向无环图](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/47063)功能允许某些作业根据需要中断此排序.
*   [`parallel`](../yaml/README.html#parallel)关键字可以自动并行化任务，例如支持并行化的测试.
*   通常，单个阶段中的所有作业并行运行，并且所有阶段按顺序运行. 有不同的[管道体系结构](../pipelines/pipeline_architectures.html)允许您更改此行为.
*   建议使用新[`rules`语法](../yaml/README.html#rules)控制何时运行不同作业. 它比`only/except`语法更强大.
*   一个重要的区别是，作业彼此独立运行，并且每个作业都具有全新的环境. 使用[`artifacts`](../yaml/README.html#artifacts)和[`dependencies`](../yaml/README.html#dependencies)关键字控制作业之间传递工件. 完成后，计划的[工作区](https://gitlab.com/gitlab-org/gitlab/-/issues/29265)功能将使您能够更轻松地在串行作业之间持久保留公共工作区.
*   `.gitlab-ci.yml`文件已签入到存储库的根目录，非常类似于 Jenkinsfile，但采用 YAML 格式（请参阅[完整参考](../yaml/README.html) ）而不是 Groovy DSL. 它与声明性 Jenkinsfile 格式最相似.
*   手动批准或登机口可以设置为以下[`when:manual`作业](../yaml/README.html#whenmanual) . 这些还可以利用[`protected environments`](../yaml/README.html#protecting-manual-jobs-premium)来控制谁可以批准它们.
*   GitLab 带有[容器注册表](../../user/packages/container_registry/index.html) ，我们建议使用容器映像来设置您的构建环境. 例如，设置一个管道来构建您自己的构建环境，并将其发布到容器注册表. 然后，让您的管道使用此方法，而不是每个管道都使用它们自己的环境，这将变得更慢，并且一致性可能会降低. 我们有大量有关[如何使用 Container Registry 的](../../user/packages/container_registry/index.html)文档.
*   中央实用程序存储库是放置各种计划作业或其他功能类似于实用程序的手动作业的好地方. 詹金斯的装置中往往有一些.

## Agents vs. Runners[](#agents-vs-runners "Permalink")

Jenkins 代理和 GitLab Runners 都是运行作业的主机. 要转换 Jenkins 代理，只需将其卸载，然后[安装并注册 Runner](../runners/README.html) . 运行程序不需要太多的开销，因此您可以像使用的 Jenkins 代理一样调整它们的大小.

与代理相比，Runners 的工作方式存在一些重要差异：

*   跑步者可以设置为[在实例之间共享，也可以在组级别添加，也可以在项目级别设置](../runners/README.html#types-of-runners) . 他们将从您自动定义的范围中自动选择作业.
*   您还可以[使用标签](../runners/README.html#use-tags-to-limit-the-number-of-jobs-using-the-runner)进行更精细的控制，并将跑步者与特定工作相关联. 例如，您可以将标签用于需要专用，功能更强大或特定硬件的作业.
*   GitLab 具有[针对](https://docs.gitlab.com/runner/configuration/autoscale.html) Runner 的[自动缩放功能](https://docs.gitlab.com/runner/configuration/autoscale.html) ，可让您将其配置为根据需要进行设置，并在不进行缩放时进行缩放. 这类似于詹金斯中的临时代理.

如果您使用的是`gitlab.com` ，则可以利用我们[共享的 Runner](../../user/gitlab_com/index.html#shared-runners) `gitlab.com`来运行作业，而无需置备自己的 Runners. 我们正在研究使它们也[可用于自我管理实例](https://gitlab.com/groups/gitlab-org/-/epics/835) .

## Groovy vs. YAML[](#groovy-vs-yaml "Permalink")

Jenkins 管道基于[Groovy](https://s0groovy-lang0org.icopy.site/) ，因此管道规范以代码形式编写. GitLab 的工作方式略有不同，我们使用结构更高级的[YAML](https://yaml.org/)格式，该格式将脚本元素放置在`script:`内部`script:`块与管道规范本身分开.

这是 GitLab 的优势，因为它有助于使学习曲线更简单地启动和运行，并且避免了一些不受限制的复杂性问题，这些问题会使您的 Jenkinsfile 难以理解和管理.

就是说，我们当然仍然重视 DRY（不要重复自己）的原则，并希望确保您的工作行为可以被一次编码并根据需要进行应用. 您可以使用`extends:`语法[在您的作业中重用配置](../yaml/README.html#extends) ， `include:`可用于在不同项目的管道中[重用管道配置](../yaml/README.html#include) ：

```
.in-docker:
  tags:
    - docker
  image: alpine

rspec:
  extends:
    - .in-docker
  script:
    - rake rspec 
```

## Artifact publishing[](#artifact-publishing "Permalink")

工件的工作方式可能与您与詹金斯一起使用时有所不同. 在 GitLab 中，任何作业都可以使用`artifacts:`关键字定义一组要保存的`artifacts:` . 可以将其配置为指向一个文件或一组文件，然后可以在每个作业之间将其持久化. 阅读更多关于我们详细的[工件文档的信息](../pipelines/job_artifacts.html) ：

```
pdf:
  script: xelatex mycv.tex
  artifacts:
    paths:
      - ./mycv.pdf
      - ./output/
    expire_in: 1 week 
```

此外，我们还具有包管理功能，例如可以利用的内置容器，NPM 和 Maven 注册表. 您可以在[我们的文档](../../README.html#package)的[包装部分中](../../README.html#package)查看打包功能的完整列表（包括指向文档的链接）.

## Integrated features[](#integrated-features "Permalink")

在 Jenkins 中，您可能曾经使用插件来获得代码质量，单元测试，安全扫描等功能，但 GitLab 充分利用了我们连接的生态系统，将这些结果自动提取到您的合并请求，管道详细信息页面和其他位置. 您可能会发现实际上不需要配置任何内容即可显示这些内容.

如果它们无法正常工作，或者您想查看可用的[功能](../README.html#feature-set) ，则我们的[CI 功能索引](../README.html#feature-set)将提供捆绑功能的完整列表，并提供每个功能的文档链接.

### Templates[](#templates "Permalink")

对于高级 CI / CD 团队，项目模板可以启用管道配置的重用，并鼓励内部采购.

In self-managed GitLab instances, you can build an [Instance Template Repository](../../user/admin_area/settings/instance_template_repository.html). Development teams across the whole organization can select templates from a dropdown menu. A group administrator is able to set a group to use as the source for the [custom project templates](../../user/admin_area/custom_project_templates.html), which can be used by all projects in the group. An instance administrator can set a group as the source for [instance project templates](../../user/group/custom_project_templates.html), which can be used by projects in that instance.

## Converting a declarative Jenkinsfile[](#converting-a-declarative-jenkinsfile "Permalink")

声明性 Jenkinsfile 包含用于控制管道行为的" Sections"和" Directives". GitLab 中有所有这些的等效项，我们在下面对此进行了介绍.

本节基于[Jenkinsfile 语法文档](https://www.jenkins.io/doc/book/pipeline/syntax/) ，旨在将其中的概念映射到 GitLab 中的概念.

### Sections[](#sections "Permalink")

#### `agent`[](#agent "Permalink")

代理部分用于定义如何执行管道. 对于 GitLab，我们使用[GitLab Runner](../runners/README.html)来提供此功能. 您可以在 Kubernetes 或任何主机上配置自己的运行程序，也可以利用我们的共享运行程序队列（请注意，共享运行程序队列仅适用于 GitLab.com 用户.）以上链接将带您进入说明文档的文档如何快速起步和运行. 我们还支持使用[标签](../runners/README.html#use-tags-to-limit-the-number-of-jobs-using-the-runner)将不同的作业定向到不同的 Runner（执行代理）.

`agent`部分还允许您定义应使用哪些 Docker 映像执行，而我们使用[`image`](../yaml/README.html#image)关键字. 该`image`可以设置在单个作业或顶层，在这种情况下，它将应用于管道中的所有作业：

```
my_job:
  image: alpine
  ... 
```

#### `post`[](#post "Permalink")

`post`部分定义了应在管道末尾执行的操作. GitLab 也通过阶段的使用来支持这一点. 您可以按以下方式定义阶段，分配给`before_pipeline`或`after_pipeline`阶段的所有作业都将按预期运行. 您可以根据需要将这些阶段称为：

```
stages:
  - before_pipeline
  - build
  - test
  - deploy
  - after_pipeline 
```

可以通过[`before_script`和`after_script`关键字](../yaml/README.html#before_script-and-after_script)设置要在任何作业之前和之后执行的步骤：

```
default:
  before_script:
    - echo "I run before any jobs starts in the entire pipeline, and can be responsible for setting up the environment." 
```

#### `stages`[](#stages "Permalink")

GitLab CI / CD 也可以让您定义阶段，但是可以自由配置一些. GitLab [`stages`关键字](../yaml/README.html#stages)是一个顶级设置，它枚举了阶段列表，但是您不需要在" `stages`部分下嵌套单个作业. 通过使用[`stage:`关键字，](../yaml/README.html#stage)可以使`.gitlab-ci.yml`定义的任何作业成为任何阶段的一部分.

请注意，除非另有说明，否则每个管道都以`build` ， `test`和`deploy`阶段实例化，并按该顺序运行. 未定义`stage`作业默认情况下放置在`test`阶段. 当然，引用阶段的每个作业都必须引用管道配置中存在的阶段.

```
stages:
  - build
  - test
  - deploy

my_job:
  stage: build
  ... 
```

#### `steps`[](#steps "Permalink")

The `steps` section is equivalent to the [`script` section](../yaml/README.html#script) of an individual job. This is a simple YAML array with each line representing an individual command to be run:

```
my_job:
  script:
    - echo "hello! the current time is:"
    - time
  ... 
```

### Directives[](#directives "Permalink")

#### `environment`[](#environment "Permalink")

在 GitLab 中，我们使用[`variables`关键字](../yaml/README.html#variables)在运行时定义不同的变量. 这些也可以通过 CI / CD 设置下的 GitLab UI 进行设置. 另请参阅我们[有关变量](../variables/README.html)的[一般文档](../variables/README.html) ，包括有关[受保护变量](../variables/README.html#protect-a-custom-variable)的部分，该部分可用于将对某些变量的访问限制为某些环境或运行程序：

```
variables:
  POSTGRES_USER: user
  POSTGRES_PASSWORD: testing_password 
```

#### `options`[](#options "Permalink")

这里，存在与所讨论的对象本身相关联的用于不同事物的选项. 例如，与作业相关的选项是相对于作业本身定义的. 如果您正在寻找某个选项，则应该可以通过搜索[完整的配置参考](../yaml/README.html)页面来找到它的位置.

#### `parameters`[](#parameters "Permalink")

GitLab 不需要您定义在开始手动作业时希望可用的变量. 用户可以提供他们喜欢的任何变量.

#### `triggers` / `cron`[](#triggers--cron "Permalink")

Because GitLab is integrated tightly with Git, SCM polling options for triggers are not needed. We support an easy to use [syntax for scheduling pipelines](../pipelines/schedules.html).

#### `tools`[](#tools "Permalink")

GitLab 不支持单独的`tools`指令. 我们的最佳实践建议是使用预构建的容器映像，该映像可以缓存，并且可以构建为包含管道所需的工具. 可以设置管道以根据需要自动构建这些映像，并将它们部署到[容器注册表中](../../user/packages/container_registry/index.html) .

如果您没有在 Docker / Kubernetes 上使用容器映像，例如在 Mac 或 FreeBSD 上，则`shell`执行程序确实需要您预先设置环境或作为作业的一部分. 您可以创建一个`before_script`动作来为您处理.

#### `input`[](#input "Permalink")

与`parameters`关键字类似，这是不需要的，因为始终可以为运行时变量条目提供手动作业.

#### `when`[](#when "Permalink")

GitLab 确实支持[`when`关键字](../yaml/README.html#when) ，用于指示在（或尽管发生）故障的情况下应在何时运行作业，但是大多数用于控制管道的逻辑都可以在我们功能非常强大的[`only/except`规则系统中找到](../yaml/README.html#onlyexcept-basic) （另请参见[高级语法](../yaml/README.html#onlyexcept-basic) ）：

```
my_job:
  only: [branches] 
```