在jenkins的实践中遇到了一个问题:
我的项目依赖其他第三方应用的地方比较多,而且会占用多个端口,如何处理端口和启动/关闭第三方应用成了难题。
初级解决方案:在服务端上面写一堆bat文件,,,,_(:з)∠)_ 而且我已经写好了,准备手动启动bat,然后再跑jenkins
升级解决方案:和张辉聊了一下,本意是说可不可以用jenkins去启动这一堆,不用我手动再启动bat
最终解决方案:张辉推荐,在项目代码中直接启动/关闭第三方应用
怎么实现是个大问题。。。。
目的:初始化时启动,结束时关闭:klov,mongoD,appium;
klov和mongoD用bat就可以开启服务,比较纠结的是appium,我用的appium-desktop,手动的话还需要点击开启。这里的思路是下载命令行启动的版本。
步骤:
1.安装appium命令行版本:
npm --registry http://registry.npm.taobao.org install appium -g
参考 https://www.cnblogs.com/mapu/p/8666239.html
https://www.cnblogs.com/iTlijun/p/8193588.html
如果安装时提示2.0,4.0msbuild版本不对的问题,就去微软官网下载visulStudio2017社区的版本,安装其中的组件-windows8.1 和windows10.
2.cmd中输入 appium启动服务
appium
3.编写启动三个应用的bat文件 all.bat
@echo off
@echo start mongod
start /d "C:\Program Files\MongoDB\Server\3.4\bin" mongod.exe
::@echo start jenkins
::d:
::cd D:\jenkins
::java -jar jenkins.war
@echo start klov
cd D:\testng\klov-0.1.1
java -jar klov-0.1.1.jar
@echo start appium
appium
exit
4.用java代码来调用这个bat文件
package com.test;
import java.io.IOException;
import java.io.InputStream;
import java.sql.PseudoColumnUsage;
public class StartBat {
public static void main(String[] args) {
String cmd="cmd /c start C:\\Users\\user\\Desktop\\all.bat";
run_cmd(cmd);
}
public static void run_cmd(String cmd){
Runtime runtime = Runtime.getRuntime();
Process process = null;
try{
process=runtime.exec(cmd);
//输出cmd的内容
InputStream inputStream = process.getInputStream();
int c ;
while((c=inputStream.read())!=-1){
System.out.println(c);
}
inputStream.close();
process.waitFor();
}catch(IOException e){
e.printStackTrace();
}catch (InterruptedException e) {
e.printStackTrace();
}
int i = process.exitValue();
if(i==0){
System.out.println("执行完成");
}else{
System.out.println("执行失败");
}
process.destroy();
process=null;
new StartBat().killProcess();
}
public void killProcess(){
Runtime rt=Runtime.getRuntime();
Process process =null;
try {
rt.exec("cmd.exe /C start wmic process where name = 'cmc.exe' call terminate");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
5.基本想要的功能已经实现,然后在程序体初始化的时候,开启服务,test结束的时候,销毁服务或者关闭服务,就可以了。