2015-08-24 205 views
3

当试图制作一个Jenkins项目时,我观察到一个奇怪的行为,该项目的Ant步骤接受Ant使用的任何String参数。它看起来像Ant以某种方式收到一些格式不正确的内容作为参数。从Jenkins Ant Plugin将参数传递给Ant

首先我登录安装在詹金斯在同一系统上,并写了一个简单的Ant构建文件:

<?xml version="1.0"?> 
<!--DOCTYPE project PUBLIC "-//ANT//DTD project//EN" "/usr/src/ant/project.dtd"--> 
<project name="many-params" default="run"> 
    <target name="run"> 
     <echo message="first Param: ${firstparam}"/> 
     <echo message="second Param: ${secondparam}"/> 
    </target> 
</project> 

然后我跑了设置参数的蚂蚁,得到了预期的输出:

$ ant -Dfirstparam=A -Dsecondparam=B 
Buildfile: /tmp/build-dir/build.xml 

run: 
    [echo] first Param: A 
    [echo] second Param: B 

BUILD SUCCESSFUL 
Total time: 0 seconds 

接下来,我开始在Jenkins设定一个项目。我詹金斯系统规格如下:

  • OS: Linux的AMD64 2.6.32-504.1.3.el6.x86_64
  • 詹金斯:版本。 1.618
  • JRE詹金斯在其上运行:甲骨文1.7.0_55-b13中
  • 蚂蚁插件版本: 1.2
  • JRE用于项目:甲骨文45年1月6日32位
  • 蚂蚁用于该项目: 1.8.2

我已经设置了8个连续步骤的作业,4个准备shell脚本块,重写b具有略微不同的参数名称(没有分隔符,破折号分隔符,点分隔符)的uild.xml以及4个调用ant的Ant构建步骤,尝试传递相应的参数。

从作业目录的准备config.xml文件看起来像:

<?xml version='1.0' encoding='UTF-8'?>                                                 
<project>                                                        
    <actions/>                                                        
    <description>A simple task to test many parameter setting for jenkins calling ant tasks</description>                                 
    <logRotator class="hudson.tasks.LogRotator">                                               
    <daysToKeep>-1</daysToKeep>                                                   
    <numToKeep>10</numToKeep>                                                   
    <artifactDaysToKeep>-1</artifactDaysToKeep>                                               
    <artifactNumToKeep>-1</artifactNumToKeep>                                               
    </logRotator>                                                       
    <keepDependencies>false</keepDependencies>                                                
    <scm class="hudson.scm.NullSCM"/>                                                  
    <canRoam>true</canRoam>                                                    
    <disabled>false</disabled>                                                    
    <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>                                        
    <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>                                         
    <jdk>Oracle Java 1.6.45 32-bit JRE</jdk>                                                
    <triggers/>                                                       
    <concurrentBuild>false</concurrentBuild>                                                
    <builders>                                                        
    <hudson.tasks.Shell>                                                     
     <command>echo &quot;STEP 1: Pass parameters with no separators in names&quot;                                      
cat &gt; build.xml &lt;&lt; EOF                                                   
&lt;?xml version=&quot;1.0&quot;?&gt;                                                 
&lt;!--DOCTYPE project PUBLIC &quot;-//ANT//DTD project//EN&quot; &quot;/usr/src/ant/project.dtd&quot;--&gt;                                
&lt;project name=&quot;many-params&quot; default=&quot;run&quot;&gt;                                          
    &lt;target name=&quot;run&quot;&gt;                                                 
     &lt;echo message=&quot;first Param: ${paramfirst}&quot;/&gt;                                          
     &lt;echo message=&quot;second Param: ${paramsecond}&quot;/&gt;                                         
    &lt;/target&gt;                                                      
&lt;/project&gt;                                                       
EOF</command>                                                       
    </hudson.tasks.Shell>                                                    
    <hudson.tasks.Ant plugin="[email protected]">                                                 
     <targets>run</targets>                                                    
     <antName>Ant 1.8.2</antName>                                                  
     <properties>paramfirst=A                                                   
paramsecond=B</properties>                                                    
    </hudson.tasks.Ant>                                                     
    <hudson.tasks.Shell>                                                     
     <command>rm build.xml 
echo 
echo &quot;STEP 2: Pass parameters with separated by dashes in names&quot; 
cat &gt; build.xml &lt;&lt; EOF 
&lt;?xml version=&quot;1.0&quot;?&gt; 
&lt;!--DOCTYPE project PUBLIC &quot;-//ANT//DTD project//EN&quot; &quot;/usr/src/ant/project.dtd&quot;--&gt; 
&lt;project name=&quot;many-params&quot; default=&quot;run&quot;&gt; 
    &lt;target name=&quot;run&quot;&gt; 
     &lt;echo message=&quot;first Param: ${param-first}&quot;/&gt; 
     &lt;echo message=&quot;second Param: ${param-second}&quot;/&gt; 
    &lt;/target&gt; 
