在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结束的时候,销毁服务或者关闭服务,就可以了。