还在苦等开发部署环境?3步教你用Jenkins拿回测试主动权!

在这里插入图片描述

首先提个问题:你觉得在测试工作中,最让你抓狂的一件事情是什么?如果问我的话,我会毫不犹豫的说:最难的应该就是每一次测试都需要开发协助部署环境了吧~

尤其是遇到那种时间紧、任务重、质量要求高的工作,开发本身都自顾不暇时,这个时候测试人员只能追在运维和开发的身后让他们帮忙部署测试环境。

看起来很『清闲』的测试

一般公司测试环境的部署程序一般是这样的。等待开发完成之后提交代码,然后打成war包传给运维,由运维统一在服务器上部署(有的公司开发也负责部署环境)。部署完成后,再由测试人员来进行测试。

那么问题就来了,开发在努力写码的过程中,原本预估3天能完成的工作,结果花了5天完成。在这多余的2天时间测试人员看起来就很『清闲』。

等到测试环境部署完成之后,由于之前开发不小心的多用了几天时间进行开发,而上线时间迫在眉睫。这个时候就只能辛苦测试人员加班加点并且保质保量的完成测试工作。

这悲伤逆流成河

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

你要和开发聊一聊测试的重要性吧,开发说:你工作再重要,也得等我写好吧现在给你你也没办法测啊等拿到war包之后,距离上线的时间已所剩无几了。于是只能针对重要地方进行突破性测试。

急匆匆上线之后,客户不管反馈了任何问题,产品经理一定第一个来找测试,很愤怒的说:你是怎么测的?一堆bug。

当你一本正经的解释,是因为无法保证测试时间时,得到的答案总是尽量保证测试时间。但是悲伤的是,下一次悲伤仍在继续。测试完全陷入死循环中。

测试和开发之间的矛盾

出了问题吧,测试来背锅。没出问题吧,是开发代码能力强。这年头,做一个点点点的测试,真的是太难了。

一边是测试时间的极大压缩,一边是需要保质保量的完成工作任务,这是两个非常矛盾的点。而这两个矛盾也一度让测试和开发之间的关系不那么融洽。

其实开发小哥哥也是很委屈的。我们也不想占用测试人员的时间啊,但有的时候遇到新的问题,解决起来也是需要时间的。

解决问题是根本

那有没有一种方法,让开发人员这边写出了一部分可测代码后,交由测试人员进行测试。那这样搭配,相处就会很融洽啦,再也不需要因为测试环境的问题而有争执啦!

你别说,还真有这项神奇的技能。学会jenkins之后,自己搞定测试环境。开发只需共享源码,其他的事情测试人员自己搞定。再也不用苦哈哈的等测试环境了!

“学会 Jenkins 自己部署测试环境”不仅仅是一项技术技能,更是测试人员实现职业转型、掌握工作主动权、迈向“测试开发”或“质量保障工程师”角色的重要里程碑

测试开发快速提升技能水平的路径只有一个:找到领域专家,学习过来人的踏坑经验,并结合业务实践落地,内化成自己的能力并持续优化。站在巨人的肩膀上前行,自然可避免走很多不必要的弯路。

测试开发学习交流群
在这里插入图片描述
在这里插入图片描述

推荐阅读

