实用Jenkins持续集成与持续交付指南 | AI生成和翻译

Home 2025.03

太棒了——这就为你打造一份简洁、端到端的 Jenkins 指南,你可以立即在工作中使用。我会保持内容易于浏览,避免使用过宽的表格。

Jenkins 是什么(以及何时使用它)

Jenkins 是一个自托管的 CI/CD 自动化服务器:你将它连接到源码仓库,在 Jenkinsfile 中定义流水线,它就会在一台或多台机器(“代理节点”)上运行构建、测试和部署。流水线有两种风格——声明式(首选)和脚本式——两者均由项目提供文档支持。(Jenkins)


核心架构(通俗解释)


安装与首次运行加固(快速检查清单)

  1. 安装在 Linux 或容器镜像上。
  2. 反向代理 + TLS(Nginx/Apache、企业级负载均衡器)。
  3. Manage Jenkins → Configure Global Security
    • 设置实际的安全域(LDAP/OIDC/SAML 等)。
    • 选择一种授权模式(见下文)。(Jenkins)
  4. 创建一个管理员用户(非共享账户)。
  5. 限制注册,禁用匿名写入权限。
  6. 仅使用凭据插件——切勿在任务中硬编码密钥。(Jenkins)

访问控制(RBAC 与项目作用域)

Jenkins 自带基于矩阵的安全机制,用于细粒度权限控制(构建、配置、删除等)。适用于中小型实例或作为基础配置。(Jenkins, Jenkins Plugins)

对于大型组织和需要清晰团队隔离的场景,请安装基于角色的授权策略(”role-strategy” 插件):

提示:将每个团队的流水线放入一个文件夹中,然后在文件夹级别应用项目角色。如果需要超细粒度的调整,可与矩阵授权结合使用。(Jenkins Plugins)


凭据与密钥(安全模式)

示例(声明式):

pipeline {
  agent any
  environment {
    // 从 Username/Password 类型的凭据注入 USER 和 PASS 环境变量
    CREDS = credentials('dockerhub-creds-id')
  }
  stages {
    stage('Login') {
      steps {
        sh 'echo $CREDS_USR | docker login -u $CREDS_USR --password-stdin'
      }
    }
  }
}
pipeline {
  agent any
  stages {
    stage('Use Secret Text') {
      steps {
        withCredentials([string(credentialsId: 'slack-token', variable: 'SLACK_TOKEN')]) {
          sh 'curl -H "Authorization: Bearer $SLACK_TOKEN" https://slack.example/api'
        }
      }
    }
  }
}

用法和绑定的文档在此处。(Jenkins)


大规模使用代理节点


可靠的流水线(现代 Jenkinsfile)

声明式 vs 脚本式:优先选择声明式——结构更清晰,有防护机制(postoptionswhenenvironmentinputparallel)。(Jenkins)

最简 CI 示例:

pipeline {
  agent { label 'docker' }
  options { timestamps(); durabilityHint('PERFORMANCE_OPTIMIZED') }
  triggers { pollSCM('@daily') } // 或者在 SCM 中使用 webhooks
  stages {
    stage('Checkout') { steps { checkout scm } }
    stage('Build')    { steps { sh './gradlew build -x test' } }
    stage('Test')     { steps { sh './gradlew test' } }
    stage('Package')  { when { branch 'main' } steps { sh './gradlew assemble' } }
  }
  post {
    always { junit 'build/test-results/test/*.xml'; archiveArtifacts 'build/libs/*.jar' }
    failure { mail to: 'team@example.com', subject: "Build failed ${env.JOB_NAME} #${env.BUILD_NUMBER}" }
  }
}

关键参考: Pipeline 手册、语法参考和步骤文档。(Jenkins)


多分支、GitHub/GitLab 与 PR

使用多分支流水线或 GitHub/Bitbucket 组织任务,这样每个带有 Jenkinsfile 的仓库分支/PR 都会自动构建(通过 webhook)。将分支行为保持在代码中,避免点击操作。


大规模复用:共享库

当你在多个仓库中重复步骤时,创建一个 Jenkins 共享库(变量函数、流水线步骤),并在 Jenkinsfile 中使用 @Library('your-lib') _ 导入。这可以防止复制粘贴流水线,并集中修复问题。


配置即代码 (JCasC)

将控制器的配置视为代码:将其检入 Git,通过 PR 审查,并可重复地引导新的控制器。

JCasC 浅尝:

jenkins:
  systemMessage: "Jenkins managed by JCasC"
  authorizationStrategy:
    roleBased:
      roles:
        global:
          - name: "viewer"
            permissions:
              - "Overall/Read"
            assignments:
              - "devs"
  securityRealm:
    local:
      allowsSignup: false
      users:
        - id: "admin"
          password: "${ADMIN_PW}"
unclassified:
  location:
    url: "https://ci.example.com/"

官方文档和插件页面见上文。(Jenkins, Jenkins Plugins)


插件(明智地使用)


可观测性与维护


快速安全加固


典型的“Day-2”改进


故障排查速查


可复用的“黄金”起点

pipeline {
  agent { label 'k8s || docker || linux' }
  options { timestamps(); buildDiscarder(logRotator(numToKeepStr: '50')); ansiColor('xterm') }
  environment { JAVA_TOOL_OPTIONS = '-XX:+UseContainerSupport' }
  stages {
    stage('Checkout') { steps { checkout scm } }
    stage('Setup')    { steps { sh 'python -V || true' } }
    stage('Build')    { steps { sh './gradlew build -x test' } }
    stage('Test')     { steps { junit 'build/test-results/test/*.xml' } }
    stage('Package')  { when { branch 'main' } steps { sh './gradlew assemble' } }
    stage('Deploy')   { when { branch 'main' } steps { input 'Ship to staging?'; sh './scripts/deploy_staging.sh' } }
  }
  post {
    failure { echo "Failed: ${env.JOB_NAME} #${env.BUILD_NUMBER}" }
    always  { archiveArtifacts artifacts: 'build/libs/*.jar', fingerprint: true }
  }
}

延伸阅读(高价值文档)


如果你需要,我可以根据你的具体设置(GitHub vs GitLab、本地部署 vs k8s 代理节点,以及你的 RBAC 模型)来定制这份指南,并草拟:


Back Donate