Jenkins基础教程(8)Jenkins自动化验收测试和自动化部署:别让Jenkins再吃灰!你的代码急需这个“自动保姆”

  • 时间:2025-11-23 21:27 作者: 来源: 阅读:0
  • 扫一扫,手机访问
摘要:测试不用再追着开发屁股后面跑,部署不用再深更半夜敲命令,Jenkins就是那个让你准时下班的秘密武器。 01 苦等开发环境的黑暗历史 “我本地明明是好的!” 这句程序员经典甩锅语录,曾经在我们的开发流程中频繁出现。 记得我刚入行时,每次测试都像是一场漫长的等待。开发延期→测试时间被压缩→紧急上线后BUG频出→测试背锅,这似乎成了一个无法打破的魔咒。 测试人员去催开发打war包的时候,开发

测试不用再追着开发屁股后面跑,部署不用再深更半夜敲命令,Jenkins就是那个让你准时下班的秘密武器。

01 苦等开发环境的黑暗历史

“我本地明明是好的!”

这句程序员经典甩锅语录,曾经在我们的开发流程中频繁出现。

记得我刚入行时,每次测试都像是一场漫长的等待。开发延期→测试时间被压缩→紧急上线后BUG频出→测试背锅,这似乎成了一个无法打破的魔咒。

测试人员去催开发打war包的时候,开发总会说:’你别急,我总得写好再给你吧!现在给你,你也没法测啊~ 而且你到时候随便点点点就好了。'”

传统流程的痛苦,只有经历过的人才懂

开发预估3天完成,结果花了5天,测试人员前2天“清闲”,后3天疯狂加班急匆匆上线后,客户反馈任何问题,产品经理第一个找的就是测试测试和开发之间矛盾不断,出了问题测试背锅,没出问题是开发代码能力强

看起来“清闲”的测试,实际上内心早已崩溃。这悲伤逆流成河。

02 Jenkins:不只是个工具,更是你的自动化保姆

持续集成(CI)不是什么高大上的概念,它就是你的自动化代码保姆,一提交代码,它立马帮你验证“这玩意到底行不行”。

不用再手工运行脚本,不用等到上线时才惊觉爆雷。

为什么Jenkins能成为CI界的“劳模”?

Jenkins不是唯一的持续集成工具,但它绝对是业界最受欢迎的老将。它的强大之处在于:

插件生态系统丰富:几乎可以和所有开发工具集成高度可定制:无论你的流程多复杂,Jenkins都能搞定开源免费:不用担心许可证问题,社区活跃

Jenkins的核心价值不是让部署变得更快,而是让每次部署都更可靠。

它就像一位从不休息的质量检查员,确保每一行代码都被妥善对待。

03 3步搞定Jenkins环境搭建

搭建Jenkins环境其实很简单,跟着下面的步骤,10分钟内就能搞定。

准备工作:安装Java

由于Jenkins是基于Java开发的,所以首先需要安装Java环境:



# Ubuntu/Debian系统
sudo apt update
sudo apt install openjdk-11-jdk
 
# CentOS/RHEL系统
sudo yum install java-11-openjdk-devel

安装Jenkins的几种方式

方法一:使用包管理器安装(Ubuntu/Debian)



sudo apt update
sudo wget -O /etc/apt/sources.list.d/jenkins.list 
  https://pkg.jenkins.io/debian-stable/jenkins.list
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo apt install jenkins
sudo systemctl start jenkins
sudo systemctl enable jenkins

方法二:使用Docker安装(更推荐)


docker run -d -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts

Docker方式安装更加干净,不会污染你的主机环境。

初始配置:解锁Jenkins

打开浏览器,访问 http://你的服务器IP:8080获取初始管理员密码:

sudo cat /var/lib/jenkins/secrets/initialAdminPassword
选择“安装推荐插件”,等待安装完成创建第一个管理员账户

至此,你的Jenkins环境就准备好了!简单到就像安装一个普通软件一样。

04 深入Jenkins Pipeline核心概念

要真正掌握Jenkins,需要理解Pipeline的几个核心概念。

Pipeline as Code:你的流水线也是代码

Jenkins Pipeline是一种基于Groovy的脚本语言,允许你将整个CI/CD流程定义为代码。

这意味着你的构建、测试、部署流程可以和项目代码一起进行版本控制,随时追溯和复用。

Stages(阶段):把你的流程分块

