web-dev-qa-db-ja.com

テストがJenkins環境で実行されていることをどのように検出しますか?

開発者のコ​​ンピューターに実行に必要なソフトウェアがない場合、テストをスキップするために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);
    ...
}
8

これらはテストが簡単で、ビルドによって実行されるすべてのプログラムに渡されるため、環境変数に基づいてチェックすることにしました。

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によって実行されていることを意味するものではありませんが、その場合は常に設定されます。誤検知が発生しない限り、誤検知は気にしません。

15

これを達成するためのいくつかの方法:

  1. アプリケーションに引数を受け入れさせ、Jenkinsから実行されているかどうかを示すTRUE/FALSE値を渡すことができます。

  2. また、OSのシステムプロパティを読み取ることもできます。

例えばSystem.getProperty( "os.Arch");

しかし、これはJenkins環境とワークスペースが同じマシン上にある場合は機能しません

  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);

それが役に立てば幸い :)

2
rohit thomas