{{< details >}}

  • Tier: 基础版,专业版,旗舰版
  • Offering: JihuLab.com, 私有化部署

{{< /details >}}

如果您正在从 Jenkins 迁移到极狐GitLab CI/CD,您可以创建流水线来复制并增强您的 Jenkins 工作流。

关键相似性和差异

极狐GitLab CI/CD 和 Jenkins 是具有一些相似性的 CI/CD 工具。极狐GitLab 和 Jenkins 都:

  • 使用阶段来收集作业。
  • 支持基于容器的构建。

另外,两者之间还有一些重要的差异:

  • 极狐GitLab CI/CD 流水线全部在 YAML 格式配置文件中配置。Jenkins 使用 Groovy 格式配置文件(声明性流水线)或 Jenkins DSL(脚本化流水线)。
  • 极狐GitLab 提供 JihuLab.com,一个多租户 SaaS 服务,以及 极狐GitLab Dedicated,一个完全隔离的单租户 SaaS 服务。您还可以运行自己的极狐GitLab私有化部署实例。Jenkins 部署必须是自托管的。
  • 极狐GitLab 提供开箱即用的源代码管理 (SCM)。Jenkins 需要单独的 SCM 解决方案来存储代码。
  • 极狐GitLab 提供内置的容器注册表。Jenkins 需要单独的解决方案来存储容器镜像。
  • 极狐GitLab 提供用于扫描代码的内置模板。Jenkins 需要第三方插件来扫描代码。

功能和概念比较

许多 Jenkins 功能和概念在极狐GitLab中有相应的功能提供相同的功能。

配置文件

可以使用 Groovy 格式的 Jenkinsfile 配置 Jenkins。极狐GitLab CI/CD 默认使用 .gitlab-ci.yml 文件。

Jenkinsfile 示例:

pipeline {
    agent any

    stages {
        stage('hello') {
            steps {
                echo "Hello World"
            }
        }
    }
}

相应的极狐GitLab CI/CD .gitlab-ci.yml 文件为:

stages:
  - hello

hello-job:
  stage: hello
  script:
    - echo "Hello World"

Jenkins 流水线语法

Jenkins 配置由 pipeline 块组成,其中包含部分和指令。极狐GitLab CI/CD 具有类似的功能,通过 YAML 关键字进行配置。

部分

Jenkins 极狐GitLab 解释
agent image Jenkins 流水线在代理上执行,agent 部分定义流水线的执行方式以及要使用的 Docker 容器。极狐GitLab 作业在 runners 上执行,image 关键字定义要使用的容器。您可以在 Kubernetes 中或任何主机上配置自己的 runners。
post after_scriptstage Jenkins post 部分定义应在阶段或流水线结束时执行的操作。在极狐GitLab中,使用 after_script 来运行作业结束时的命令,使用 before_script 来运行作业中的其他命令之前的操作。使用 stage 来选择作业应该运行的确切阶段。极狐GitLab 支持 .pre.post 阶段,在所有其他定义阶段之前或之后总是运行。
stages stages Jenkins 阶段是作业组。极狐GitLab CI/CD 也使用阶段,但更灵活。您可以拥有多个阶段,每个阶段具有多个独立的作业。使用顶部级别的 stages 来定义阶段及其执行顺序,并在作业级别使用 stage 来定义该作业的阶段。
steps script Jenkins steps 定义要执行的内容。极狐GitLab CI/CD 使用一个类似的 script 部分。script 部分是一个 YAML 数组,其中每个命令的条目分开,以便按顺序运行。

指令

