代码之家  ›  专栏  ›  技术社区  ›  Daniel C. Sobral

如何检测我的测试正在Jenkins环境中运行?

  •  3
  • Daniel C. Sobral  · 技术社区  · 6 年前

    我用JUnit测试 Assumption 如果开发人员的计算机没有运行该测试的必备软件,则跳过该测试。尽管它是“junit”,但它是一个集成测试。像这样:

    int isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor();
    Assume.assumeThat("Software not present", isSoftwarePresent, is(equalTo(0)));
    

    然而,有一次我意识到测试 停止 由于这个假设,运行在Jenkins上的自动化构建上,最终引入了一个回归,测试应该停止。

    换句话说,所需的软件从Jenkins slave环境中丢失了,这导致测试被跳过。

    自动测试由Maven在Jenkins管道构建计划中使用故障保护插件运行。我怎样才能发现我的环境是詹金斯,这样我才能使假设条件更严格?

    也就是说,我希望条件是这样的:

    boolean isJenkinsBuild = /* true if this is being run inside a Jenkins build, false otherwise */;
    boolean isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor() == 0;
    Assume.assumeTrue("Software not present", isSoftwarePresent || isJenkinsBuild);
    

    甚至,

    @Test
    void testJenkinsEnvironment() {
        ...
        Assume.assumeTrue(isJenkinsBuild);
        Assert.assertTrue(isSoftwarePresent);
    }
    
    @Test
    void testFeature() {
        ...
        Assume.assumeTrue(isSoftwarePresent);
        ...
    }
    
    2 回复  |  直到 6 年前
        1
  •  6
  •   Daniel C. Sobral    6 年前

    由于它们很容易测试并传递给每个由构建执行的程序,所以我选择基于环境变量进行检查。

    虽然Rohit答案显示了在Jenkinsfile上设置变量的一种方法,但我更愿意依赖于Jenkins本身所做的事情,因此我检查了在我的Jenkins作业上设置的环境变量,有许多选项可供选择:

    一般詹金斯信息

    这些在詹金斯的例子中似乎是不变的。

    • HUDSON_URL
    • JENKINS_URL

    不特定于Jenkins,但以下内容也很有用:

    • USER

    我们的Jenkins在用户的控制下运行 jenkins 因此,测试该值也是可能的。

    工作信息

    对于同一个作业,它们在不同的构建中具有恒定的值。

    • JOB_URL
    • JOB_NAME
    • JOB_BASE_NAME
    • JOB_DISPLAY_URL

    生成信息

    它们在同一个构建中具有常量值(即,对于不同的 sh 调用)。

    • BUILD_URL
    • BUILD_TAG
    • RUN_CHANGES_DISPLAY
    • RUN_DISPLAY
    • BUILD_DISPLAY_NAME
    • BUILD_ID
    • BUILD_NUMBER

    节点信息

    这些与正在执行当前命令的节点相关。

    • JENKINS_HOME
    • JENKINS_NODE_COOKIE
    • NODE_LABELS
    • NODE_NAME

    特殊

    这一个会随着每个构建而改变,可能会从一个节点改变到另一个节点,甚至可能会随着jenkinsfile配置而改变:

    • WORKSPACE

    其他

    我不确定这些。他们肯定来自詹金斯,但我不知道他们的生命周期是什么。

    • HUDSON_SERVER_COOKIE
    • JENKINS_SERVER_COOKIE
    • HUDSON_COOKIE

    最后考虑

    为了我自己的目的,我决定 詹金斯家 . 这个名字是非常具体的詹金斯,它似乎比,比如, 詹金斯网址 . 虽然这并不意味着构建是由詹金斯运行的,但在这种情况下,它总是被设置的。我不介意假阳性,只要我没有假阴性。

        2
  •  1
  •   rohit thomas    6 年前

    实现这一点的几种方法:

    1. 您可以使应用程序接受参数,然后传递 指示它是否从Jenkins运行的真/假值。

    2. 您还可以读取操作系统的系统属性

    例如,system.getproperty(“os.arch”);

    但如果你的詹金斯环境和你的 工作区在同一台计算机上

    1. 您可以在管道中设置一个env变量(仅存在于管道中),在应用程序中可以读取该值。

    就像这样:

    管道-选项1

         pipeline {
                environment {
                    FROM_JENKINS= "TRUE" 
                } stage('test'){ 
    
                       sh "mvn test"
                 }
            }
    

    管道-选项2

         pipeline {
                stage('test'){ 
    
                        sh '''FROM_JENKINS="TRUE" // setting the env variable in the same shell where you are running mvn
                            mvn test'''
                 }
            }
    

    应用

    boolean isJenkinsBuild = Boolean.valueOf(System.getenv("FROM_JENKINS"));
    boolean isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor() == 0;
    Assume.assumeTrue("Software not present", isSoftwarePresent || isJenkinsBuild);
    

    希望有帮助:)