我有一个从Jenkins slave运行的Perl脚本。该脚本执行保存在远程盒A上的shell脚本。该shell脚本实际上在机器A本身上部署了war。两台机器,Jenkins从机和远程机箱都是CentOS实例。
use strict;
use warnings;
use Cwd;
use File::Copy;
use Getopt::Long;
use File::Basename;
use Net::OpenSSH;
my ($conf_file, $environment, $doexec, $exec, $job, $dest_file, $user, $host, $IP, $TARGET_SERVER, $JENKINS_JOB, $wrapper, $src_file, $src_path, $src_dist_path, $src_full_path, $id_file, $ssh, @array, $line);
init();
sub init {
$JENKINS_JOB = $ENV{'JOB_NAME'};
$conf_file = "/home/ec2-user/SCM/conf/deploy_build.conf";
open (FH, "<", $conf_file) or die "Cannot open < $conf_file: $!";
while (<FH>) {
if ( $_ =~ /\b$JENKINS_JOB\b/ ) {
push @array, $_;
} else {
next;
}
}
foreach $line (@array) {
($job, $src_path, $dest_file, $user, $wrapper) = split(':', $line);
$id_file = "/home/ec2-user/.ssh/priv_key";
$ssh = Net::OpenSSH->new($IP, key_path => $id_file, user => $user);
$ssh->error and die "Couldn't establish SSH connection: ". $ssh->error;
printf "\n";
if (length $wrapper) {
printf "Initiating subroutine for executing wrapper on remote machine...\n";
&exec_wrapper;
} else {
printf "*** No wrapper specified ****\n";
}
}
}
sub exec_wrapper {
my ($stdout, $errput) = $ssh->capture2("~/release/$wrapper");
printf "Output: $stdout\n" if $stdout;
die "Error: $errput\n" if $errput;
printf "\n\n\n";
}
现在的问题是虽然程序运行正常,但它会在一段时间后打印输出。整个输出在$ stdout中捕获,然后稍后转储。由于此作业是作为Jenkins作业运行的,因此最终用户在输出转储之前不知道发生了什么。我希望在事件发生时(运行时)打印每一行,而不是等待整个输出存储在变量中并稍后转储。我确实阅读了this文章,但我不确定它是否适用于我的案例,如果是的话,我该如何实施呢。我确实尝试将$| = 1;
放在我的脚本顶部。它没用。然后我尝试在初始化ssh对象之前放置它,但它在任何情况下都不起作用。简而言之,在我的方案中,效率不是一个问题。
真的很感激任何帮助。
答案 0 :(得分:2)
我从this节点获得了解决方案。我可以使用以下代码实时打印日志,而不是将输出存储在字符串中并稍后将其转储。
sub exec_wrapper {
$ssh->system("~/release/$wrapper");
$ssh->die_on_error("execution of ~/release/$wrapper failed");
}
我也对其他方法持开放态度。