设置环境变量以在 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 中构建的主要内容,如果未能解决你的问题,请参考以下文章

在hudson中为build构建环境变量

构建 React 项目后如何设置节点环境变量(运行时)?

我可以从 csharp 中的编译时环境变量中创建一个常量吗?

如何正确设置 PHP 环境变量以在 Git Bash 中运行命令

Teamcity 没有选择 fastlane MATCH_PASSWORD 环境变量

如何从 Gradle 构建中设置环境变量?