
从自建 Jenkins 迁移到腾讯云 CNB,核心是把 Jenkinsfile(Groovy)改写成 .cnb.yml(YAML 声明式)。本文提供触发规则、Pipeline/Stage/Job、Docker 镜像构建推送等完整可运行示例,手把手带你完成配置改写与流程适配。
自建 Jenkins 的流水线大多用 Jenkinsfile 描述,它支持 Groovy 脚本,灵活性高,但也意味着很多调度、并行、环境处理的逻辑要自己写。腾讯云 CNB 则用 .cnb.yml 这个 YAML 配置文件,采用声明式语法,结构是 Pipeline / Stage / Job 三层:
jobs 写为数组时按顺序串行执行,写为对象时并行执行。两者的根本差异在于"命令式"和"声明式"的思路不同:Jenkinsfile 往往要写"怎么做"(一步步执行命令、手动组织并行),.cnb.yml 更强调"要做什么"(描述阶段和任务,调度交给平台)。理解这一点,是顺利改写配置的前提。
Jenkins 里常见的触发方式是轮询 SCM(定时检查代码仓库有没有新提交)或配置 Webhook 回调。迁移到 CNB 后,触发规则直接写在 .cnb.yml 里,用事件声明的方式表达,支持多种触发事件:
下面对比一个典型的 push 触发改写。
Jenkinsfile(Groovy)写法:
pipeline {
agent any
triggers {
// 轮询 SCM 或依赖 Webhook 配置
pollSCM('H/5 * * * *')
}
stages {
stage('Build') {
steps {
sh 'npm install'
sh 'npm run build'
}
}
}
}对应的 .cnb.yml 写法:
# 匹配 main 分支的 push 事件触发
main:
push:
- name: build
stages:
- name: install-and-build
jobs:
- name: build-job
image: node:20
script:
- npm install
- npm run build这里的关键变化是:触发条件不再单独配置,而是作为配置的顶层键(main 分支 + push 事件)直接表达。name: build 是这条流水线的名称,stages 下每个 - name 是一个阶段,阶段内的 jobs 是具体任务,每个 Job 通过 image 指定运行的 Docker 镜像、通过 script 列出要执行的命令。如果你要为多个分支配置不同流程,只需在顶层并列写出对应的分支名即可,比如为 feature/* 这类分支单独配一条只跑 lint 的轻量流水线。
可以看到,CNB 把"哪个分支、什么事件触发"直接作为配置的顶层键表达出来,不需要额外的触发器配置块。分支匹配还支持 glob 模式,可以为不同分支配置不同的构建流程,比如 main 分支跑完整构建、feature 分支只跑 lint 检查。
理解了触发规则,再来看三层结构的改写。下面是一个包含多个阶段、且阶段内并行执行任务的例子。
Jenkinsfile(Groovy)写法:
pipeline {
agent any
stages {
stage('Test') {
parallel {
stage('Unit Test') {
steps { sh 'npm test' }
}
stage('Lint') {
steps { sh 'npm run lint' }
}
}
}
stage('Package') {
steps { sh 'npm run package' }
}
}
}对应的 .cnb.yml 写法:
main:
push:
- name: ci-pipeline
stages:
- name: test-stage
jobs:
# jobs 写为对象形式(unit-test: / lint-check:)→ 并行执行
unit-test:
image: node:20
script: npm test
lint-check:
image: node:20
script: npm run lint
- name: package-stage
jobs:
- name: package-job
image: node:20
script: npm run package在 .cnb.yml 里,Job 的串并行由 jobs 的写法决定:写成对象形式时并行执行(如上例的 unit-test 与 lint-check),写成数组形式时按顺序串行执行。这相当于省去了 Jenkinsfile 里用 parallel 块显式包裹的写法,让"哪些任务并行、哪些串行"的结构一眼就能看清。
很多 Jenkins 流水线里都有一段"构建 Docker 镜像并推送到镜像仓库"的逻辑,通常要用 docker 命令一步步实现。CNB 对 Docker 生态有深度集成,下面对比镜像构建推送的改写。
Jenkinsfile(Groovy)写法:
pipeline {
agent any
stages {
stage('Build and Push Image') {
steps {
sh 'docker build -t my-app:${BUILD_NUMBER} .'
sh 'docker push my-registry/my-app:${BUILD_NUMBER}'
}
}
}
}对应的 .cnb.yml 写法:
main:
push:
- name: docker-build
services:
- docker
stages:
- name: build-and-push
jobs:
- name: docker-job
image: docker:latest
script:
- docker build -t ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:${CNB_COMMIT_SHORT} .
- docker push ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:${CNB_COMMIT_SHORT}其中 ${CNB_DOCKER_REGISTRY}、${CNB_REPO_SLUG_LOWERCASE}、${CNB_COMMIT_SHORT} 都是 CNB 内置的流水线环境变量,分别代表制品库地址、仓库路径(小写)和当前提交的短 commit 号,用它们做镜像地址和标签即可把镜像推到 CNB 制品库并实现版本追溯。推送到 CNB 制品库时,平台会自动完成登录,不需要手动 docker login 或把凭据写进 .cnb.yml。镜像入库后,还能享受版本管理、漏洞扫描、访问控制等能力。
需要说明的是,如果要把镜像推到 CNB 以外的第三方仓库,才需要在流水线里用 imports 导入该仓库的登录凭据并手动 docker login;推 CNB 自家制品库则无需这一步。这一点和 Jenkins 里用凭据管理注入账号密码的思路类似,只是配置方式从 Groovy 换成了 YAML 声明。
配置改写之外,迁移时还有几个流程层面的适配点值得留意:
a. 密钥与变量:Jenkins 里常用凭据管理存储数据库密码、镜像仓库 token、发布密钥等敏感信息。迁移时要把这些凭据重新配置到 CNB 的密钥仓库里,CNB 支持通过环境变量在流水线中安全传递这类信息,避免把敏感值硬编码进 .cnb.yml 配置文件。
b. 构建资源规格:改写配置时,可以顺带在配置里声明构建节点规格。CNB 提供 amd64(1~64 核)、arm64/v8(1~16 核)、GPU(固定 16 核 + 48GB 显存)等多种节点,所有节点最大构建时长为 18 小时。有特殊系统需求的,根组织管理员还能自助接入 Mac、Windows、Linux 自托管构建机。
c. 插件能力替换:Jenkins 里依赖的插件,在 CNB 上通常有对应的内置能力或官方插件替代,迁移前对照清单逐一确认即可,不必再为插件的版本兼容性和安全补丁操心。
d. 分批迁移降低风险:如果 Jenkins 上流水线很多,建议先挑结构清晰、非核心的项目改写迁移,跑通后再逐步迁移核心链路,避免一次性迁移带来的风险。
e. 善用缓存加速构建:迁移后可以在配置里启用构建缓存,把依赖下载、编译产物等中间结果缓存下来,加速重复构建。Jenkins 里往往要自己配置缓存目录和清理策略,而 CNB 提供了内置的缓存机制,配置更省心,也能减少重复构建带来的资源消耗。
从自建 Jenkins 迁移到腾讯云 CNB,配置改写的核心是思路转换:把 Groovy 的"命令式、自己编排调度"改写成 YAML 的"声明式、描述要做什么"。触发规则用事件声明表达,并行任务靠把同一 Stage 内的 jobs 写成对象形式来实现,Docker 镜像构建推送借助平台内置的 Docker 生态和环境变量更简洁。再配合密钥仓库、多规格构建节点和自托管构建机能力,团队可以把维护 Jenkins 的精力省下来,重新聚焦到业务交付上。
如果你准备动手迁移,可以先拿一条典型的 Jenkins 流水线对照本文的示例改写成 .cnb.yml,到 腾讯云 CNB 上跑通验证,再逐步把其他流水线迁过来。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。