Jenkins推送Jar包至远程主机

之前:

1、Jenkins拉取Gitlab源码。通过git@ip方式成功,通过http://ip方式,没有成功

通过git@ip方式成功

  • 重点是公钥配置。参考:https://blog.csdn.net/qffj/article/details/26456357
  • 注意:公司的VPN方式,不支持git方式,提提22端口拒绝,就得到公司内网才可以

Jenkins推送Jar包至远程主机_第1张图片

2、触发远程构建。这个不是重点,没啥太大用

Jenkins推送Jar包至远程主机_第2张图片

3、构建。我理解就是把源码从GitLab上拉到本地工作区,再通过执行命令编译成Jar包。关键看Goals and options的内容

重点:需要安装Maven插件,如图:

否则,创建工程时,在Pre Steps之后,没有Build选项。Goals and options:clean pmd:pmd checkstyle:checkstyle findbugs:findbugs package -DskipTests。这是原来李老师写的,新建项目这么写,运行没有问题

Jenkins推送Jar包至远程主机_第3张图片

坑:当编译到第2个Moudle,即tds-common时,提示个:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project tds-common: Fatal error compiling: java.lang.ExceptionInInitializerError: com.sun.tools.javac.code.TypeTags -> [Help 1]
截图如下:

百度,竞然说是lombok版本低,与高版本的JDK不兼容。一查JDK,果然是版本较高:jdk-11.0.1。于是下载JDK1.8,装之。再在Jenkins上设置全局工具设置中,JDK那里,于增加一个JDK版本,再在项目中指定JDK(以前没注意,如果只有一个,好像没有JDK选项),果然过去了。感谢:快乐崇拜234   https://blog.csdn.net/liubenlong007/article/details/86139598

(一度怀疑是阿里的Maven的远程镜像问题——之前把镜像改成阿里了vim /opt/maven3.6.0/conf/settings.xml)

 

4、代码质量检查。即用SonarQube。这里在公司环境没有成功,原因是项目需要下载支持包,而公司网不允许上外网。改为直接在个人的IDEA环境中集成Sonar

重点:

  • 需要Sonar服务器。暂时用公司的10.135.102.85:9000
  • 配置自己的工程,即Pom文件,详见前https://mp.csdn.net/console/editor/html/104306635

5、直接构建并测试运行状况。

