首页 > 解决方案 > Jenkins 通过 ssh 部署作业

问题描述

问题:

sshPublisher我正在使用构建步骤运行 bash 脚本作为部署的一部分。脚本的一部分是使用netstat(和grep/ awk)查找进程 ID。当我登录虚拟机并手动运行脚本时,会终止进程,但通过 Jenkins 部署作业,它不会

詹金斯服务器(VM1):

stage('deploy'){
    sshPublisher(publishers: [sshPublisherDesc(configName: 'fdpdeploy', transfers: [sshTransfer(excludes: '', execCommand: './deploy.sh', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/fdp-0.0.1-SNAPSHOT.war')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])           
}

VM2:这是脚本deploy.sh

#!/bin/bash

processId=$(sudo netstat -plten | grep 9030 | awk {'print $9}' | awk -F '/' {'print $1'})
echo $processId

kill -9 $processId

sleep 5

echo 'Starting FDP app'

nohup java -jar /data/fdp-0.0.1-SNAPSHOT.war &> /data/logs/FDPBizApp.log &

exit 0
fi

标签: jenkins

解决方案


从您在评论中发布的输出来看,这就是问题所在:

sudo: sorry, you must have a tty to run sudo

选项 1 - visudo 解决方案

(这是来自 OP 的解决方案):

用于visudo编辑sudoers文件并注释掉requiretty条目

选项 2 - Jenkins 插件解决方案

Publish Over SSH 插件的功能列表包含以下项目:

启用要在伪 TTY 中执行的命令/脚本

您可以通过添加usePty: truesshTransfer发布者的阻止来启用此功能。您的Jenkinsfile步骤应如下所示:

stage('deploy'){
    sshPublisher(publishers: [sshPublisherDesc(configName: 'fdpdeploy', transfers: [sshTransfer(excludes: '', execCommand: './deploy.sh', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/fdp-0.0.1-SNAPSHOT.war', usePty: true)], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])           
}

您现有步骤的唯一更改是在, usePty: true之后添加sourceFiles:


推荐阅读