私たちの組織全体でJenkins 2.303.1をローカルで実行します。私たちは毎日何千ものビルドを実行しています。私が作業しているプロジェクトは、Jenkinsマスターと約10個のビルドノードセットを使用します。私たちは同様のアーキテクチャで何百ものMaven / Java / Springアプリケーションを構築しました。
ビルドプロセス中にjava、mvn、その他のツールを含む「ツールイメージ」があります。
昨日は、使用する必要があるいくつかの追加ツールを含むツールイメージの更新版を参照するためにビルドプロセスを更新しました。アップデートを実行した直後に、ビルドがすべて同じ方法で失敗する4つのビルドノードがあることを確認しました。おおよそのコマンドラインと出力は次のとおりです。
+ bash -o pipefail -c mvn -U -s ... -Duser.home=/ clean compile test-compile 2>&1 | tee mvn.out
The JAVA_HOME environment variable is not defined correctly,
this environment variable is needed to run this program.
このコマンドは、「sh」パイプライン段階で実行されます。
このエラーメッセージは "mvn"スクリプト内で発生します。存在しないと判断されると、$JAVA_HOME/bin/java
このエラーが発生します。
その後、この前にいくつかの「sh」呼び出しを追加して、次のようにマークしました。
which java
which mvn
ls -lt $JAVA_HOME/bin/java
「無効な」ノードでは、最初の2つのコマンドの結果は空の文字列です。これは、「java」と「mvn」がPATHにないか実行可能ではないことを意味します。 「good」ノードは、「java」および「mvn」実行可能ファイルの予想位置を印刷します。
3番目のコマンドの出力は次のとおりです。
-rwxr-xr-x. 1 root root 12768 Oct 17 21:48 /opt/java/openjdk/bin/java
その前に「env」出力も追加しました。これは、「JAVA_HOME」が「/opt/java/openjdk
」と同じであり、PATHにJavaディストリビューションのmvnおよびbinディレクトリが含まれていることを示しています。
証拠はさまざまな要因を示唆していますが、総合してみると言葉にはなりません。 "mvn"スクリプトは明らかに$JAVA_HOME/bin/java
それが存在しないと文句を言いますが、sh出力はそれが存在することを明らかに示しています。出力は「mvn」がPATHにないことを示しますが、上記のbashコマンドラインは絶対which mvn
パスなしで「mvn」のみを実行するため、到達できる唯一の方法はPATHからのものです。そうしないと、「mvn」スクリプト内でエラーメッセージが表示されません。
「良い」ノードで実行されているビルドと「不良」ノードで実行されているビルドのさまざまな側面を比較したいと思います。たとえば、2つの環境変数のリストをコピーして比較したところ、大きな違いは見つかりませんでした。
無効なビルドノードを再起動してみました。ローカルドッカーキャッシュ全体を消去し、ドッカーを再起動してみました。これらの段階のどれも何の変化ももたらさなかった。
私はこの問題を説明するために探求できるすべての可能な分野のアイデアを探しています。 Jenkinsビルドノードをメンテナンスする人、ツールイメージをメンテナンスする人、そして幅広い経験を持つ他の多くの人を含む、この問題を長く観察してきた複数の人がいます。私たちはみんなここに空白を描いています。