Build选项卡,Goals and options:(Maven命令参数使用,感谢:https://www.cnblogs.com/hiver/p/7850954)

  • clean package -DskipTests    这时,主项目和所有子项目,全部打包,分别在自己的项目录下,均生成Target目录,运行其中的一个子项目(如:Java tds-sal.jar -jar ),通过Postman运行成功。但是这个项目依赖其它多个项目,如Api,Model等,那说明,Package后的Jar包,已经将需要依赖都打里了。将这个Jar包,单独考到102.85上,运行,通过Postman仍能正常运行,证实确是如此。
  • clean package -pl com.tds:tds-clm -am -DskipTests,这时,只打包(因为用的是Package,如果用Install,则是安装)了tds-clm及其依赖包(目前有tds-model tds-api)。

6、将编译后的代码布署到远程主机。这是本节要学的东东

  • 方式一:Send files or execute commands over SSH

这里差点没折腾死我,终于摸索出源文件是啥,前缀是啥了:

Source files:有特定格式,点下右侧门的?号就差不多知道了。

Remove prefix:表示考到目标服务器的位置后,文件名中要去掉的内容。我之前这里是空,结果发布后,Source files中设置的所有目录层级,全部考到目标服务器的目标目录里了

Remote directory:一定要注意,这个目录,是在系统设置中的远程目录的基础上的!即,系统设置>Publish over SSH>SSH Servers>Remote Directory的内容,如图:Jenkins推送Jar包至远程主机_第4张图片

Exec command:这里好理解,可以写命令,也可以Shell脚本,要是脚本的话,需要指定目录(我是这样写的)

完整设置截图:

Jenkins推送Jar包至远程主机_第5张图片

折腾一小天,这个终于算是成功了!

小结:这种方式不灵活,只能执行发布到远端,再执行些指令,不能提前删除旧文件

  • 方式二:Exceute shell script on remote host using ssh

Jenkins推送Jar包至远程主机_第6张图片

MD,我增加上SSH sites,就出这个错误,也许是和方式一,在系统设置中有冲突了,只能用一种吗?发现不是的,可以忽略这个提示,在下面的命令行中尽定写就好了,能保存的。


第一个:Exceute shell script on remote host using ssh

SSH Site :[email protected]

Command:

echo "Stop service and rm files.....begin"
/usr/local/tds-msv/tds-server.sh stop ${qmModule}
rm -rf /usr/local/tds-msv/${qmModule}.jar 
echo "Stop service and rm files......end"

这里:我的tds-server.sh脚本,在服务器上直接运行,有提示,但可以成功,但是在Jenkins上Build中,就会出现 exit staus -1,经倪工指点:需将tds-server.sh本身的进程号也排除,问题解决!感谢倪工!


再增加一个:Exceute shell

echo "scp files......begin"
scp ${WORKSPACE}/target/${qmModule}.jar [email protected]:/usr/local/tds-msv/${qmModule}.jar
echo "scp files......end"


第二个:Exceute shell script on remote host using ssh

SSH Site :[email protected]

Command:

echo "Start service and rm files.....begin"
/usr/local/tds-msv/tds-server.sh start ${qmModule}
echo "Start service and rm files.....end"


tds-server.sh,内容如下(感谢:https://blog.csdn.net/l1028386804/article/details/78669778?utm_source=blogxgwz2)


#!/bin/sh

## java env
#export JAVA_HOME=/usr/local/jdk/jdk1.8.0_144
#102.85的JDK

##下面直接用java命令,而不指定Java位置 ZHCH 2020-03-12
#export JAVA_HOME=/usr
#export JRE_HOME=$JAVA_HOME/jre

## service name
APP_NAME=$2

#SERVICE_DIR=/usr/local/tds-msv/$APP_NAME
SERVICE_DIR=/usr/local/tdsapp/tdsmsv/$APP_NAME
SERVICE_NAME=$APP_NAME
SERVICE_LOG=$APP_NAME\.log
JAR_NAME=$SERVICE_NAME\.jar
PID=$SERVICE_NAME\.pid

cd $SERVICE_DIR

case "$1" in

    start)

    ## 起动参数
    if [ ! -n "$3" ]; then
      echo "未指定起动参数,默认为test"
      APP_ACTION="test"
    else
      APP_ACTION=$3
    fi

#        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >>$SERVICE_LOG 2>&1 &
        nohup java -Xms256m -Xmx1024m -jar $JAR_NAME --spring.profiles.active=$APP_ACTION >>$SERVICE_LOG 2>&1 &
        echo $! > $SERVICE_DIR/$PID
        echo "=== start $SERVICE_NAME"
        ;;

    stop)
       # echo "$SERVICE_DIR/$PID"    
    if [ -f "$SERVICE_DIR/$PID" ]; then
          kill `cat $SERVICE_DIR/$PID`
          rm -rf $SERVICE_DIR/$PID
          echo "=== stop $SERVICE_NAME"
        else
          echo "$SERVICE_NAME is not running"
    fi

        sleep 5
        ##
        P_ID=`ps -ef | grep -w $SERVICE_NAME |grep -v 'tds-server'|grep -v "grep" | awk '{print $2}'`
    echo "$P_ID"

        if [ "$P_ID" == "" ] || [ "$P_ID" = "0" ]; then
            echo "=== $SERVICE_NAME process not exists or stop success"
        else
            echo "=== $SERVICE_NAME process pid is:$P_ID"
            echo "=== begin kill $SERVICE_NAME process, pid is:$P_ID"
            kill -9 $P_ID
        fi
        ;;

    restart)
        $0 stop
        sleep 2
        $0 start
        echo "=== restart $SERVICE_NAME"
        ;;

    *)
        ## restart
        $0 stop
        sleep 2
        $0 start
        ;;

esac
exit 0


 

你可能感兴趣的:(Linux,Jenkins,微服务,jenkins,ssh,运维,linux)