{{< 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_script 或 stage
|
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 关键字添加在作业或流水线级别,例如 timeout 或 retry 。 |
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 或其他云提供商或部署目标?
前提条件
在进行任何迁移工作之前,您应该首先:
- 熟悉极狐GitLab。
- 阅读有关关键极狐GitLab CI/CD 功能的信息。
- 通过教程创建您的第一个极狐GitLab流水线和更复杂的流水线,构建、测试和部署静态站点。
- 查看 CI/CD YAML 语法参考。
- 设置并配置极狐GitLab。
- 测试您的极狐GitLab实例。
- 确保runners可用,可以使用共享的 JihuLab.com runners 或安装新的 runners。
迁移步骤
- 将项目从您的 SCM 解决方案迁移到极狐GitLab。
- (推荐)您可以使用可用的导入工具自动从外部 SCM 提供商批量导入。
- 您可以通过 URL 导入存储库。
- 在每个项目中创建一个
.gitlab-ci.yml
文件。 - 将 Jenkins 配置迁移到极狐GitLab CI/CD 作业,并将其配置为直接在合并请求中显示结果。
- 使用云部署模板、环境和极狐GitLab Kubernetes 代理迁移部署作业。
- 检查任何 CI/CD 配置是否可以在不同项目中重用,然后创建并共享 CI/CD 模板。
- 检查流水线效率文档,了解如何使您的极狐GitLab CI/CD 流水线更快、更高效。
其他资源
-
您可以使用 JenkinsFile Wrapper 在极狐GitLab CI/CD 作业中运行完整的 Jenkins 实例,包括插件。使用此工具帮助缓解迁移到极狐GitLab CI/CD 的过渡,通过延迟迁移不太紧急的流水线。
{{< alert type=”note” >}}
JenkinsFile Wrapper 未打包在极狐GitLab中,不在支持范围内。
{{< /alert >}}
如果您有此处未回答的问题,极狐GitLab 社区论坛可能是一个很好的资源。