返回主页 学习路径
Jenkins
持续集成 · 持续交付 · 自动化
Jenkins 是由 Kohsuke Kawaguchi 于 2004 年创建的开源自动化服务器,是持续集成(CI)和持续交付(CD)领域最流行的工具。Jenkins 提供了 1800+ 插件,支持从代码构建、测试到部署的全流程自动化。Jenkins 是全球 DevOps 工具链的核心组件,被 Netflix、Uber、Etsy 等众多公司用于自动化流水线。
CI/CD 自动化之王 · 开源
📅 诞生时间2004年 · Kohsuke Kawaguchi
🧩 类型CI/CD 自动化
📊 语言Java / Groovy
⚡性能
8/10
📦生态
10/10
🧠易用
6/10
🚀扩展性
8/10

📑 本文目录

📌 第一部分:Jenkins 概览与定位

1.1 定义与全称

Jenkins 是由 Kohsuke Kawaguchi 于 2004 年创建的开源自动化服务器,是持续集成(CI)和持续交付(CD)领域最流行的工具。Jenkins 提供了 1800+ 插件,支持从代码构建、测试到部署的全流程自动化。

1.2 核心定位

Jenkins 的核心定位是 开源 CI/CD 自动化服务器。它提供了:

1.3 主要应用领域

1.4 知名案例


📜 第二部分:Jenkins 的历史与发展演进

2.1 诞生背景(2004年)

Jenkins 最初名为 Hudson,由 Kohsuke Kawaguchi 于 2004 年在 Sun Microsystems 创建。2011 年,由于 Oracle 与社区的分歧,项目更名为 Jenkins。

2.2 关键版本里程碑


⚙️ 第三部分:核心语法与操作

3.1 声明式流水线(Declarative Pipeline)

// Jenkinsfile(声明式流水线)
pipeline {
    agent any

    // 环境变量
    environment {
        APP_NAME = "my-app"
        DOCKER_REGISTRY = "docker.io/myorg"
    }

    // 工具配置
    tools {
        maven "Maven 3.8"
        jdk "JDK 11"
    }

    // 参数
    parameters {
        string(name: "BRANCH", defaultValue: "main", description: "构建分支")
        choice(name: "ENV", choices: ["dev", "staging", "prod"], description: "部署环境")
        booleanParam(name: "RUN_TESTS", defaultValue: true, description: "是否运行测试")
    }

    // 触发器
    triggers {
        cron("H 2 * * *")  // 每天凌晨 2 点触发
        pollSCM("H/5 * * * *")  // 每 5 分钟检查代码变更
        githubPush()  // GitHub Push 触发
    }

    // 阶段
    stages {
        stage("Checkout") {
            steps {
                git branch: params.BRANCH,
                    url: "https://github.com/org/repo.git",
                    credentialsId: "github-cred"
            }
        }

        stage("Build") {
            steps {
                sh "mvn clean compile"
            }
        }

        stage("Test") {
            when {
                expression { params.RUN_TESTS }
            }
            steps {
                sh "mvn test"
            }
            post {
                always {
                    junit "**/target/surefire-reports/*.xml"
                }
            }
        }

        stage("Package") {
            steps {
                sh "mvn package"
                sh "docker build -t ${DOCKER_REGISTRY}/${APP_NAME}:${BUILD_NUMBER} ."
            }
        }

        stage("Deploy") {
            when {
                expression { params.ENV == "staging" || params.ENV == "prod" }
            }
            steps {
                sh "docker push ${DOCKER_REGISTRY}/${APP_NAME}:${BUILD_NUMBER}"
                sh "kubectl set image deployment/${APP_NAME} ${APP_NAME}=${DOCKER_REGISTRY}/${APP_NAME}:${BUILD_NUMBER} -n ${params.ENV}"
            }
        }
    }

    // 后处理
    post {
        success {
            emailext (
                subject: "构建成功: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
                body: "构建成功,请查看详情",
                to: "team@example.com"
            )
        }
        failure {
            emailext (
                subject: "构建失败: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
                body: "构建失败,请检查日志",
                to: "team@example.com"
            )
        }
        always {
            cleanWs()  // 清理工作空间
        }
    }
}