<think> 我们正在讨论的是在Jenkins流水线中实现多环境开发/测试/生产)自动化部署的方法。根据用户的问题,我们需要详细说明如何通过Jenkins Pipeline来实现多环境部署,同时结合之前提到的技术栈(Jenkins, GitLab, Harbor, Docker)以及可能的Kubernetes部署。 多环境部署的关键点: 1. 环境隔离:不同的环境开发测试、生产)应该具有独立的配置,包括但不限于数据库、服务地址、密钥等。 2. 部署流程控制:通常开发环境是自动部署测试环境可能需要手动确认,生产环境则需要更严格的审批流程。 3. 配置管理:如何管理不同环境的配置(例如使用ConfigMap、环境变量文件等)。 4. 部署策略:不同环境可能采用不同的部署策略(如开发测试环境直接替换,生产环境使用蓝绿发布或金丝雀发布)。 实现方法: 1. 使用Jenkins的Pipeline,我们可以定义多个stage,每个stage对应一个环境。 2. 利用Jenkins的参数化构建,让用户可以选择要部署环境3. 使用条件判断(when)和人工确认(input)骤来控制流程。 下面是一个详细的骤说明和示例: ### 一、环境区分与配置管理 通常,我们会为每个环境准备独立的配置文件(如application-dev.properties, application-test.properties, application-prod.properties)或者使用环境变量注入。在容器化部署中,我们可以通过ConfigMap或Secret来管理这些配置。 在Jenkins中,我们可以使用“参数化构建”来指定环境,然后根据参数选择对应的配置。 ### 二、Jenkinsfile示例(多环境部署) 以下是一个支持多环境部署Jenkinsfile示例,该示例包括开发环境(自动部署)、测试环境(手动触发)和生产环境(手动触发且需要审批): ```groovy pipeline { agent any parameters { choice(name: &#39;ENVIRONMENT&#39;, choices: [&#39;dev&#39;, &#39;test&#39;, &#39;prod&#39;], description: &#39;选择部署环境&#39;) booleanParam(name: &#39;CONFIRM_PROD&#39;, defaultValue: false, description: &#39;确认部署生产环境?&#39;) } environment { REGISTRY = "harbor.yourcompany.com" PROJECT = "myapp" // 根据参数设置环境变量 KUBE_NAMESPACE = "${params.ENVIRONMENT}" // 不同环境的Kubernetes上下文(如果有多个集群或命名空间) KUBECONFIG = credentials("k8s-config-${params.ENVIRONMENT}") } stages { stage(&#39;Checkout&#39;) { steps { git branch: &#39;main&#39;, url: &#39;http://gitlab.yourcompany.com/group/project.git&#39; } } stage(&#39;Build & Test&#39;) { steps { sh &#39;mvn clean package&#39; } } stage(&#39;Build and Push Docker Image&#39;) { steps { script { docker.build("${REGISTRY}/${PROJECT}/app:${BUILD_NUMBER}").push() } } } stage(&#39;Deploy to Environment&#39;) { steps { script { // 根据选择的环境执行不同的部署骤 if (params.ENVIRONMENT == &#39;dev&#39;) { // 开发环境部署(自动) sh "kubectl apply -f k8s/deployment-dev.yaml --namespace=${KUBE_NAMESPACE}" } else if (params.ENVIRONMENT == &#39;test&#39;) { // 测试环境部署(需要手动确认) input message: &#39;确认部署测试环境?&#39;, ok: &#39;确认&#39; sh "kubectl apply -f k8s/deployment-test.yaml --namespace=${KUBE_NAMESPACE}" } else if (params.ENVIRONMENT == &#39;prod&#39;) { // 生产环境部署(需要额外确认参数) if (params.CONFIRM_PROD) { input message: &#39;请再次确认部署生产环境?&#39;, ok: &#39;确认&#39; sh "kubectl apply -f k8s/deployment-prod.yaml --namespace=${KUBE_NAMESPACE}" } else { error "生产环境部署需要确认!" } } } } } } } ``` ### 三、多环境部署的注意事项 1. **权限控制**:不同环境可能需要不同的权限。例如,生产环境部署权限应该只给特定人员。在Jenkins中可以通过“Role-based Authorization Strategy”插件来管理。 2. **配置分离**:每个环境的配置文件(如Kubernetes的YAML文件)应该分开存放,或者通过变量替换来动态生成。例如,可以使用`envsubst`命令替换模板文件中的变量。 ```bash envsubst < deployment-template.yaml > deployment-$ENV.yaml ``` 3. **部署策略**:对于生产环境,我们可能希望使用更高级的部署策略(蓝绿发布、金丝雀发布)。这可以通过Kubernetes的Ingress控制器(如Nginx Ingress)或服务网格(如Istio)来实现。在Jenkins流水线中,我们可以调用相应的kubectl命令或Helm命令来实现。 ### 四、使用条件骤优化流水线 上述示例中,我们使用了一个`Deploy to Environment`阶段,并在其中使用条件判断。另一种做法是为每个环境单独设置一个阶段,并利用Jenkins的`when`指令来控制阶段的执行: ```groovy stage(&#39;Deploy to Dev&#39;) { when { expression { params.ENVIRONMENT == &#39;dev&#39; } } steps { sh "kubectl apply -f k8s/deployment-dev.yaml --namespace=dev" } } stage(&#39;Deploy to Test&#39;) { when { expression { params.ENVIRONMENT == &#39;test&#39; } } steps { input message: &#39;确认部署测试环境?&#39;, ok: &#39;确认&#39; sh "kubectl apply -f k8s/deployment-test.yaml --namespace=test" } } stage(&#39;Deploy to Prod&#39;) { when { expression { params.ENVIRONMENT == &#39;prod&#39; && params.CONFIRM_PROD == true } } steps { input message: &#39;请再次确认部署生产环境?&#39;, ok: &#39;确认&#39; sh "kubectl apply -f k8s/deployment-prod.yaml --namespace=prod" } } ``` ### 五、结合GitLab分支触发不同环境 除了手动选择环境,我们还可以根据GitLab的分支自动触发不同环境部署: - 当代码推送到`dev`分支时,自动触发开发环境部署。 - 当代码推送到`test`分支时,自动触发测试环境部署。 - 当代码推送到`main`分支时,触发生产环境部署(可能需要手动确认)。 在Jenkins中,我们可以通过以下方式配置: 1. 在Jenkins项目设置中,配置分支触发器(Build when a change is pushed to GitLab. GitLab webhook URL: ...) 2. 在Jenkinsfile中,通过`BRANCH_NAME`环境变量获取当前分支,然后决定部署到哪个环境。 示例片段: ```groovy environment { // 获取分支名称 BRANCH_NAME = "${env.GIT_BRANCH}" } stages { stage(&#39;Deploy&#39;) { steps { script { if (BRANCH_NAME == &#39;dev&#39;) { // 部署开发环境 } else if (BRANCH_NAME == &#39;test&#39;) { // 部署测试环境,可能需要手动确认 } else if (BRANCH_NAME == &#39;main&#39;) { // 生产环境部署,需要确认 } } } } } ``` ### 六、最佳实践 1. **基础设施即代码(IaC)**:将环境配置和部署脚本全部纳入版本控制,确保环境的一致性。 2. **不可变基础设施**:每次部署都使用新的镜像,避免直接修改运行中的环境3. **健康检查**:在部署后加入健康检查骤,确保应用成功启动。 4. **回滚机制**:在流水线中加入回滚骤,当部署失败时能够自动或手动回滚到上一个版本。 通过以上方法,我们可以实现灵活的多环境自动化部署流程,满足不同环境的管理需求[^1][^2]。 §§相关问题§§ 1. 如何配置Jenkins以实现基于GitLab分支的自动触发不同环境部署? 2. 在Kubernetes多环境部署中,如何管理不同环境的配置(如ConfigMap和Secret)? 3. Jenkins流水线中如何实现生产环境的蓝绿发布? 4. 如何为Jenkins流水线添加部署后的自动化测试? </think>### Jenkins流水线实现多环境开发/测试/生产)自动化部署方法 #### 一、核心设计思路 通过参数化构建和环境变量实现多环境切换: ```mermaid graph TD A[Jenkins Pipeline] --> B{部署环境选择} B -->|开发环境| C[自动部署] B -->|测试环境| D[手动审批后部署] B -->|生产环境| E[审批+验证后部署] C --> F[开发集群] D --> G[测试集群] E --> H[生产集群] ``` #### 二、具体实现骤 1. **环境隔离配置** - 为每个环境创建独立命名空间: ```bash kubectl create namespace dev kubectl create namespace test kubectl create namespace prod ``` - 环境专属配置文件(示例目录结构): ``` config/ ├── dev/ │ ├── app-config.yaml │ └── db-secret.yaml ├── test/ └── prod/ ``` 2. **Jenkins参数化构建** 在Jenkinsfile中定义环境选择参数: ```groovy properties([ parameters([ choice( name: &#39;DEPLOY_ENV&#39;, choices: &#39;dev\ntest\nprod&#39;, description: &#39;选择部署环境&#39; ), booleanParam( name: &#39;CONFIRM_PROD&#39;, defaultValue: false, description: &#39;确认部署生产环境&#39; ) ]) ]) ``` 3. **多环境部署流水线(Jenkinsfile示例)** ```groovy pipeline { agent any environment { REGISTRY = "harbor.yourcompany.com" KUBECONFIG = credentials(&#39;kubeconfig&#39;) } stages { stage(&#39;构建镜像&#39;) { steps { sh &#39;docker build -t ${REGISTRY}/myapp:${BUILD_NUMBER} .&#39; } } stage(&#39;推送镜像&#39;) { steps { withCredentials([usernamePassword(credentialsId: &#39;harbor-cred&#39;, passwordVariable: &#39;HARBOR_PWD&#39;, usernameVariable: &#39;HARBOR_USER&#39;)]) { sh &#39;&#39;&#39; docker login -u $HARBOR_USER -p $HARBOR_PWD ${REGISTRY} docker push ${REGISTRY}/myapp:${BUILD_NUMBER} &#39;&#39;&#39; } } } stage(&#39;环境部署&#39;) { steps { script { def namespace = params.DEPLOY_ENV // 环境专属配置 sh "kubectl apply -f config/${namespace}/ -n ${namespace}" // 环境差异化处理 if (params.DEPLOY_ENV == &#39;prod&#39;) { // 生产环境需二次确认 if (!params.CONFIRM_PROD) { error "生产环境部署需要明确确认!" } input message: &#39;确认部署到生产环境?&#39;, ok: &#39;确认&#39; } // 执行部署 sh """ kubectl set image deployment/myapp \ myapp=${REGISTRY}/myapp:${BUILD_NUMBER} \ -n ${namespace} """ // 生产环境额外验证 if (params.DEPLOY_ENV == &#39;prod&#39;) { sh "kubectl rollout status deployment/myapp -n prod --timeout=300s" } } } } } } ``` #### 三、关键配置说明 1. **环境差异化管理** - 使用`when`指令实现条件执行: ```groovy stage(&#39;生产环境验证&#39;) { when { expression { params.DEPLOY_ENV == &#39;prod&#39; } } steps { sh &#39;./run-smoke-tests.sh&#39; } } ``` - 环境变量注入: ```groovy environment { DB_URL = params.DEPLOY_ENV == &#39;prod&#39; ? &#39;jdbc:mysql://prod-db:3306&#39; : &#39;jdbc:mysql://test-db:3306&#39; } ``` 2. **安全控制实现** - 基于角色的权限管理(RBAC): ```yaml # Jenkins ServiceAccount权限 apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: prod name: limited-deploy rules: - apiGroups: ["apps"] resources: ["deployments"] verbs: ["get", "list", "watch", "update"] ``` - 凭据分级管理: ```mermaid graph LR A[Jenkins凭据] --> B{环境类型} B -->|开发/测试| C[普通凭据] B -->|生产| D[加密凭据] ``` #### 四、最佳实践 1. **部署流程优化** - 开发环境:代码合并后自动触发部署 - 测试环境:添加人工审批环节 ```groovy stage(&#39;部署测试环境&#39;) { when { expression { params.DEPLOY_ENV == &#39;test&#39; } } steps { input message: &#39;确认部署测试环境?&#39;, ok: &#39;确认&#39; sh &#39;kubectl apply -f k8s/deployment-test.yaml&#39; } } ``` - 生产环境:多级审批 + 自动化测试 ```groovy stage(&#39;生产部署&#39;) { when { expression { params.DEPLOY_ENV == &#39;prod&#39; } } steps { input message: &#39;运维团队确认?&#39;, ok: &#39;确认&#39; input message: &#39;安全团队确认?&#39;, ok: &#39;确认&#39; sh &#39;./run-security-scan.sh&#39; } } ``` 2. **监控与回滚** - 部署后自动验证: ```bash # 健康检查脚本 curl -sSf http://$SERVICE_URL/health > /dev/null || exit 1 ``` - 一键回滚机制: ```groovy stage(&#39;回滚&#39;) { when { expression { currentBuild.result == &#39;FAILURE&#39; } } steps { sh &#39;kubectl rollout undo deployment/myapp -n ${params.DEPLOY_ENV}&#39; } } ``` #### 五、可视化部署流程 ```mermaid sequenceDiagram participant Dev as 开发者 participant GitLab participant Jenkins participant K8s as Kubernetes Dev->>GitLab: git push (feature分支) GitLab->>Jenkins: 触发开发环境流水线 Jenkins->>K8s: 自动部署开发环境(dev) Dev->>GitLab: 创建Merge Request GitLab->>Jenkins: 触发测试环境流水线 Jenkins->>Team: 请求测试部署审批 Team->>Jenkins: 批准部署 Jenkins->>K8s: 部署测试环境(test) Team->>GitLab: 合并到main分支 GitLab->>Jenkins: 触发生产环境流水线 Jenkins->>SecTeam: 请求生产部署审批 SecTeam->>Jenkins: 安全审核通过 Jenkins->>K8s: 金丝雀发布到生产(prod) ``` 此方案通过参数化构建和环境隔离实现: - 开发环境:自动部署加速开发迭代 - 测试环境:手动审批保证质量[^1] - 生产环境:多级审批+金丝雀发布确保稳定性[^1][^2] > 注:生产环境部署建议添加部署窗口限制(如非工作时间禁止部署)和自动回滚机制,最大限度降低风险[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值