Jenkins 极狐GitLab 解释
environment variables Jenkins 使用 environment 来定义环境变量。极狐GitLab CI/CD 使用 variables 关键字来定义可以在作业执行期间使用的 CI/CD 变量,也用于更动态的流水线配置。这些也可以在极狐GitLab UI 中,在 CI/CD 设置中设置。
options 不适用 Jenkins 使用 options 来进行附加配置,包括超时和重试值。极狐GitLab 不需要单独的选项部分,所有配置都作为 CI/CD 关键字添加在作业或流水线级别,例如 timeoutretry
parameters 不适用 在 Jenkins 中,触发流水线时可以需要参数。极狐GitLab 中的参数通过 CI/CD 变量处理,可以在多个地方定义,包括流水线配置、项目设置、通过 UI 手动运行时或 API。
triggers rules 在 Jenkins 中,triggers 定义流水线应何时再次运行,例如通过 cron 表示法。极狐GitLab CI/CD 可以自动运行流水线,原因包括 Git 更改和合并请求更新。使用 rules 关键字来控制哪些事件来运行作业。计划的流水线在项目设置中定义。
tools 不适用 在 Jenkins 中,tools 定义要在环境中安装的其他工具。极狐GitLab 没有类似的关键字,因为建议使用预构建的容器镜像,其中包含作业所需的确切工具。这些镜像可以缓存并可以构建以已经包含您流水线所需的工具。如果作业需要额外的工具,它们可以作为 before_script 部分的一部分安装。
input 不适用 在 Jenkins 中,input 添加用户输入的提示。类似于 parameters,输入在极狐GitLab中通过 CI/CD 变量处理。
when rules 在 Jenkins 中,when 定义何时应该执行阶段。极狐GitLab 也有一个 when 关键字,定义作业是否应该开始运行,基于之前作业的状态,例如作业是否通过或失败。要控制何时将作业添加到特定流水线,使用 rules

常见配置

本节介绍常用的 CI/CD 配置,展示如何将其从 Jenkins 转换为极狐GitLab CI/CD。

Jenkins 流水线 生成自动化 CI/CD 作业,当发生某些事件时触发,例如推送新提交。Jenkins 流水线在 Jenkinsfile 中定义。极狐GitLab 的等效配置文件是 .gitlab-ci.yml 配置文件

Jenkins 不提供存储源代码的地方,因此 Jenkinsfile 必须存储在单独的源代码控制库中。

作业

作业是一组按顺序运行的命令,以实现特定结果。

例如,构建一个容器,然后将其部署到生产环境,在 Jenkinsfile 中:

pipeline {
    agent any
    stages {
        stage('build') {
            agent { docker 'golang:alpine' }
            steps {
                apk update
                go build -o bin/hello
            }
            post {
              always {
                archiveArtifacts artifacts: 'bin/hello'
                onlyIfSuccessful: true
              }
            }
        }
        stage('deploy') {
            agent { docker 'golang:alpine' }
            when {
              branch 'staging'
            }
            steps {
                echo "Deploying to staging"
                scp bin/hello remoteuser@remotehost:/remote/directory
            }
        }
    }
}

这个例子:

  • 使用 golang:alpine 容器镜像。
  • 运行一个用于构建代码的作业。
    • 将构建的可执行文件存储为产物。
  • 添加第二个作业以部署到 staging,该作业:
    • 仅在提交目标是 staging 分支时存在。
    • 在构建阶段成功后开始。
    • 使用早期作业构建的可执行文件产物。

相应的极狐GitLab CI/CD .gitlab-ci.yml 文件为:

default:
  image: golang:alpine

stages:
  - build
  - deploy

build-job:
  stage: build
  script:
    - apk update
    - go build -o bin/hello
  artifacts:
    paths:
      - bin/hello
    expire_in: 1 week

deploy-job:
  stage: deploy
  script:
    - echo "Deploying to Staging"
    - scp bin/hello remoteuser@remotehost:/remote/directory
  rules:
    - if: $CI_COMMIT_BRANCH == 'staging'
  artifacts:
    paths:
      - bin/hello

并行

在 Jenkins 中,添加到 parallel 部分的作业可以在没有前一个作业依赖的情况下并行运行。

例如,在 Jenkinsfile 中:

pipeline {
    agent any
    stages {
        stage('Parallel') {
            parallel {
                stage('Python') {
                    agent { docker 'python:latest' }
                    steps {
                        sh "python --version"
                    }
                }
                stage('Java') {
                    agent { docker 'openjdk:latest' }
                    when {
                        branch 'staging'
                    }
                    steps {
                        sh "java -version"
                    }
                }
            }
        }
    }
}

这个示例使用不同的容器镜像并行运行 Python 和 Java 作业。Java 作业仅在 staging 分支更改时运行。

相应的极狐GitLab CI/CD .gitlab-ci.yml 文件为:

python-version:
  image: python:latest
  script:
    - python --version