3.2 脚本式流水线(Scripted Pipeline)

// Jenkinsfile(脚本式流水线)
node {
    // 环境变量
    env.APP_NAME = "my-app"
    env.DOCKER_REGISTRY = "docker.io/myorg"

    stage("Checkout") {
        checkout scm
    }

    stage("Build") {
        sh "mvn clean compile"
    }

    stage("Test") {
        try {
            sh "mvn test"
        } catch (Exception e) {
            currentBuild.result = "UNSTABLE"
            throw e
        } finally {
            junit "**/target/surefire-reports/*.xml"
        }
    }

    stage("Package") {
        sh "mvn package"
        sh "docker build -t ${env.DOCKER_REGISTRY}/${env.APP_NAME}:${env.BUILD_NUMBER} ."
    }

    stage("Deploy") {
        withCredentials([
            string(credentialsId: "k8s-token", variable: "K8S_TOKEN")
        ]) {
            sh """
                docker push ${env.DOCKER_REGISTRY}/${env.APP_NAME}:${env.BUILD_NUMBER}
                kubectl set image deployment/${env.APP_NAME} \
                    ${env.APP_NAME}=${env.DOCKER_REGISTRY}/${env.APP_NAME}:${env.BUILD_NUMBER} \
                    -n ${params.ENV}
            """
        }
    }

    stage("Notify") {
        emailext (
            subject: "构建结果: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
            body: "构建 ${currentBuild.result},请查看详情",
            to: "team@example.com"
        )
    }
}

3.3 共享库(Shared Library)

// vars/myBuild.groovy(共享库代码)
def call(Map config) {
    node {
        stage("Checkout") {
            git branch: config.branch ?: "main",
                url: config.repoUrl,
                credentialsId: config.credentialsId
        }

        stage("Build") {
            if (config.buildTool == "maven") {
                sh "mvn clean compile"
            } else if (config.buildTool == "gradle") {
                sh "gradle build"
            }
        }

        stage("Test") {
            sh "${config.testCmd ?: "mvn test"}"
        }

        stage("Deploy") {
            if (config.deployTo) {
                sh "kubectl set image deployment/${config.appName} ${config.appName}=${config.imageTag} -n ${config.deployTo}"
            }
        }
    }
}

// 使用共享库
@Library("my-shared-library") _
myBuild(
    repoUrl: "https://github.com/org/repo.git",
    buildTool: "maven",
    appName: "my-app",
    deployTo: "staging",
    imageTag: "${env.BUILD_NUMBER}"
)

3.4 常用插件

3.5 与 GitHub Actions 对比

对比项 Jenkins GitHub Actions
托管方式自托管云托管/自托管
价格免费免费(有限)
插件/生态1800+快速增长
学习曲线陡峭平缓
维护成本
适用场景复杂流水线GitHub 原生

🧠 第四部分:学习建议

1
基础入门

Jenkins 安装、界面操作、创建简单 Job

2
核心进阶

Pipeline 语法、插件使用、分布式构建

3
高级特性

共享库、Docker/K8s 集成、安全配置

4
实战应用

CI/CD 流水线设计、GitOps、大规模部署

推荐学习资源


🎯 总结升华

Jenkins 是 CI/CD 领域的"老牌劲旅"。

它用 插件化架构、流水线即代码、丰富的生态 支撑了全球无数 DevOps 流水线。Jenkins 是自动化运维的核心工具。

"Jenkins 让持续集成变得简单而强大。" 🔧

🔖 相关标签
#CI/CD #DevOps #自动化 #持续集成 #Pipeline #Jenkins
📄 本文档为 Jenkins 完整白皮书 · 最后更新于 2026年06月28日