Java学习——Java后台写shell代码触发Jenkins job

功能描述:Java前端设置一个结束时间,传给后端,后端使用crontab命令将所需要执行的命令写入,所需要执行的命令就是触发Jenkins job。

这样的目的:可以避免Java代码里面一直判断是否到了结束时间,将这个时间判断交给系统


前端代码如下:

有个文本框,用来输入结束时间,使用datetimepicker控件,这里遇到了该控件的两种写法,我用的是bootstrap提供的:http://www.bootcss.com/p/bootstrap-datetimepicker/demo.htm

官网用的“<i class="icon-th"></i>”这个可以出来那个日历图标,我特意看了一下源码,发现是一张图片

所以我的代码如下:

<div class="input-append date form_datetime">
    <label>Ending Time</label>
    <input id ='calendar' size="26" type="text" placeholder="Please select the endingtime" readonly>
    <span class="add-on"><i class="icon-calendar"><img src="/files/calendar.png"/></i></span>
</div>

另一种写法参考这里,代码如下:http://eonasdan.github.io/bootstrap-datetimepicker/,可以使用glyphicon-calendar图标。

<div class='input-group date form_datetime col-sm-offset-5 col-sm-2'>
    <input id ='calendar' type='text' class="form-control" placeholder="Please select the endingtime" readonly/>
    <span class="input-group-addon">
        <span class="glyphicon glyphicon-calendar"></span>
    </span>
</div>

两种方法大家都可以试试,个人推荐第二种(虽然我用的第一种),这两种方式具体区别在哪里,我后面还会研究,研究出来会过来更新,这里暂时跳过。

顺便贴一下js代码:

var date=new Date();
$(".form_datetime").datetimepicker({
    format: "yyyy-mm-dd hh:ii",
    startDate:date,
    autoclose: true
});

先直接上后端代码:

try {
        String[] time=endingtime.split("-| |:");//将前端的时间分隔,开始按照crontab格式拼接命令
        String deadline="";
        for(int i=time.length-1;i>0;i--){
        deadline+=time[i];
        deadline+=" ";
        }
        deadline=deadline+"* ";
        String cmds="(crontab -l;echo "+"\""+deadline+"curl -X POST 'http://Jenkins job的地址link/buildWithParameters?NAME1=*****(Jenkins job所需要的参数)&NAME2=*****' --user Lemon:Lemon0000\") |crontab";
        //String cmds="(crontab -l;echo \"00 16 15 3 * curl -X POST 'http://*****/buildWithParameters?NAME1=****&NAME2=****' --user Lemon:Lemon0000\") |crontab";
	//String[] command={"cmd", "/c", cmds}; //windows下的调用命令
        String[] command={"/bin/sh","-c",cmds}; //linux 下的调用命令
        Process ps = Runtime.getRuntime().exec(command);
        ps.waitFor();	
        BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
        String line;  
        while ((line = br.readLine()) != null) {
        System.out.println(line);
        }
        br.close();
}
catch (Exception e) {  
        e.printStackTrace();
}

如果JavaWeb工程运行在Windows上,运行“String[] command={"cmd", "/c", cmds};”如果想要调用系统命令并且弹出窗口,运行“String [] cmd={"cmd","/C","start cmds"};”参考链接为:https://blog.csdn.net/toneylyx/article/details/52623597

我的工程是运行在Linux上的,所以使用"String[] command={"/bin/sh","-c",cmds};"注意:很多小伙伴的测试工程一般是在Windows上,实际运行的时候是在Linux上,这样要随时注意切换。

在Linux上运行完上述代码后,通过“crontab -l”即可查看对应的任务。

接下来重点说一下crontab命令:

1.首先使用“echo "53 14 13 3 * ./command" >> /etc/crontab”命令,提示我权限受限,需要root权限,但是我最终是通过Java来调用命令。所以所有需要root权限的都不可行。

2.当然“crontab -e”会弹出来一个编辑框就更不可取了

3.参考这个链接http://www.ttlsa.com/linux/use-scripts-add-crontab/,知道了在执行crontab -e命令时,会在/var/spool/cron目录下创建一个文件,文件的名称是你当前的用户名,于是我运行了“echo "53 14 13 3 * ./command" >> /var/spool/cron”,然而编辑这个/var/spool也需要root权限,虽然我们可以改一下文件的权限,但是我没胆儿改,所以此路不通。

4.通过请教大神发现可以这样写,不需要root权限:"echo "1 1 * * * /usr/sbin/ntpdate us.pool.ntp.org" | crontab"  然后开始测试触发Jenkins job的命令,采用curl -X POST

5.然后开始连在一起测试,发现我在Linux上直接输入“date”命令出来的时间和通过crontab命令打印的时间有时间差,通过命令“* * 14 3 * date >> /root/lemon/date.txt”将时间写入txt文件,然后查看,对比。发现是 timezone和localtime不一致,运行命令“cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime”然后重启crontab“service crond restart”解决,参考https://www.phpbulo.com/archives/171.html

6.继续测,发现echo "1 1 * * * /usr/sbin/ntpdate us.pool.ntp.org" | crontab 这条命令每次执行都会覆盖里面已经有的命令,修改命令为“(crontab -l; echo "1 1 * * * /usr/sbin/ntpdate us.pool.ntp.org") | crontab

7.大功告成了,crontab的基本用法我这里就不赘述了,网上有蛮多的。


转载请注明出处,谢谢:https://blog.csdn.net/Blue___Ocean/article/details/79915773

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值