java-version:
  image: openjdk:latest
  rules:
    - if: $CI_COMMIT_BRANCH == 'staging'
  script:
    - java -version

在这种情况下,不需要额外配置即可使作业并行运行。作业默认并行运行,每个作业在不同的 runner 上,假设有足够的 runner 供所有作业使用。Java 作业设置为仅在 staging 分支更改时运行。

矩阵

在极狐GitLab中,您可以使用矩阵在单个流水线中并行运行多次作业,但每个作业实例使用不同的变量值。Jenkins 依次运行矩阵。

例如,在 Jenkinsfile 中:

matrix {
    axes {
        axis {
            name 'PLATFORM'
            values 'linux', 'mac', 'windows'
        }
        axis {
            name 'ARCH'
            values 'x64', 'x86'
        }
    }
    stages {
        stage('build') {
            echo "Building $PLATFORM for $ARCH"
        }
        stage('test') {
            echo "Building $PLATFORM for $ARCH"
        }
        stage('deploy') {
            echo "Building $PLATFORM for $ARCH"
        }
    }
}

相应的极狐GitLab CI/CD .gitlab-ci.yml 文件为:

stages:
  - build
  - test
  - deploy

.parallel-hidden-job:
  parallel:
    matrix:
      - PLATFORM: [linux, mac, windows]
        ARCH: [x64, x86]

build-job:
  extends: .parallel-hidden-job
  stage: build
  script:
    - echo "Building $PLATFORM for $ARCH"

test-job:
  extends: .parallel-hidden-job
  stage: test
  script:
    - echo "Testing $PLATFORM for $ARCH"

deploy-job:
  extends: .parallel-hidden-job
  stage: deploy
  script:
    - echo "Testing $PLATFORM for $ARCH"

容器镜像

在极狐GitLab中,您可以使用 image 关键字在单独、隔离的 Docker 容器中运行 CI/CD 作业

例如,在 Jenkinsfile 中:

stage('Version') {
    agent { docker 'python:latest' }
    steps {
        echo 'Hello Python'
        sh 'python --version'
    }
}

此示例显示命令在 python:latest 容器中运行。

相应的极狐GitLab CI/CD .gitlab-ci.yml 文件为:

version-job:
  image: python:latest
  script:
    - echo "Hello Python"
    - python --version

变量

在极狐GitLab中,使用 variables 关键字来定义 CI/CD 变量。使用变量来重用配置数据,具有更动态的配置或存储重要值。变量可以在全局或每个作业中定义。

例如,在 Jenkinsfile 中:

pipeline {
    agent any
    environment {
        NAME = 'Fern'
    }
    stages {
        stage('English') {
            environment {
                GREETING = 'Hello'
            }
            steps {
                sh 'echo "$GREETING $NAME"'
            }
        }
        stage('Spanish') {
            environment {
                GREETING = 'Hola'
            }
            steps {
                sh 'echo "$GREETING $NAME"'
            }
        }
    }
}

这个示例显示如何使用变量将值传递给作业中的命令。

相应的极狐GitLab CI/CD .gitlab-ci.yml 文件为:

default:
  image: alpine:latest

stages:
  - greet

variables:
  NAME: "Fern"

english:
  stage: greet
  variables:
    GREETING: "Hello"
  script:
    - echo "$GREETING $NAME"

spanish:
  stage: greet
  variables:
    GREETING: "Hola"
  script:
    - echo "$GREETING $NAME"

变量也可以在极狐GitLab UI 中,在 CI/CD 设置中 设置。在某些情况下,您可以使用 受保护屏蔽 变量来存储密钥。这些变量可以在流水线作业中访问,与配置文件中定义的变量一样。

例如,在 Jenkinsfile 中:

pipeline {
    agent any
    stages {
        stage('Example Username/Password') {
            environment {
                AWS_ACCESS_KEY = credentials('aws-access-key')
            }
            steps {
                sh 'my-login-script.sh $AWS_ACCESS_KEY'
            }
        }
    }
}

相应的极狐GitLab CI/CD .gitlab-ci.yml 文件为:

login-job:
  script:
    - my-login-script.sh $AWS_ACCESS_KEY

此外,极狐GitLab CI/CD 将 预定义变量 提供给每个流水线和作业,其中包含与流水线和存储库相关的值。

表达式和条件