阶段是Pipeline的骨架,它把整个流程划分为逻辑上的几个步骤。典型的阶段包括:

Checkout:从版本库拉取代码Build:编译源代码Test:运行自动化测试Deploy:部署到目标环境

把大象装进冰箱需要三步,把代码变成可运行的服务也需要明确的阶段划分。

Steps(步骤):具体执行的任务

步骤是Pipeline的肌肉,是实际执行工作的部分。常见的步骤包括:

sh:执行Shell命令 echo:输出信息 checkout:从版本控制系统检出代码

Agents(代理):指定执行环境

代理指定了整个Pipeline或者在特定阶段在哪里执行,你可以让不同阶段在不同的机器上运行。

05 完整的Jenkins自动化验收测试与部署示例

下面我们来看一个真实的Java Web项目示例,这个示例使用了Maven作为构建工具,并包含了完整的验收测试流程。

完整的Jenkinsfile示例



pipeline {
    agent any
    tools {
        maven 'Maven-3.6.3'
        jdk 'OpenJDK-11'
    }
    environment {
        APPLICATION_NAME = 'my-java-app'
        VERSION = '1.0.0'
    }
    stages {
        stage('Checkout') {
            steps {
                git branch: 'main',
                url: 'https://github.com/your-username/your-java-project.git'
            }
        }
        stage('Build') {
            steps {
                sh 'mvn clean compile'
            }
        }
        stage('Unit Test') {
            steps {
                sh 'mvn test'
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml'
                }
            }
        }
        stage('Integration Test') {
            steps {
                sh 'mvn verify -Pintegration-tests'
            }
            post {
                always {
                    junit 'target/failsafe-reports/*.xml'
                }
            }
        }
        stage('Build Docker Image') {
            steps {
                sh 'docker build -t ${APPLICATION_NAME}:${VERSION} .'
            }
        }
        stage('Deploy to Test') {
            steps {
                sh 'docker-compose -f docker-compose.test.yml up -d'
            }
        }
        stage('Acceptance Test') {
            steps {
                sh 'mvn test -Pacceptance-tests'
                script {
                    try {
                        sh 'npm test -- --runInBand'
                    } catch (e) {
                        error "验收测试失败,请检查测试报告"
                    }
                }
            }
            post {
                always {
                    publishHTML([
                        allowMissing: false,
                        alwaysLinkToLastBuild: false,
                        keepAll: true,
                        reportDir: 'target/site/serenity',
                        reportFiles: 'index.html',
                        reportName: 'Serenity 测试报告'
                    ])
                }
            }
        }
        stage('Deploy to Production') {
            when {
                expression {
                    currentBuild.result == null || currentBuild.result == 'SUCCESS'
                }
            }
            steps {
                sh 'docker tag ${APPLICATION_NAME}:${VERSION} your-registry/${APPLICATION_NAME}:${VERSION}'
                sh 'docker push your-registry/${APPLICATION_NAME}:${VERSION}'
                sh 'kubectl set image deployment/${APPLICATION_NAME} ${APPLICATION_NAME}=your-registry/${APPLICATION_NAME}:${VERSION}'
            }
        }
    }
    post {
        always {
            echo "流水线执行完毕!"
            emailext (
                subject: "构建通知: ${env.JOB_NAME} - ${env.BUILD_NUMBER} - ${currentBuild.result}",
                body: """
                构建项目:${env.JOB_NAME}
                构建编号:${env.BUILD_NUMBER}
                构建状态:${currentBuild.result}
                构建地址:${env.BUILD_URL}
                """,
                to: "dev-team@yourcompany.com"
            )
        }
        success {
            echo "构建成功!赶紧去喝杯咖啡奖励自己吧!"
        }
        failure {
            echo "构建失败,别灰心,检查一下日志再来一次!"
        }
    }
}

关键阶段解析

验收测试阶段:这是确保代码质量的关键环节



stage('Acceptance Test') {
    steps {
        sh 'mvn test -Pacceptance-tests'
        script {
            try {
                sh 'npm test -- --runInBand'
            } catch (e) {
                error "验收测试失败,请检查测试报告"
            }
        }
    }
}

这个阶段运行验收测试,确保应用程序满足业务需求。如果测试失败,整个流水线就会停止,防止有问题的代码进入生产环境。

部署到生产环境:使用Kubernetes进行容器化部署



