開発者のコンピューターに実行に必要なソフトウェアがない場合、テストをスキップするためにAssumption
を使用するJUnitテストがあります。 「junit」であるにもかかわらず、それは統合テストです。このようなもの:
int isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor();
Assume.assumeThat("Software not present", isSoftwarePresent, is(equalTo(0)));
しかし、ある時点で、Jenkinsの自動ビルドでテストがstoppedで実行されていることに気づきました。その仮定により、最終的にはテストが停止するはずの回帰が導入されました。
言い換えると、必要なソフトウェアがJenkinsスレーブ環境から失われ、テストがスキップされました。
自動テストは、Jenkins Pipelineビルドプランで、FailSafeプラグインを使用してmavenによって実行されます。私の環境がジェンキンスであることをどのように検出して、仮定条件をより厳密にすることができますか?
つまり、条件を次のようにする必要があります。
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);
...
}
これらはテストが簡単で、ビルドによって実行されるすべてのプログラムに渡されるため、環境変数に基づいてチェックすることにしました。
Rohitの回答はJenkinsfileで変数を設定する1つの方法を示していますが、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
これらについてはよくわかりません。彼らは確かにジェンキンス出身ですが、私は彼らのライフサイクルが何であるかわかりません。
HUDSON_SERVER_COOKIE
JENKINS_SERVER_COOKIE
HUDSON_COOKIE
私自身の目的のために、JENKINS_HOME
を使用することにしました。名前はJenkins固有のものであり、たとえばJENKINS_URL
よりも基本的なようです。これは、ビルドがJenkinsによって実行されていることを意味するものではありませんが、その場合は常に設定されます。誤検知が発生しない限り、誤検知は気にしません。
これを達成するためのいくつかの方法:
アプリケーションに引数を受け入れさせ、Jenkinsから実行されているかどうかを示すTRUE/FALSE値を渡すことができます。
また、OSのシステムプロパティを読み取ることもできます。
例えば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);
それが役に立てば幸い :)