当新流水线启动时,极狐GitLab 检查哪些作业应该在该流水线中运行。您可以配置作业以根据变量的状态或流水线类型等因素运行。

例如,在 Jenkinsfile 中:

stage('deploy_staging') {
    agent { docker 'alpine:latest' }
    when {
        branch 'staging'
    }
    steps {
        echo "Deploying to staging"
    }
}

在这个例子中,作业仅在我们提交的分支名为 staging 时运行。

相应的极狐GitLab CI/CD .gitlab-ci.yml 文件为:

deploy_staging:
  stage: deploy
  script:
    - echo "Deploy to staging server"
  rules:
    - if: '$CI_COMMIT_BRANCH == staging'

Runners

像 Jenkins 代理一样,极狐GitLab runners 是运行作业的主机。如果您正在使用 JihuLab.com,您可以使用 实例 runner 队列 来运行作业,而无需自己配置 runners。

要将 Jenkins 代理转换为极狐GitLab CI/CD 使用,请卸载代理,然后安装并注册 runner。runners 不需要太多开销,因此您可能能够使用与您使用的 Jenkins 代理类似的配置。

关于 runners 的一些关键细节:

  • runners 可以配置为共享整个实例、群组或专用于单个项目。
  • 您可以使用 tags 关键字进行更细致的控制,并将 runners 与特定作业关联。例如,您可以为需要专用、更强大或特定硬件的作业使用标签。
  • 极狐GitLab具有 runners 的自动缩放。使用自动缩放在需要时配置 runners,并在不需要时缩小规模。

例如,在 Jenkinsfile 中:

pipeline {
    agent none
    stages {
        stage('Linux') {
            agent {
                label 'linux'
            }
            steps {
                echo "Hello, $USER"
            }
        }
        stage('Windows') {
            agent {
                label 'windows'
            }
            steps {
                echo "Hello, %USERNAME%"
            }
        }
    }
}

相应的极狐GitLab CI/CD .gitlab-ci.yml 文件为:

linux_job:
  stage: build
  tags:
    - linux
  script:
    - echo "Hello, $USER"

windows_job:
  stage: build
  tags:
    - windows
  script:
    - echo "Hello, %USERNAME%"

产物

在极狐GitLab中,任何作业都可以使用 artifacts 关键字来定义作业完成时要存储的一组产物。产物 是可以在后续作业中使用的文件,例如用于测试或部署。

例如,在 Jenkinsfile 中:

stages {
    stage('Generate Cat') {
        steps {
            sh 'touch cat.txt'
            sh 'echo "meow" > cat.txt'
        }
        post {
            always {
                archiveArtifacts artifacts: 'cat.txt'
                onlyIfSuccessful: true
            }
        }
    }
    stage('Use Cat') {
        steps {
            sh 'cat cat.txt'
        }
    }
  }

相应的极狐GitLab CI/CD .gitlab-ci.yml 文件为:

stages:
  - generate
  - use

generate_cat:
  stage: generate
  script:
    - touch cat.txt
    - echo "meow" > cat.txt
  artifacts:
    paths:
      - cat.txt
    expire_in: 1 week

use_cat:
  stage: use
  script:
    - cat cat.txt
  artifacts:
    paths:
      - cat.txt

缓存

当作业下载一个或多个文件并保存它们以便将来更快地访问时,会创建一个缓存。使用相同缓存的后续作业不必再次下载文件,因此它们执行得更快。缓存存储在 runner 上,并上传到 S3 如果启用了分布式缓存。Jenkins 核心不提供缓存。

例如,在 .gitlab-ci.yml 文件中:

cache-job:
  script:
    - echo "This job uses a cache."
  cache:
    key: binaries-cache-$CI_COMMIT_REF_SLUG
    paths:
      - binaries/

Jenkins 插件

在 Jenkins 中通过插件启用的一些功能,在极狐GitLab中通过关键字和功能提供类似的功能。例如:

Jenkins 插件 极狐GitLab 功能
构建超时 timeout 关键字
Cobertura 覆盖率报告产物代码覆盖率
代码覆盖率 API 代码覆盖率覆盖率可视化
可嵌入构建状态 流水线状态徽章
JUnit JUnit 测试报告产物单元测试报告
邮件 通知邮件
参数化触发器插件 trigger 关键字下游流水线
基于角色的授权策略 极狐GitLab 权限和角色
时间戳 作业 日志默认带有时间戳