&lt;/project&gt; 
EOF</command> 
    </hudson.tasks.Shell> 
    <hudson.tasks.Ant plugin="[email protected]"> 
     <targets>run</targets> 
     <antName>Ant 1.8.2</antName> 
     <properties>param-first=A 
param-second=B</properties> 
    </hudson.tasks.Ant> 
    <hudson.tasks.Shell> 
     <command>echo 
echo &quot;STEP 3: Same, but with parameters on the same line in Ant Plugin step setup&quot;</command> 
    </hudson.tasks.Shell> 
    <hudson.tasks.Ant plugin="[email protected]"> 
     <targets>run</targets> 
     <antName>Ant 1.8.2</antName> 
     <properties>param-first=A param-second=B</properties> 
    </hudson.tasks.Ant> 
    <hudson.tasks.Shell> 
     <command>rm build.xml 
echo 
echo &quot;STEP 4: Pass parameters with separated by dots in names&quot; 
cat &gt; build.xml &lt;&lt; EOF 
&lt;?xml version=&quot;1.0&quot;?&gt; 
&lt;!--DOCTYPE project PUBLIC &quot;-//ANT//DTD project//EN&quot; &quot;/usr/src/ant/project.dtd&quot;--&gt; 
&lt;project name=&quot;many-params&quot; default=&quot;run&quot;&gt; 
    &lt;target name=&quot;run&quot;&gt; 
     &lt;echo message=&quot;first Param: ${param.first}&quot;/&gt; 
     &lt;echo message=&quot;second Param: ${param.second}&quot;/&gt; 
    &lt;/target&gt; 
&lt;/project&gt; 
EOF</command> 
    </hudson.tasks.Shell> 
    <hudson.tasks.Ant plugin="[email protected]"> 
     <targets>run</targets> 
     <antName>Ant 1.8.2</antName> 
     <properties>param.first=A 
param.second=B</properties> 
    </hudson.tasks.Ant> 
    </builders> 
    <publishers/> 
    <buildWrappers> 
    <hudson.plugins.ws__cleanup.PreBuildCleanup plugin="[email protected]"> 
     <deleteDirs>false</deleteDirs> 
     <cleanupParameter></cleanupParameter> 
     <externalDelete></externalDelete> 
    </hudson.plugins.ws__cleanup.PreBuildCleanup> 
    </buildWrappers> 
</project> 

建设任务给了我下面的输出:

Started by user Alexander Krasnyansky 
[EnvInject] - Loading node environment variables. 
Building remotely on j03_uk1ps41 (buildslaves) in workspace /var/lib/jenkins03/workspace/akrasnyansky/ManyParams/ant-param-test 

Deleting project workspace... done 

[ant-param-test] $ /bin/sh -xe /tmp/hudson2203137136163442442.sh 
+ echo 'STEP 1: Pass parameters with no separators in names' 
STEP 1: Pass parameters with no separators in names 
+ cat 
[ant-param-test] $ /usr/local/apache-ant-1.8.2/bin/ant -Dparamfirst=A -Dparamsecond=B run 
Buildfile: /var/lib/jenkins03/workspace/akrasnyansky/ManyParams/ant-param-test/build.xml 

run: 
    [echo] first Param: 
    [echo] second Param: 

BUILD SUCCESSFUL 
Total time: 0 seconds 
[ant-param-test] $ /bin/sh -xe /tmp/hudson5869719507232196626.sh 
+ rm build.xml 
+ echo 

+ echo 'STEP 2: Pass parameters with separated by dashes in names' 
STEP 2: Pass parameters with separated by dashes in names 
+ cat 
[ant-param-test] $ /usr/local/apache-ant-1.8.2/bin/ant -Dparam-first=A -Dparam-second=B run 
Buildfile: /var/lib/jenkins03/workspace/akrasnyansky/ManyParams/ant-param-test/build.xml 

run: 
    [echo] first Param: first 
    [echo] second Param: second 

BUILD SUCCESSFUL 
Total time: 0 seconds 
[ant-param-test] $ /bin/sh -xe /tmp/hudson1052316660761572548.sh 
+ echo 

+ echo 'STEP 3: Same, but with parameters on the same line in Ant Plugin step setup' 
STEP 3: Same, but with parameters on the same line in Ant Plugin step setup 
[ant-param-test] $ /usr/local/apache-ant-1.8.2/bin/ant "-Dparam-first=A param-second=B" run 
Buildfile: /var/lib/jenkins03/workspace/akrasnyansky/ManyParams/ant-param-test/build.xml 

run: 
    [echo] first Param: first 
    [echo] second Param: second 

BUILD SUCCESSFUL 
Total time: 0 seconds 
[ant-param-test] $ /bin/sh -xe /tmp/hudson4427994032931026249.sh 
+ rm build.xml 
+ echo 

+ echo 'STEP 4: Pass parameters with separated by dots in names' 
STEP 4: Pass parameters with separated by dots in names 
+ cat 
/tmp/hudson4427994032931026249.sh: line 5: <?xml version="1.0"?> 
<!--DOCTYPE project PUBLIC "-//ANT//DTD project//EN" "/usr/src/ant/project.dtd"--> 
<project name="many-params" default="run"> 
    <target name="run"> 
     <echo message="first Param: ${param.first}"/> 
     <echo message="second Param: ${param.second}"/> 
    </target> 
</project> 
: bad substitution 
Build step 'Execute shell' marked build as failure 
Started calculate disk usage of build 
Finished Calculation of disk usage of build in 0 seconds 
Started calculate disk usage of workspace 
Finished Calculation of disk usage of workspace in 0 seconds 
Finished: FAILURE 

所以出现这种情况很多问题:

  1. 为什么STEP 1中根本没有打印任何值?
  2. 如何在第2步中使用字符串值“第一”和“第二”而不是“A”和“B”?
  3. 为什么在第3步格式不正确的行“-Dparam-first = A param-second = B”(通过将两个参数放在Jenkins步骤设置中的同一行上产生:param-first = a param-second = B)以及步骤2中的“-Dparam-first = A -Dparam-second = B”?我应该在这里失败,就像我在shell中运行一样。
  4. 步骤4中的点有什么问题?为什么它会在这里产生一个错误的替代错误?

非常感谢您对这些问题的任何建议。

回答

1

您的问题是重写build.xml。我真的不明白你为什么这样做。但让我们潜入。

tl; dr:您在混淆Shell和Ant变量的行为:如何逃避它们以及未定义时会发生什么。

你有一个“执行shell”构建步骤,有你使用cat把新的内容到文件中。

停在那里。要么删除其他构建步骤,要么在cat命令之后放置一个巨大的sleep。现在查看您的工作区内部是否生成了build.xml。你会看到:
<echo message="first Param: "/>

正如你所看到的那样,该回波线实际上没有参数。因此,当它运行时,它不会打印除文本外的任何内容。为什么会发生?您的cat命令在Shell中运行。您不是在first Param: ${paramfirst}中转义参数的美元符号$。因此,在运行时,Shell将${paramfirst}视为变量并尝试查找其值。没有一个,因此Shell没有用它替代它(如果这是Ant,Ant会逐字打印未定义的变量)

您需要从Shell转义该变量,因此编写first Param: \${paramfirst}。这将生成正确的build.xml,并且所有工作都将从那里开始。

2.Allowed characters in linux environment variable namesCan shell variable include - character?
连字符-不是允许壳牌变量名。

会发生什么情况是,在Shell看到变量定义${后,它向前看到连字符-(导致连字符不能是变量名),并将字符串拆分。因此,出于${param-first},Shell认为${param是可变的,并且-first}是格式不正确的文本。第一取代有什么,并打印余数(与}被消耗由于壳牌特质)

3.的“调用Ant”建立步骤预计PARAMS在key=value方式,每行一个。然后它将采用每行,前缀为-D,并将多行连接起来形成最终的命令行。

所以这个:

param-first=A 
param-second=B 

变为这样:

-Dparam-first=A 
-Dparam-second=B 

然后串成为:-Dparam-first=A -Dparam-second=B

当你这样做:

param-first=A param-second=B 

它成为这个(记住:每行一个):

-Dparam-first=A param-second=B 

公告只有一个-D,因为它是每行一个PARAM

4.壳牌不允许时期.在变量名。期。 (Pun打算)。请参阅的答案1.2.。但是,你可以在Ant变量名中使用句点和连字符,但为了一致性的原因,我会提出反对意见。

+0

谢谢!即使重写了build.xml,转义美元符号也彻底解决了我的问题。我觉得自己像个白痴一样没有想出来! –

+0

不要那么想。直到我运行你的配置并查看了生成的'build.xml'文件,我才发现它自己 – Slav

相关问题