设置环境变量以在 hudson 中构建
Posted
技术标签:
【中文标题】设置环境变量以在 hudson 中构建【英文标题】:Set environment variable for build in hudson 【发布时间】:2010-11-22 17:35:36 【问题描述】:我正在尝试将 maven2 项目置于哈德逊的持续集成之下。 该项目使用 selenium 进行一些集成测试。 Hudson 在无头 linux 上运行。 我正在使用 xvfb 为 selenium 启动一个 x 服务器会话。
为了运行测试,我需要导出一个名为 DISPLAY 的环境变量。 例如
export DISPLAY=:99
但是,我不想在盒子上设置变量,因为它会影响所有构建。 我尝试使用 m2 extra steps 插件执行 shell,但它不起作用,因为它是在单独的 bash 文件中执行的,这意味着环境变量不会持久化。
有没有办法从 hudson 注册环境变量。
【问题讨论】:
【参考方案1】:fyi,我今天为 Hudson 发布 the setenv plugin(假设 java.net 恢复到足以让我这样做!) - 它的行为类似于参数化构建功能,但 UI 更简单(只是一个用于输入的文本区域- 键/值对由换行符分隔)并且无需在构建时为参数提供值。
【讨论】:
【参考方案2】:Hudson 中有一个新功能允许您指定parameters for builds。这看起来就像你想要的一样。
但请注意:
这仍然是一个非常年轻的功能,因此非常感谢您的反馈
...
参数[s] 可用作环境参数。所以例如shell ($FOO, %FOO%) 或 Ant ($env.FOO) 可以访问这些值。
【讨论】:
我不相信这实际上回答了所提出的问题 - 如何在调用 Maven 的同一 shell 中设置环境变量?这些参数非常有用,但它并不是用户所要求的——而且它也不允许您编辑当前存在的环境变量,即您无法让它调用自己。例如, export PATH=/usr/bin/foo:$PATH 将不起作用,因为它无法识别 $PATH @Spedge 您将环境变量的读取和设置混为一谈。问题询问如何设置变量,所描述的机制正是这样做的。在您的示例中,您同时进行了设置和读取,这不是要求的。 @Rich Seller - 抱歉先生。我现在已经对此做了一些工作,并将在下面的答案中详细说明(因为评论中没有足够的空间)。【参考方案3】:Hudson 的节点属性在这里会做得很好。但是,如果您正在寻找一种更自动化的分配屏幕编号的方法,您需要做更多的工作,也许绑定到port-allocator plugin,或者编写一个新的 BuildWrapper 插件来自动启动 xvfb,并设置代表构建的 SCREEN 环境变量。
如果您愿意切换到不同的 X 服务器进行测试,可以尝试使用 Hudson 的 Xvnc plugin。它将自动启动 vncserver,并设置 SCREEN 环境变量。它还可以在测试完成时截取屏幕截图,并在作业的 Hudson 页面中显示。
【讨论】:
如何添加(未设置)到PATH
等环境变量?
@Sridhar 我建议为此提出一个全新的问题。
@Sridhar:如果新变量值应该在当前构建步骤中继续存在,则没有办法做到这一点。【参考方案4】:
我发现使用 xvfb-run
运行 selenium 比设置 DISPLAY 更可靠,所以这可能对你有用。所以:
xvfb-run java -jar selenium-server.jar
【讨论】:
【参考方案5】:您是否尝试过使用 selenium maven 插件?
插件可以配置为启动 Xvfb,运行测试然后停止它。
使用这个 pom.xml 配置:
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>selenium-maven-plugin</artifactId>
<executions>
<execution>
<id>xvfb</id>
<phase>pre-integration-test</phase>
<goals>
<goal>xvfb</goal>
</goals>
</execution>
<execution>
<id>selenium</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start-server</goal>
</goals>
<configuration>
<background>true</background>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
详情在这里: http://mojo.codehaus.org/selenium-maven-plugin/examples/headless-with-xvfb.html
【讨论】:
【参考方案6】:根据我对已接受答案的回复,这是我的发现。
注意未初始化的变量
在使用 Hudson 中的参数化功能时,您可以将环境变量附加到字符串的末尾 - 前提是它们首先包含某些内容。
例如,如果环境变量 $FOO 为空,并且您要在字符串参数中使用以下行...
/usr/bin/ladeda/:$F00
然后环境变量将读取 /usr/bin/ladeda/:$F00。
但是,如果我这样做了
export F00=/usr/bin/fiddledede
那么导出的变量将是....
/usr/bin/ladeda/:/usr/bin/fiddledede
当我最初将它作为测试运行时,我并没有解决这个问题 - 因此认为参数功能不接受外部环境变量,而实际上是(它们只需要包含一些东西)。
【讨论】:
以上是关于设置环境变量以在 hudson 中构建的主要内容,如果未能解决你的问题,请参考以下文章
我可以从 csharp 中的编译时环境变量中创建一个常量吗?
如何正确设置 PHP 环境变量以在 Git Bash 中运行命令