如何在jenkins管道中使用Jenkinsfile部署Java war文件

时间:2017-08-27 09:00:21

标签: java jenkins web-deployment jenkins-pipeline

在jenkins maven项目中,我们可以使用BUILD_ID=DontKillMe来阻止hudson脚本关闭shell调用。

赞:BUILD_ID=DontKillMe java -jar target.jar

BUILD_ID无法添加Jenkinsfile

Jenkinsfile:

#!/usr/bin/env groovy

node {
    stage('Build') {
        checkout scm
        sh '/opt/gradle/gradle-4.1/bin/gradle clean build'
    }
    stage('Deploy') {
        sh 'mkdir -p /opt/www/foobar'
        sh 'cp build/libs/*.war /opt/www/foobar/newest.war'
        sh 'chmod 755 ./deploy.sh'
        sh 'nohup ./deploy.sh &'
        sh 'while ! httping -qc1 http://localhost:10000 ; do sleep 1 ; done'
    }
}

执行hudson脚本后,hudson脚本调用的所有shell都将被关闭。 即使是双nohup仍无效。

deploy.sh:

#!/bin/bash

nohup java -jar -Dspring.profiles.active=prod /opt/www/foobar/newest.war /var/log/foobar.log 2>&1 &

2 个答案:

答案 0 :(得分:0)

您可以在BUILD_ID=dontKillMe步骤中使用sh

sh 'BUILD_ID=dontKillMe nohup ./deploy.sh &'

答案 1 :(得分:0)

我找到了另一种执行脚本的方法,不能被杀死。

  • Linux服务

/etc/init.d/www-project

#!/bin/bash

. /etc/init.d/functions

SERVICE_NAME="www-project"
RETVAL=0
PID=-1
PIDFILE=/var/run/${SERVICE_NAME}.PID

start () {
  if [ -f ${PIDFILE} ]; then
    echo "PID file ${PIDFILE} already exists, please stop the service !"
    exit
  fi
  echo "Starting service ${SERVICE_NAME} ..."
  java -jar -Dspring.profiles.active=prod /opt/www/project/newest.war > /var/log/www-project.log 2>&1 &
  PID = $!  
  if [ -z ${PID} ]; then 
    echo "Failed to get the process id, exit!"
    exit
  else
    echo "Starting successfully, whose pid is ${PID}"
  fi
  touch $PIDFILE
  echo ${PID} > ${PIDFILE}
}

stop () {
  if [ -f $PIDFILE ]; then 
    PID = `cat ${PIDFILE}`
    if [ -z $PID ]; then 
      echo "PIDFILE $PIDFILE is empty!"
      exit
    fi
    if [ -z "`ps axf | grep $PID | grep -v grep`" ]; then
      echo "Process dead but pidfile exists!"
      exit
    else
      kill -9 $PID
      echo "Stopping service successfully, whose pid is $PID"
      rm -f $PIDFILE
    fi
  else
    echo "File $PIDFILE does NOT exist!"
  fi
}

restart () {
  stop
  start
}

status () {
  if [ -f $PIDFILE ]; then
    PID=`cat $PIDFILE`
    if [ -z $PID ] ; then
      echo "No effective pid but pidfile exists!"
    else
      if [ -z "`ps axf | grep $PID | grep -v grep`" ]; then
        echo "Process dead but pidfile exist"
      else
        echo "Running"
      fi
    fi
  else
    echo "Service not running"
  fi
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    restart
    ;;
  status)
    status
    ;;
  *)
    echo "Usage: www-project {start|stop|restart|status}"
    ;;
esac
  • systemd unit service

/usr/lib/systemd/system/www-project.service

[Unit]
Description=project
After=mysqld.service
Wants=mysqld.service

[Service]
ExecStart=/usr/lib/jvm/java/bin/java -jar -Dspring.profiles.active=prod /opt/www/project/newest.war > /var/log/www-project.log
PIDFile=/var/run/www-project.pid
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -9 $MAINPID

[Install]
WantedBy=multi-user.target

在Jenkinsfile中,我们可以调用

service restart www-project

systemctl restart www-project

哈德森剧本永远不会杀死这些服务。