微服务的架构下,服务的数量多起来之后,一定会面对到开发联调的问题,不同的人维护不同的服务,互相直接有调用依赖,如果同时在做修改工作,互相之间就会有冲突和影响,很多时候会非常影响开发和调试的效率。
由于我们是使用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'
        }
    }
}
复制代码