安全扫描功能

您可能已在 Jenkins 中使用了代码质量、安全性或静态应用程序扫描等插件。极狐GitLab提供安全扫描仪来检测 SDLC 各个部分中的漏洞。您可以使用模板在极狐GitLab中添加这些插件,例如要将 SAST 扫描添加到您的流水线,请将以下内容添加到您的 .gitlab-ci.yml

include:
  - template: Jobs/SAST.gitlab-ci.yml

您可以通过使用 CI/CD 变量来定制安全扫描仪的行为,例如使用 SAST 扫描仪

密钥管理

敏感信息,通常称为“密钥”,是您在 CI/CD 工作流中需要的敏感信息或凭证。您可能会使用密钥来解锁受保护的资源或工具、应用程序、容器和云原生环境中的敏感信息。

Jenkins 中的密钥管理通常通过 Secret 类型字段或凭证插件处理。存储在 Jenkins 设置中的凭证可以通过使用凭证绑定插件作为环境变量暴露给作业。

在极狐GitLab中进行密钥管理,您可以使用支持的外部服务集成之一。这些服务将密钥安全地存储在极狐GitLab项目之外,但您必须为该服务订阅:

极狐GitLab还支持OIDC 认证 用于其他支持 OIDC 的第三方服务。

此外,您可以通过将凭证存储在 CI/CD 变量中,使其可用于作业,但存储为纯文本的密钥容易被意外泄露,与 Jenkins 中相同。您应该始终将敏感信息存储在屏蔽受保护 变量中,以减轻一些风险。

此外,切勿将密钥作为变量存储在 .gitlab-ci.yml 文件中,该文件对所有有项目访问权限的用户都是公开的。仅在项目、群组或实例设置中进行变量存储敏感信息。

查看安全指南,以提高 CI/CD 变量的安全性。

规划和执行迁移

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

创建迁移计划

在开始迁移之前,您应该创建一个迁移计划来为迁移做好准备。对于从 Jenkins 迁移,您可以在准备过程中问自己以下问题:

  • 今天 Jenkins 作业使用了哪些插件?
    • 您是否确切知道这些插件的作用?
    • 是否有任何插件包装了常用的构建工具?例如,Maven、Gradle 或 NPM?
  • Jenkins 代理上安装了什么?
  • 是否在使用共享库?
  • 您如何从 Jenkins 进行身份验证?您是否使用 SSH 密钥、API 令牌或其他密钥?
  • 是否有其他项目需要从您的流水线访问?
  • Jenkins 中是否存在用于访问外部服务的凭证?例如 Ansible Tower、Artifactory 或其他云提供商或部署目标?

前提条件

在进行任何迁移工作之前,您应该首先:

  1. 熟悉极狐GitLab。
  2. 设置并配置极狐GitLab。
  3. 测试您的极狐GitLab实例。
    • 确保runners可用,可以使用共享的 JihuLab.com runners 或安装新的 runners。

迁移步骤

  1. 将项目从您的 SCM 解决方案迁移到极狐GitLab。
  2. 在每个项目中创建一个 .gitlab-ci.yml 文件。
  3. 将 Jenkins 配置迁移到极狐GitLab CI/CD 作业,并将其配置为直接在合并请求中显示结果。
  4. 使用云部署模板环境极狐GitLab Kubernetes 代理迁移部署作业。
  5. 检查任何 CI/CD 配置是否可以在不同项目中重用,然后创建并共享 CI/CD 模板。
  6. 检查流水线效率文档,了解如何使您的极狐GitLab CI/CD 流水线更快、更高效。

其他资源

  • 您可以使用 JenkinsFile Wrapper 在极狐GitLab CI/CD 作业中运行完整的 Jenkins 实例,包括插件。使用此工具帮助缓解迁移到极狐GitLab CI/CD 的过渡,通过延迟迁移不太紧急的流水线。

    {{< alert type=”note” >}}

    JenkinsFile Wrapper 未打包在极狐GitLab中,不在支持范围内。

    {{< /alert >}}

如果您有此处未回答的问题,极狐GitLab 社区论坛可能是一个很好的资源。