如何在 Jenkins 环境中检测到我的测试 运行?
How do I detect my test is running on a Jenkins environment?
我使用 Assumption
进行了 JUnit 测试,如果开发人员的计算机没有 运行 的必备软件,我会跳过该测试。尽管是 "junit",但这是一个集成测试。像这样:
int isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor();
Assume.assumeThat("Software not present", isSoftwarePresent, is(equalTo(0)));
然而,有一次我意识到由于这个假设,测试已经停止运行在 Jenkins 上的自动构建,最终引入了回归测试应该停止。
换句话说,Jenkins slave 环境中缺少所需的软件,导致测试被跳过。
自动化测试是 运行 由带有 FailSafe 插件的 Maven 在 Jenkins Pipeline 构建计划中进行的。如何检测到我的环境是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);
...
}
您可以通过多种方式实现此目的:
你可以让你的应用程序接受参数然后传递一个
TRUE/FALSE 值表示它是否来自 Jenkins 运行。
您还可以阅读os的系统属性
e.g. System.getProperty("os.arch");
但是如果你的 Jenkins 环境和你的
工作区在同一台机器上
- 您可以在您的管道中设置一个环境变量(仅存在于管道中),您可以在应用程序中读取该值
像这样:
管道-选项 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);
希望对您有所帮助:)
由于它们很容易测试并传递给由构建执行的每个程序,我选择基于环境变量进行检查。
虽然 rohit 回答显示了一种在 Jenkinsfile 上设置变量的方法,但我宁愿依赖 Jenkins 本身做的事情,所以我检查了在我的 Jenkins 作业上设置的环境变量,有很多选项可供选择:
一般 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
其他
我不确定这些。它们肯定来自 Jenkins,但我不知道它们的生命周期是什么。
HUDSON_SERVER_COOKIE
JENKINS_SERVER_COOKIE
HUDSON_COOKIE
最后的考虑
为了我自己的目的,我决定使用 JENKINS_HOME
。这个名字是 Jenkins 特有的,它看起来比 JENKINS_URL
更基础。虽然这并不意味着 Jenkins 正在构建 运行,但在这种情况下它总是会被设置。我不介意假阳性,只要我没有得到假阴性。
我使用 Assumption
进行了 JUnit 测试,如果开发人员的计算机没有 运行 的必备软件,我会跳过该测试。尽管是 "junit",但这是一个集成测试。像这样:
int isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor();
Assume.assumeThat("Software not present", isSoftwarePresent, is(equalTo(0)));
然而,有一次我意识到由于这个假设,测试已经停止运行在 Jenkins 上的自动构建,最终引入了回归测试应该停止。
换句话说,Jenkins slave 环境中缺少所需的软件,导致测试被跳过。
自动化测试是 运行 由带有 FailSafe 插件的 Maven 在 Jenkins Pipeline 构建计划中进行的。如何检测到我的环境是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);
...
}
您可以通过多种方式实现此目的:
你可以让你的应用程序接受参数然后传递一个 TRUE/FALSE 值表示它是否来自 Jenkins 运行。
您还可以阅读os的系统属性
e.g. System.getProperty("os.arch");
但是如果你的 Jenkins 环境和你的 工作区在同一台机器上
- 您可以在您的管道中设置一个环境变量(仅存在于管道中),您可以在应用程序中读取该值
像这样:
管道-选项 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);
希望对您有所帮助:)
由于它们很容易测试并传递给由构建执行的每个程序,我选择基于环境变量进行检查。
虽然 rohit 回答显示了一种在 Jenkinsfile 上设置变量的方法,但我宁愿依赖 Jenkins 本身做的事情,所以我检查了在我的 Jenkins 作业上设置的环境变量,有很多选项可供选择:
一般 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
其他
我不确定这些。它们肯定来自 Jenkins,但我不知道它们的生命周期是什么。
HUDSON_SERVER_COOKIE
JENKINS_SERVER_COOKIE
HUDSON_COOKIE
最后的考虑
为了我自己的目的,我决定使用 JENKINS_HOME
。这个名字是 Jenkins 特有的,它看起来比 JENKINS_URL
更基础。虽然这并不意味着 Jenkins 正在构建 运行,但在这种情况下它总是会被设置。我不介意假阳性,只要我没有得到假阴性。