stage('Deploy to Production') {
    when {
        expression {
            currentBuild.result == null || currentBuild.result == 'SUCCESS'
        }
    }
    steps {
        sh 'kubectl set image deployment/${APPLICATION_NAME} ${APPLICATION_NAME}=your-registry/${APPLICATION_NAME}:${VERSION}'
    }
}

这个阶段只有在之前所有阶段都成功的情况下才会执行,确保只有通过测试的代码才能进入生产环境。

06 自动化验收测试实战技巧

测试金字塔与Jenkins流水线

在Jenkins中实现有效的自动化验收测试,需要遵循测试金字塔原则:

单元测试:数量最多,运行速度最快,在Build和Unit Test阶段执行集成测试:数量中等,在Integration Test阶段执行验收测试:数量最少但最重要,在Acceptance Test阶段执行

测试数据管理

验收测试中最棘手的往往是测试数据的管理。以下是一些最佳实践:



stage('Prepare Test Data') {
    steps {
        script {
            // 重置测试数据库
            sh 'flyway -configFiles=test/flyway.conf clean migrate'
            
            // 导入基础测试数据
            sh 'mysql -h test-db -u tester -p${TEST_DB_PASSWORD} testdb < test/data/base_data.sql'
            
            // 生成特定测试场景的数据
            sh 'python test/scripts/generate_test_data.py --scenario acceptance'
        }
    }
}

测试环境隔离

为了确保验收测试的可靠性,每个流水线都应该有独立的测试环境:



stage('Setup Test Environment') {
    steps {
        sh 'docker-compose -p ${BUILD_TAG} -f docker-compose.test.yml up -d'
        script {
            // 等待服务完全启动
            timeout(time: 2, unit: 'MINUTES') {
                waitUntil {
                    try {
                        sh 'curl -f http://test-app:8080/health'
                        return true
                    } catch (e) {
                        return false
                    }
                }
            }
        }
    }
}

07 高级部署策略:蓝绿部署与金丝雀发布

在Jenkins中,可以实现高级部署策略,如蓝绿部署和金丝雀发布,以减少部署风险。

蓝绿部署实现

蓝绿部署通过在两组相同的生产环境之间切换流量,实现零停机部署:



stage('Blue-Green Deployment') {
    steps {
        script {
            // 判断当前是蓝色环境还是绿色环境
            def currentColor = sh(returnStdout: true, script: 'kubectl get service/app-service -o jsonpath="{.spec.selector.color}"').trim()
            def newColor = currentColor == 'blue' ? 'green' : 'blue'
            
            // 部署新版本到非活动环境
            sh "kubectl set image deployment/app-${newColor} app=your-registry/${APPLICATION_NAME}:${VERSION}"
            
            // 等待新环境就绪
            sh "kubectl rollout status deployment/app-${newColor}"
            
            // 切换流量到新环境
            sh "kubectl patch service/app-service -p '{"spec":{"selector":{"color":"${newColor}"}}}'"
            
            echo "流量已从 ${currentColor} 环境切换到 ${newColor} 环境"
        }
    }
}

金丝雀发布

金丝雀发布逐步将生产流量引导到新版本,以便在全面部署前发现问题:



stage('Canary Release') {
    steps {
        script {
            // 部署金丝雀版本(先部署1个副本)
            sh 'kubectl set image deployment/app canary=your-registry/${APPLICATION_NAME}:${VERSION}'
            sh 'kubectl scale deployment/app --replicas=1'
            
            // 将10%的流量引导到金丝雀版本
            sh 'kubectl apply -f k8s/canary-traffic-split.yaml'
            
            echo "金丝雀部署已启动,10%的流量被引导到新版本"
            echo "等待5分钟观察监控指标..."
            sleep 300
                    
            // 检查金丝雀版本的关键指标
            def canaryHealthy = sh(returnStdout: true, script: 'scripts/check-canary-health.sh').trim()
            
            if (canaryHealthy == 'healthy') {
                echo "金丝雀健康,开始全面部署"
                sh 'kubectl scale deployment/app --replicas=5'
                sh 'kubectl apply -f k8s/full-traffic-split.yaml'
            } else {
                echo "金丝雀不健康,回滚部署"
                sh 'kubectl rollout undo deployment/app'
                error "金丝雀部署失败,已回滚"
            }
        }
    }
}

08 Jenkins流水线优化与最佳实践

并行执行加速构建

通过并行执行阶段,可以显著缩短流水线执行时间:



