首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >告别自建 Jenkins:迁移到腾讯云 CNB 的配置改写与流程适配指南

告别自建 Jenkins:迁移到腾讯云 CNB 的配置改写与流程适配指南

原创
作者头像
克劳德2048
发布2026-08-31 16:40:04
发布2026-08-31 16:40:04
30
举报

摘要

从自建 Jenkins 迁移到腾讯云 CNB,核心是把 Jenkinsfile(Groovy)改写成 .cnb.yml(YAML 声明式)。本文提供触发规则、Pipeline/Stage/Job、Docker 镜像构建推送等完整可运行示例,手把手带你完成配置改写与流程适配。

一、迁移的核心:从命令式到声明式

自建 Jenkins 的流水线大多用 Jenkinsfile 描述,它支持 Groovy 脚本,灵活性高,但也意味着很多调度、并行、环境处理的逻辑要自己写。腾讯云 CNB 则用 .cnb.yml 这个 YAML 配置文件,采用声明式语法,结构是 Pipeline / Stage / Job 三层:

  • Pipeline:流水线,由一次触发事件产生的一次完整执行过程。
  • Stage:阶段,Pipeline 中的执行单元。同一个 Stage 内的多个 Job 可串行也可并行——jobs 写为数组时按顺序串行执行,写为对象时并行执行。
  • Job:任务,最小执行单元,在指定的 Docker 镜像中运行。

两者的根本差异在于"命令式"和"声明式"的思路不同:Jenkinsfile 往往要写"怎么做"(一步步执行命令、手动组织并行),.cnb.yml 更强调"要做什么"(描述阶段和任务,调度交给平台)。理解这一点,是顺利改写配置的前提。

二、触发规则改写:从轮询和 Webhook 到事件声明

Jenkins 里常见的触发方式是轮询 SCM(定时检查代码仓库有没有新提交)或配置 Webhook 回调。迁移到 CNB 后,触发规则直接写在 .cnb.yml 里,用事件声明的方式表达,支持多种触发事件:

  • Git 操作事件:push、commit.add、branch.create / branch.delete、pull_request 系列等。
  • 页面操作事件:web_trigger(手动触发)、云原生开发事件。
  • API 请求事件:api_trigger。
  • 定时任务事件:schedule。
  • 其他:Issue 事件、NPC 事件等。

下面对比一个典型的 push 触发改写。

Jenkinsfile(Groovy)写法:

代码语言:groovy
复制
pipeline {
    agent any
    triggers {
        // 轮询 SCM 或依赖 Webhook 配置
        pollSCM('H/5 * * * *')
    }
    stages {
        stage('Build') {
            steps {
                sh 'npm install'
                sh 'npm run build'
            }
        }
    }
}

对应的 .cnb.yml 写法:

代码语言:yaml
复制
# 匹配 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 检查。

三、Pipeline / Stage / Job 结构改写

理解了触发规则,再来看三层结构的改写。下面是一个包含多个阶段、且阶段内并行执行任务的例子。

Jenkinsfile(Groovy)写法:

代码语言: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 写法:

代码语言:yaml
复制
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-testlint-check),写成数组形式时按顺序串行执行。这相当于省去了 Jenkinsfile 里用 parallel 块显式包裹的写法,让"哪些任务并行、哪些串行"的结构一眼就能看清。

四、Docker 镜像构建与推送改写

很多 Jenkins 流水线里都有一段"构建 Docker 镜像并推送到镜像仓库"的逻辑,通常要用 docker 命令一步步实现。CNB 对 Docker 生态有深度集成,下面对比镜像构建推送的改写。

Jenkinsfile(Groovy)写法:

代码语言: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 写法:

代码语言:yaml
复制
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 删除。

目录
  • 摘要:
  • 一、迁移的核心:从命令式到声明式
  • 二、触发规则改写:从轮询和 Webhook 到事件声明
  • 三、Pipeline / Stage / Job 结构改写
  • 四、Docker 镜像构建与推送改写
  • 五、流程适配的几个注意点
  • 六、小结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档