jenkins控制库连接

一、需求引入

  话说公司有个项目,数据库根据不同的用途建有内测库test、开发库dev、生产库pro等。

  开发人员开发测试流程,连接开发库;

  测试人员测试功能,连接内测库。

       这两个库有相同的数据,也有自己独特的数据,可以想象成集合里面的交集。

     现在有个需求:要根据测试人员的测试需求,连接不同的库。如果要测试流程,项目要用到开发库的数据;测试功能则要连接内测库。

   因为测试人员有jenkins发布的权限,所以我第一时间想到用jenkins的选项参数去控制。

 

二、需求分析

  结合下面的图来说:

jenkins后台数据库 jenkins连接数据库_git

   首先交代下,目前给测试人员的内测环境就是连的test内测库,只是可能开发人员在他们的开发库里开发完一些东西,想给到测试人员去测功能,此时就想把服务连到dev开发库里。

   如果根据测试人员选择不同的选项,直接改数据库连接到dev开发库,就会有个问题,开发人员不会因为测试人员去测试的时候,而停止开发功能,意味着dev开发库会不断新增数据,测试人员测试时也会在dev开发库里新增数据,这往往导致一些问题出现。所以最终跟领导商量过,对于测试流程这条路径,借用第三个临时库:tmp,如果要测试时,就从dev开发库数据导数据过来,测试完之后再备份

 

三、需求实现

  这个项目原来部署jenkins发布的流程,也就是“2、测试功能”,是:git拉取代码之后,根据maven编译的指令,如果是“clean install  -e -DskipTests=true -Ptest”,就会去读application-test.properties的数据库连接文件,编译后,生成target目录,里面jar包再发布到远程机器,并启动。

  这样说如果要修改数据库连接,则先要把dev数据导入到tmp库,再修改application-test.properties 的连接到tmp库,最后编译发布。如果构建maven job,要建两个,所以最终我决定用pipeline去做。

  因为数据库mysql是我们自建的,所以在那台服务器上先准备好数据库的导出导入的脚本,去运行。

主要步骤:

(1)根据测试选项(流程/功能)去选择连接tmp库还是保持默认的test内测库;

(2)拉取项目git代码,并修改数据库连接

(3)maven编译并发布jar包到远程

def GetRemoteServer(ip){
    def remote = [:]
    remote.name = ip
    remote.host = ip
    remote.port = 1422
    remote.allowAnyHosts = true
    //通过withCredentials调用Jenkins凭据中已保存的凭据,credentialsId需要填写,其他保持默认即可
    withCredentials([usernamePassword(credentialsId: '事先配置在jenkins 的自建数据库服务器的账号密码凭据', passwordVariable: 'password', usernameVariable: 'userName')]) {
        remote.user = "${userName}"
        remote.password = "${password}"
    }
    return remote
}

pipeline {
    agent any
    environment {
        GIT_URL="ssh://git@xxx.com/项目目录名/项目名.git"
    }
   stages {
       // 1、调用数据库导入导出脚本(远程调用自建数据库服务器脚本运行)
        stage("导数据(流程)") {
            steps {
              script {
              // 获取测试人员测试选项 
                echo "{env.choice}"
                if (env.choice == "流程") {
                    echo "测试流程"
                    // 导入数据
                    rserver = GetRemoteServer('自建数据库服务器ip')
                    sshCommand remote: rserver, command: "sh -x dev2tmp.sh"
                    
                } else  {
                    echo "测试功能"   
                }
              }
            }
        }
        // 2、回到jenkins机器,拉取代码
        stage("拉代码") {
             steps{
                echo "git pull ${BRANCH} from ${GIT_URL}"
                git branch: "${BRANCH}", credentialsId: 'jenkins拉取gitlab的凭据', url: "${GIT_URL}"

            }
         }
         // 3、改数据库连接 
        stage("修改库连接") {
            steps {
             script {
                echo "{env.choice}"
                // (1)测试流程 -- 连临时库 
                if (env.choice == "流程") {
                    sh "cp /tmp/application-tmp.properties /var/lib/jenkins/workspace/pipeline任务名/项目目录/src/main/resources/application-test.properties" 
                }
                // (2)测试功能 -- 连内测库 
                else  {
                    echo "测试功能"
                    sh "cp /tmp/application-test.properties /var/lib/jenkins/workspace/pipeline任务名/项目目录/src/main/resources/application-test.properties" 
                }
             }
            }
         }
        //  stage("check java") {
        //      steps {
        //         sh "${JAVA_HOME}/bin/java -version"
        //      }
        // }
        // 4、maven编译
         stage('mvn 编译'){
            steps {
                echo "maven编译代码"
                sh "/var/lib/jenkins/tools/hudson.apache-maven-3.3.9/bin/mvn clean install -e -DskipTests=true -Ptest -f pom.xml"
            }
        }
       // 5、发布jar包 
      stage('发布jar包'){
         steps {
             script {
                 // (1)传输文件
                 sshPublisher(publishers: [sshPublisherDesc(configName: '自建数据库服务器在jenkins系统管理上的SSH Server Name', transfers: [sshTransfer(remoteDirectory: '$JAR_TMP_HOME', removePrefix: '项目目录/target', sourceFiles: '项目目录/target/构建出的jar包名-*.jar')])])                

                // (2)调用远程脚本开启jar包服务 
                rserver = GetRemoteServer('自建数据库服务器ip'')
                sshCommand remote: rserver, command: "sh -x 发布脚本 '${JAR_NAME}'" 
             }
         }
      }
    }
}

 效果图:

jenkins后台数据库 jenkins连接数据库_jar包_02