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}'"
}
}
}
}
}
效果图: