2010-04-20 60 views
1

我有一个parameterised Hudson job,用于某些AWS部署的东西,它在一个构建步骤中运行某些shell命令。从参数化的Hudson作业中提取shell脚本

但是,该脚本变得非常复杂,我想从哈德森中“提取”它到单独的脚本文件,以便它可以很容易地正确版本化。然后,Hudson作业将仅从VCS进行更新并执行外部脚本文件。

我的主要问题是关于传递参数给脚本。我有一个名为AMI_ID的Hudson参数和其他一些参数。该脚本引用这些PARAMS,好像他们是环境变量:

echo "Using AMI $AMI_ID and type $TYPE" 

现在,这工作正常内部哈德森,但如果哈德森调用外部脚本。我可以以某种方式让Hudson将params设置为环境变量,以便我不需要更改脚本?或者是我最好的选择来改变脚本以获取命令行参数(并可能将这些参数分配给命名变量以提高可读性:ami_id=$1; type=$2; ...)?

我想是这样的,但剧本没有得到正确替换值:

export AMI_ID=$AMI_ID 
export TYPE=$TYPE 
external-script.sh # this tries to use e.g. $AMI_ID 

奖金的问题:当脚本里面哈德森的“控制台输出”将包含在执行的命令和他们的产出。这对调试时出现构建错误时非常有用!例如,这里的开头的行“+”是脚本的一部分和下面的行其输出:

+ ec2-associate-address -K pk.pem -C cert.pem 77.125.116.139 -i i-aa3487fd 
ADDRESS 77.125.116.139 i-aa3487fd 

当调用一个外部脚本,哈德森输出将仅包含后者线,使得调试更难。在运行它之前,我可以将脚本文件cat写入stdout,但这也不是最佳选择。实际上,我想要一种DOS风格的“回声在”为我从哈德森调用脚本 - 任何人都知道一个伎俩来实现这一点?

回答

3

它不应该有必要做export var=$var - 尝试只使用export var。但是,请尝试:

AMI_ID=$AMI_ID TYPE=$TYPE external-script.sh 

all on one line。

要回答第二个问题,请尝试使用Bash的-x选项。在你的外部脚本,将它添加到你的家当:

set -x 
do_stuff 
more_stuff 
set +x 
+0

优秀,得益于:您希望脚本的

#!/bin/bash -x 

或环绕部分与跟踪!两个问题都解决了特别是bash追踪解决方案非常优雅 - 我希望能有这样的东西(事实上,我可以从哈德森本身的脚本运行中扣除它:'/ bin/sh -xe/tmp/hudson [...] .sh' :-)。 – Jonik 2010-04-20 13:41:02