Jenkins - Deploy Maven project to Tomcat

Posted by Echo Yuan on July 29, 2017
  1. 安装Deploy to container Plugin 到Jenkins里,虽然plugin的描述里说只支持到Tomcat 7.x,其实Tomcat 8也没问题。

  2. 左边菜单New item -> 输入item name -> Freestyle project

  3. Source Code Management

    因为项目的版本控制系统用的是SVN,所以勾选上Subversion。指定好Repository URL后,添加下Credentials,其他选项保持默认。

  4. Build Triggers

    暂时先选择Trigger builds remotely,并定义好Authentication Token,这个token的含义描述的很清楚。

    Use the following URL to trigger build remotely: JENKINS_URL/job/demo-project/build?token=TOKEN_NAME or /buildWithParameters?token=TOKEN_NAME Optionally append &cause=Cause+Text to provide text that will be included in the recorded build cause.

    最优的方式肯定是在SVN server上写个commit hook script,这样一旦代码有更新就会立即通知Jenkins来运行Job,但是现在一来拿不到SVN server的权限,二来其他人的代码提交习惯很随意、频率较高,频繁地运行Job也没啥好处,所以先采用通过trigger URL或人工在Jenkins里操作的方式来做。

    Build periodically也是一个可选的选择,就是cron的表达式要好好理解理解。

  5. Build Environment

    暂时只勾选上了Add timestamps to the Console Output

  6. Build

    添加个Invoke top-level Maven target的build step,Goals里输入clean package,我们仅仅打个新包。

    好像跳过了Maven Version?不,这项设置是很重要的,而且花了好几个小时来搜索和验证。我们先按已知的结果来设置,挖个坑,后面专门写一篇文章来介绍。

    转到Manage Jenkins -> Global Tool Configuration里,点击Maven installations...,然后添加一个Jenkins所在机器上的本地Maven的引用。这一步其实应该在New item之前就做掉的。

    add-local-maven

    记得要先把Install automatically给uncheck掉才会出现MAVEN_HOME的输入框哦!

    现在,Build -> Maven version里就可以选择到maven-3.3.9了,不要选(Default)

  7. Post-build Actions

    添加一个Deploy war/ear to a container的action,WAR/EAR files里指定成target/demo-project.warContext path根据你的需求来定,Containers里输入Tomcat里配置的username和password,URL指定到Tomcat的端口那里即可。

    同时,Tomcat的配置文件里也要做些Authentication的设置,否则Jenkins无法将war包部署到remote Tomcat里。

    • 给你使用的username赋予manager-script角色的权限

      这个角色的含义是allows access to the text interface and the status pages。有时候觉得自己关于Tomcat的知识好匮乏,平常用的都是一些相当皮毛、肤浅的知识。再给自己挖个坑,后面深入地去了解下。

      以下是个例子

        <-- file: tomcat-dir/conf/tomcat-users.xml -->
        <user username="tomcat" password="tomcat" roles="manager-script"/>
      
    • 添加Jenkins所在机器的IP到Tomcat允许的Remote addrs里

        <-- file: tomcat-dir/webapps/manager/META-INF/context.xml -->
        <Context antiResourceLocking="false" privileged="true" >
          <Valve className="org.apache.catalina.valves.RemoteAddrValve"
                 allow="127\.\d+\.\d+\.\d+|your-jenkins-server's-ip|::1|0:0:0:0:0:0:0:1" />
      

    这种方式可行,但不一定是最佳的,毕竟要开放Tomcat的manager权限,这可能会带来一些安全隐患。我想比较理想的方式应该是通过脚本或某种系统将war包分发到各个Tomcat,然后重启生效。

    虽然目前不知道这个Deploy to container Plugin插件是怎么stop并start Tomcat的,但是有时会碰到无法真正restart Tomcat的情况,这时候插件就无能为力了,还得自己写脚本来强行kill掉Tomcat并重新启动,具体参看另一篇文章里的How to force the Tomcat to shutdown?小节。

    自己写脚本来替代Deploy to container Plugin插件的工作可能需要用到SSH & SCP免密登录Linux服务器的功能,自己也转载了一篇写的挺好的博文

  8. Save & Build Now,看看能否部署成功。