微服务的架构下,服务的数量多起来之后,一定会面对到开发联调的问题,不同的人维护不同的服务,互相直接有调用依赖,如果同时在做修改工作,互相之间就会有冲突和影响,很多时候会非常影响开发和调试的效率。
由于我们是使用kuberneters来部署服务的,所以很自然的想到一个解决的办法就是利用kuberneters的命名空间的特性,在需要的时候,基于稳定版本快速的复制一份全新的部署出来,开发可以独立享用这个环境,不会有任何的冲突。实现的方式非常简单:
server1.yaml server2.yaml server3.yaml 复制代码
#!groovy def nodeName = env.node node(nodeName) { def branch = env.branch def profileName = env.profileName println("build branch: ${branch}") //拉取部署配置文件 stage('checkout') { def scmVars = checkout([$class: 'GitSCM', branches: [[name: branch]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '****', url: 'http://****/base-deploy-config.git']]]) String commitHash = scmVars.GIT_COMMIT println("checkout branch: ${commitHash}") } //清理k8s环境 stage('clean') { sh "/usr/bin/kubectl delete namespace " + profileName sh "/usr/bin/kubectl create namespace " + profileName //这里是为了在新的k8s命名空间中创建一个docker仓库的访问令牌 sh "/usr/bin/kubectl apply -n " + profileName + " -f secret.yaml" } //部署服务 stage('deploy') { fileList = [ "server1": "1.48.0-20200409", "server2": "1.48.0-20200408", "server3": "1.46.0-20200323", ... ] //遍历并部署所有的服务到新的命名空间 fileList.each{fileName, buildTag -> println("apply ${fileName}") if(fileName == "ingress"){ String replaceStr = "s/NAMESPACE/${profileName}/g" def sed = 'sed -i "' + replaceStr + '" ' + fileName + '.yaml' sh sed }else{ String replaceStr = "s/BUILD_ID/${buildTag}/g" def sed = 'sed -i "' + replaceStr + '" ' + fileName + '.yaml' sh sed } sh "/usr/bin/kubectl apply -n " + profileName + " -f " + fileName + '.yaml' } } } 复制代码