使用jenkins envinject变量的Perl工具链

时间:2017-11-01 11:51:39

标签: perl jenkins

我编写了一些Perl代码并使用Perl工具链。这是我的代码

my $sourcedir = $ENV{"SOURCE"};
my $targetdir = $variables{'DRIVE_LOCATION'};
my $artifactdir = $ENV{"ARTIFACT"};
my $appname = $ENV{"APPNAME"};
my $filetype = $ENV{"FILETYPE"};
my $ver = $ENV{versionName};
print "targetdir $target_dir \n";
my ( $buildno, $ver ) = @ARGV;
$Artifactname = "Android_{$app_name}.$ver";
print "artifact $Artifactname\n";
mkdir $Artifactname;
opendir( my $DIR, $sourcedir ) || die "can't opendir $source_dir: $!";
my @files = readdir($DIR);
foreach my $t ( sort grep( /^.*\.$filetype/, @files ) )
{
   if ("$sourcedir/$t")
   {
      copy "$sourcedir/$t", "./$Artifactname/$t";
      print " pathname $artifactdir/$Artifactname \n ";
      dircopy( "$artifactdir/$Artifactname", "$targetdir/$Artifactname" );
   }
}
closedir($DIR);

当我运行此代码时,我收到以下错误

Use of uninitialized value $app_name_ in concatenation (.) or string at
Scripts/perl/copyfiles.pl line 29 (#3)
 Use of uninitialized value $ver in concatenation (.) or string at
Scripts/perl/copyfiles.pl line 29 (#3)

也无法使用值创建目录。请任何人都可以帮忙。 my $ver = $ENV{versionName} // versionName是环境变量。

1 个答案:

答案 0 :(得分:1)

首先关闭:

$Artifactname = "Android_{$app_name}.$ver

但你宣布$appname。错误消息告诉您这一点。

然后 - $ver您从@ARGV读出来 - 它从%ENV中删除了您设置的内容。但是你永远不会检查是否有@ARGV包含数据,所以很可能 - 没有传递参数,因此这个值也是未定义的。

my ( $buildno, $ver ) = @ARGV;

(并且my重新声明了它,因此也会出错。

如果你想做默认,那么:

my ( $buildno, $ver ) = @ARGV;
$ver //= $ENV{'versionName'}; #conditional assignment. 

另外 - 如果您正在执行opendir / readdir / grep,您是否考虑过仅使用glob

foreach my $filename ( glob ( "$sourcedir/*.$filetype") ) { 

因为这也会给你完整的路径。