关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回

PowerShell自动化发布SpringBoot项目到Tomcat

发布时间:2022-07-27 13:54:52

需求

开发机和Tomcat Server在同一个Domain,由于业务权限问题,本机无法测试一些场景,只能发布到Server才能测试,所以,开发阶段总是需要频繁发布。
其实发布流程比较简单流程化,所以才能写成脚本去处理。
1.mvn package
2.将war包copy到服务器tomcat目录下
3.stop tomcat services
4.start tomcat services

代码


要点

  1. 启动tomcat的时候,会启动springboot,这个过程大约10多秒,如果只是使用start-service tomcat的话,不知道springboot的启动情况。
    所以想到将项目启动日志实时输出到控制台。可以该如何监视日志文件变化呢?
get-content log.txt -wait

这个-wait参数就可以实现(很方便有没有!)

上面的命令一执行,把现有的日志也输出来了,根本停不下来。
我们的问题该是如何监视日志文件新加内容呢?

get-content log.txt -wait -tail 0

这个-tail参数就可以实现(很方便有没有!)

这下没问题了。
至此我们的文件监视已经实现了。
再梳理一下具体需求,我们希望的是监视到某个想要的log后,就停止监视。不然后面的代码无法执行了。

get-content log.txt -wait -tail 0 | foreach {
  $_;
  if($_ -match "XXX") 
  {
    break;
  }
}

运行,很好,在匹配带预期的字符后会停止监视,但是停止了整个PowerShell script的执行。
why?
简单来说就是,breakcontinue在for循环中和其他语言无异,但如果没在for循环中,那就stop的是整个pipeline.
那我们给它一个dummy loop ,给你包个循环好吧

do{
  get-content log.txt -wait -tail 0 | foreach {
    $_;
    if($_ -match "XXX") 
    {
      break;
    }
  }
}while($false)

至此,我们的需求完成了。
回头看看代码流程:

start-service tomcat
do{
  get-content log.txt -wait -tail 0 | foreach {
    $_;
    if($_ -match "XXX") 
    {
      break;
    }
  }
}while($false)

这里我们应该让启动tomcat的操作和监视文件的操作同时进行,不然启动服务之后,可能springboot都有启动了一半了,监视的日志就从半路开始了。
同时进行,那就让启动服务的操作后台运行即可。

start-job { start-service tomcat }

如果想获取job的返回结果,可以使用receive-job,此处我们就不写了。

  1. 启动完成之后,自动帮我开浏览器
#if you want to kill all opened chrome
kill -Name chrome
pathtochromechome.exe "URL"

参考

https://stackoverflow.com/questions/18632/how-to-monitor-a-text-file-in-realtime
https://stackoverflow.com/questions/51981048/how-to-stop-get-content-wait-after-i-find-a-particular-line-in-the-text-file-us
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content?view=powershell-7.1
https://dankinsella.blog/live-monitor-log-files-with-powershell/


/template/Home/DawnNew/PC/Static

立即注册风纳云账号,免费体验多款产品

立即注册