• jenkins控制库连接


    jenkins控制库连接

    一、需求引入

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

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

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

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

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

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

     

    二、需求分析

      结合下面的图来说:

       首先交代下,目前给测试人员的内测环境就是连的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}'" 
                 }
             }
          }
        }
    }

     效果图:

  • 相关阅读:
    Vue $nextTick的一个使用场景
    Vue 使用v-for对Object进行遍历
    JavaScript 回调函数的简单示例
    VSCode 自定义Vue snippets, 快速生成Vue模板
    git将一个分支完全覆盖另外一个分支如:dev分支代码完全覆盖某一个开发分支
    解决bootstrap时间输入框总被浏览器记住的记录遮挡住的问题
    Fiddler 屏蔽JS、抓WebSocket协议、查看接口响应时间、模拟并发请求
    细说MySQL的时间戳(Timestamp)类型
    网站建设之域名注册和域名备案
    日常项目测试用例检查点(来自一线测试人员的吐血总结)
  • 原文地址:https://www.cnblogs.com/windysai/p/16079301.html
Copyright © 2020-2023  润新知