stage('Parallel Tests') {
    parallel {
        stage('Unit Tests') {
            steps {
                sh 'mvn test'
            }
        }
        stage('Integration Tests') {
            steps {
                sh 'mvn verify -Pintegration-tests'
            }
        }
        stage('Static Analysis') {
            steps {
                sh 'mvn sonar:sonar -Dsonar.projectKey=my-project'
            }
        }
    }
}

错误处理与重试机制

增强流水线的健壮性:



stage('Deploy with Retry') {
    steps {
        retry(3) {
            script {
                try {
                    sh 'kubectl apply -f k8s/production-deployment.yaml'
                    timeout(time: 5, unit: 'MINUTES') {
                        sh 'kubectl rollout status deployment/production'
                    }
                } catch (e) {
                    echo "部署失败,尝试回滚"
                    sh 'kubectl rollout undo deployment/production'
                    error "部署失败: ${e.message}"
                }
            }
        }
    }
}

环境一致性管理

确保从开发到生产环境的一致性:



environment {
    DB_URL = credentials('db-url')
    API_KEY = credentials('api-key')
    NODE_ENV = 'production'
}

09 真实案例:HackRF批量生产测试系统

在HackRF(低成本软件无线电平台)的批量生产流程中,基于Jenkins CI构建的自动化测试系统确保了每台设备的硬件性能与固件稳定性。

系统架构与核心组件

HackRF的自动化测试系统采用Docker容器化与Jenkins Pipeline结合的架构,核心组件包括:

Docker镜像:封装完整测试环境,包含编译工具链、依赖库和测试脚本Jenkinsfile:定义多阶段测试流程测试脚本集:包含Python测试框架和Shell脚本

Jenkins Pipeline工作流解析

Jenkins流水线通过Jenkinsfile定义三阶段自动化流程,总执行时间约15分钟/设备:



stage('Build Docker Image') {
    steps {
        sh 'docker build -t hackrf https://github.com/greatscottgadgets/hackrf.git'
    }
}

测试阶段在Docker容器内执行,核心步骤包括:

环境初始化:安装主机工具链与固件固件烧录验证:通过DFU模式编程固件并验证设备识别射频性能测试:执行16项射频指标测试

成果与价值

HackRF的Jenkins自动化测试系统实现三大核心价值:

质量管控:100%覆盖关键射频指标,出厂良率提升至99.2%成本降低:单设备测试人力成本降低90%(从5分钟/人降至30秒/自动化)数据积累:记录每台设备的射频性能参数,形成质量分析数据库

10 结语:让自动化成为一种习惯

霍格沃兹测试学社指出,学会Jenkins之后,测试人员可以自己搞定测试环境。开发只需共享源码,其他的事情测试人员自己搞定。再也不用苦哈哈的等测试环境了!

Jenkins自动化验收测试和部署不仅仅是一个技术选择,更是一种团队文化转变。它带来的不仅是效率提升,更是质量保证和团队协作的改善

开始实践Jenkins自动化,最初可能会遇到一些挑战,但一旦你体验过它带来的便利——那些准时下班的夜晚,那些平稳上线的版本——你就会明白,这一切的努力都是值得的。

从今天开始,别再手动打包部署了,让你的Jenkins自动化保姆上岗吧!


进一步思考:自动化不是为了取代人类,而是为了让我们专注于更有价值的工作。当你把重复性工作交给Jenkins后,你会发现,你有更多时间思考架构设计、代码质量和用户体验——这些才是真正推动项目成功的关键因素。

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】Svelte框架结合SpreadJS实现纯前端类Excel在线填报(2025-11-23 22:34)
【系统环境|】在Three.js中使用HDRI贴图作为3D背景和光源(2025-11-23 22:34)
【系统环境|】看完这一篇学会MyBatis就够了(2025-11-23 22:33)
【系统环境|】linux ps命令详解(2025-11-23 22:33)
【系统环境|】Linux日常小知识EFK(2025-11-23 22:32)
【系统环境|】Linux系统的ps命令和top命令介绍(2025-11-23 22:32)
【系统环境|】跟LaoLiu老刘记英语单词——————刘怀勋(2025-11-23 22:31)
【系统环境|】电容的滤波和退耦,真的理解了吗?(2025-11-23 22:31)
【系统环境|】共射放大电路的低频截频计算方法验证(2025-11-23 22:30)
【系统环境|】“谐音梗英文名,看看你的是什么?”(2025-11-23 22:30)
手机二维码手机访问领取大礼包
返回顶部