0
  • 環境 - Linux。<< このマシンに me (c123456) としてログオンし、「sudo su - jenkins」を実行します
  • 言語 - Java
  • プロジェクト構造
    src/java -- Java ソースコード

    test/java -- Junit 単体テスト

    src/java-test -- 統合テスト

  • ビルドシステム - Gradle

build.gradle sourceSets の定義:

sourceSets {
   main {
      java {
         srcDir 'src/java'
      }
   }
   test {
      java {
         srcDir 'test/java'
      }
   }
   integrationTest {
      java {
         srcDir 'src/java-test'
      }
   }
}
  • プロジェクト「ProjectABC」のソースコードをどこかで正常にチェックアウトしたとしましょう。
  • 「gradle clean build」を実行すると、Cygwin セッションを使用してローカル マシン (Windows Win7 デスクトップ) ですべて正常に動作します。Java のコンパイルとテストの実行が成功しました。

  • パテ セッションを使用して Linux 端末で「gradle clean build」を実行すると、テスト タスク中に失敗しますが、Java コンパイル部分は成功します。

  • 「gralde clean build -x test」を実行すると、機能します (テストタスク呼び出しを除外しているため)。

パテセッションで「gradle clean build」を使用すると、次のエラーメッセージが表示されます。

:compileTestJava
Download http://artifactory_server2:8081/artifactory/libs-thirdparty-local/junit/junit/4.11/junit-4.11.pom
Download http://artifactory_server2:8081/artifactory/libs-thirdparty-local/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.pom
Download http://artifactory_server2:8081/artifactory/libs-thirdparty-local/junit/junit/4.11/junit-4.11.jar
Download http://artifactory_server2:8081/artifactory/libs-thirdparty-local/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
/production/jenkinsAKS/jobs/ProjectABCUtilities/workspace/test/java/com/tr/ids/util/test/tree/TestMultiParentTree.java:5: warning: unmappable character for encoding UTF8
 * Copyright � 2005 Thomson MICROMEDEX.  All Rights Reserved.
             ^
/production/jenkinsAKS/jobs/ProjectABCUtilities/workspace/test/java/com/tr/ids/util/test/tree/TestSingleParentTree.java:5: warning: unmappable character for encoding UTF8
 * Copyright � 2005 Thomson MICROMEDEX.  All Rights Reserved.
             ^
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
:processTestResources UP-TO-DATE
:testClasses
:test
Download http://artifactory_server2:8081/artifactory/jcenter-cache/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002.pom
Download http://artifactory_server2:8081/artifactory/jcenter-cache/org/jacoco/org.jacoco.build/0.6.2.201302030002/org.jacoco.build-0.6.2.201302030002.pom
Download http://artifactory_server2:8081/artifactory/jcenter-cache/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002.jar
Xlib: connection to "localhost:12.0" refused by server
Xlib: PuTTY X11 proxy: wrong authorisation protocol attempted

com.tr.ids.util.test.chart.TestChartUtilities > getPieChart FAILED
    java.lang.InternalError at TestChartUtilities.java:89

com.tr.ids.util.test.chart.TestChartUtilities > getLegend FAILED
    java.lang.NoClassDefFoundError at TestChartUtilities.java:103

com.tr.ids.util.test.chart.TestChartUtilities > useString FAILED
    java.lang.NoClassDefFoundError at TestChartUtilities.java:143

140 tests completed, 3 failed
:test FAILED

FAILURE: Build failed with an exception.

上記のように、":test" タスクは最後に呼び出されます。このプロジェクト ProjectABC だけが、次のコードを含む .java ファイルをテスト ソース コードに含むこのテスト ケースを持っています。

つまり、/test/java/com/tr/ids/util/test/...*.java、*.html の下

問題を起こしているファイルは次のとおりです: TestChartUtilities.java

テスト ソース コード - Java ファイル コードのスナップショットは次のとおりです: . 行/行番号 89、103、および 143 を参照してください。行には「結果 = ChartUtil」が含まれています。キーワード

package com.tr.ids.util.test.chart;

import java.awt.Color;
import java.io.UnsupportedEncodingException;

import junit.framework.Test;
import junit.framework.TestSuite;
import junit.textui.TestRunner;

import com.tr.ids.util.api.chart.ChartData;
import com.tr.ids.util.api.chart.ChartUtil;
import com.tr.ids.util.test.BaseTestCase;

..
....
......more code here ...
....
...

// #############################################################################
// Test.
// #############################################################################
/**
 * Test simple string with ampersand character.
 */
   public void getPieChart() {
      ChartData chartData = new ChartData();
      try {
         chartData.addChartItem(25, new Color(255,255,0));
         chartData.addChartItem(25, new Color(255,0,255));
         chartData.addChartItem(25, new Color(0,255,255));
      }
      catch (Exception e) {
         fail("Exception occured while building the ChartData object (probably 0 amount)");
      }
      byte[] result = null;
      try {
         result = ChartUtil.drawPieChart(chartData, 300);          // <--- line# 89 which is failing.
      } catch (Exception e) {
         fail("Exception occured trying to drawPieChart.");
      }
      assertNotNull("No pie chart returned", result);

   }

..
....
......more code here ...
....
...

/**
 * Test simple string with apostrophe and quote characters.
 */
   public void getLegend() {
      byte[] result = null;
      try {
         result = ChartUtil.drawLegend("ff0000", 40);          // <--- line# 103
      } catch (Exception e) {
         fail("Exception occured while drawing a legend box");
      }
      assertNotNull("No legend image returned", result);
   }

/**
 * Test simple string with less than and greater than characters.
 */
   public void useString() {
      ChartData chartData = new ChartData();
      try {
         chartData.addChartItem(25, new Color(255,255,0));
         chartData.addChartItem(25, new Color(255,0,255));
         chartData.addChartItem(25, new Color(0,255,255));
      }
      catch (Exception e) {
         fail("Exception occured while building the ChartData object (probably 0 amount)");
      }

      String graphDesc = null;
      try {
         graphDesc = chartData.generateStringRepresentaion(false);
      } catch (UnsupportedEncodingException e1) {
         fail("Exception occured while building the ChartData object (probably 0 amount)");
      }

      ChartData chartData2 = new ChartData();
      try {
         chartData2.loadFromString(graphDesc);
      } catch (NumberFormatException e) {
         fail("NumberFormatException thrown loading from string");
      } catch (Exception e) {
         e.printStackTrace();
         fail("Exception thrown");
      }

      byte[] result = null;
      try {
         result = ChartUtil.drawPieChart(chartData2, 300);      // <--- line# 143
      } catch (Exception e) {
         fail("Exception occured trying to drawPieChart.");
      }
      assertNotNull("No pie chart returned for chart loaded from string", result);
   }

前述したように、Cygwin (Windows ローカル マシン) では、Cygwin を介してローカル マシンですべてのグラフィカル/AWT 設定/ツールを使用できるため、すべてが機能します。

さて、何が欠けているのでしょうか???

Jenkinsジョブでも同じエラー(Puttyセッションを介して実行している場合)が発生するため、Jenkins「Xvfb Plugin」をインストール/使用すると、次のように役立つと思いました。

各ビルドで Xvfb 仮想フレーム バッファー X11 サーバーを制御できます。ビルドの開始前に Xvfb を開始し、ビルドで停止します。これは、ビルドに X11 アクセスが必要な場合 (たとえば、GUI を必要とするテストを実行する場合) に非常に便利です。

指示に従ってこのプラグインを構成しました: https://wiki.jenkins-ci.org/display/JENKINS/Xvfb+Plugin

しかし、それでもエラーが発生します。

Jenkins のログ (Jenkins Xvfb プラグインを使用していない場合) に、Putty セッションで取得したのと同じエラーが表示されます。

同様に、「gradle clean build -x test」が呼び出されると、Jenkins ジョブは成功しますが、「gradle clean build」を実行する必要があります (失敗します)。

ここで、Jenkins グローバル設定 (Manager Jenkins > Configure System の下) およびジョブの設定レベルで Jenkins "Xvfb" プラグインを有効にすると、実行中に Jenkins ログに次のエラーが表示されます。

..
....
15:30:11 Xvfb starting$ Xvfb :2 -screen 0 1024x768x24 -fbdir /production/jenkinsAKS/2013-08-23_15-30-072456509552045645846xvfb
..
...
...
:compileTestJava
Download http://artifactory_server2:8081/artifactory/libs-thirdparty-local/junit/junit/4.11/junit-4.11.pom
Download http://artifactory_server2:8081/artifactory/libs-thirdparty-local/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.pom
Download http://artifactory_server2:8081/artifactory/libs-thirdparty-local/junit/junit/4.11/junit-4.11.jar
Download http://artifactory_server2:8081/artifactory/libs-thirdparty-local/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
/production/jenkinsAKS/jobs/ProjectABCUtilities/workspace/test/java/com/tr/ids/util/test/tree/TestMultiParentTree.java:5: warning: unmappable character for encoding UTF8
* Copyright � 2005 Thomson MICROMEDEX.  All Rights Reserved.
                 ^
/production/jenkinsAKS/jobs/ProjectABCUtilities/workspace/test/java/com/tr/ids/util/test/tree/TestSingleParentTree.java:5: warning: unmappable character for encoding UTF8
* Copyright � 2005 Thomson MICROMEDEX.  All Rights Reserved.
                 ^
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
:processTestResources UP-TO-DATE
:testClasses
:test
Download http://artifactory_server2:8081/artifactory/jcenter-cache/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002.pom
Download http://artifactory_server2:8081/artifactory/jcenter-cache/org/jacoco/org.jacoco.build/0.6.2.201302030002/org.jacoco.build-0.6.2.201302030002.pom
Download http://artifactory_server2:8081/artifactory/jcenter-cache/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002.jar
15:30:51 Xlib: connection to "localhost:16.0" refused by server
15:30:51 Xlib: PuTTY X11 proxy: wrong authorisation protocol attempted
15:30:52 
com.tr.ids.util.test.chart.TestChartUtilities > getPieChart FAILED
java.lang.InternalError at TestChartUtilities.java:89

com.tr.ids.util.test.chart.TestChartUtilities > getLegend FAILED
java.lang.NoClassDefFoundError at TestChartUtilities.java:103

com.tr.ids.util.test.chart.TestChartUtilities > useString FAILED
java.lang.NoClassDefFoundError at TestChartUtilities.java:143

140 tests completed, 3 failed
:test FAILED

FAILURE: Build failed with an exception.

お気づきのように、今回はセリフが入っています。

15:30:51 Xlib: connection to "localhost:16.0" refused by server
15:30:51 Xlib: PuTTY X11 proxy: wrong authorisation protocol attempted
15:30:52 

Xvfb の高度な構成のジョブ レベル構成で、「Xvfb 固有の表示名」のボックスの値を 13 または 16 (プラグインによる) として言及した場合、テスト部分で同じエラーが表示されます (以前に取得したように) が、今回のX11関連のエラーは、次のようになります。

15:31:42 Xvfb starting$ Xvfb :16 -screen 0 1024x768x24 -fbdir /production/jenkinsAKS/2013-08-23_15-31-388454769980302593302xvfb
15:31:42 _XSERVTransSocketINETCreateListener: ...SocketCreateListener() failed
15:31:42 _XSERVTransMakeAllCOTSServerListeners: server already running
15:31:42 
15:31:42 Fatal server error:
15:31:42 Cannot establish any listening sockets - Make sure an X server isn't already running
15:31:42 unlink: No such file or directory
15:31:42 unlink  failed, errno 2
15:31:44 ERROR: Xvfb failed to start, consult the lines above for errors

ps -eAf|grep -i xvfb - Linux サーバーで実行されているものは何も表示されません。

Jenkins ジョブが Xvfb プラグインを使用して実行されると、実行中に X ディスプレイを自動的に開始/停止するための呼び出しが開始されます (Jenkins Xvfb ヘルプ ページの Xvfb プラグインの機能に従って)。

また、Linux マシンで X11 転送が有効になっていることもわかりました。

# grep X11F /etc/ssh/sshd_config
X11Forwarding yes                          
#

私が気づいたことの1つは、Jenkinsの実行に使用するユーザーは「jenkins」であり、Linuxマシンに私(c123456 id)としてログインしてから「sudo su - jenkins」を実行すると、.XAuthorityはありませんファイル。

実行中: ... 存在することを示しています: ls -ltra ~c123456

-rw------- 1 c123456 devgroup   406 Aug 23 13:07 .Xauthority

ただし、ユーザー jenkins、つまり ls -ltra ~jenkins には同じものは存在しません (.XAuthority ファイルはありません)。

Linux の $DISPLAY 変数が設定されていますが、「xclock」が機能しません。X11設定を有効にして、X11転送をチェックしました(クライアント側、つまりターゲットLinuxマシンセッションのWindowsローカルマシンのパテ設定で)。

[c1234563@devserver1 ~]$ echo $DISPLAY localhost:15.0 [c1234563@devserver1 ~]$ xclock X localhost:15.0 への接続が壊れています (明示的な強制終了またはサーバーのシャットダウン)。[c1234563@devserver1 ~]$

このリンクを試しましたが、問題を解決するための指示に従って、まだ問題を解決できません。

http://froebe.net/blog/2008/11/14/getting-xlib-putty-x11-proxy-wrong-authentication-protocol-attempted-i-have-the-answer/

私を助けることができるこの時点で何が欠けている可能性があります:

1) Putty セッションまたは Jenkins ジョブの方法を使用して、テストの失敗の問題を解決します。

2) Xvfb プラグインがメモリ フレーム バッファーを使用して X ディスプレイを実行しているかどうか疑問に思っています。その場合、X ディスプレイ サーバー/クライアントをローカル Windows マシン/ターゲット Linux マシン (XMing、XVnc/TightVnc など) にインストールしないでください。

4

2 に答える 2

0

これは奇妙な答えですが、問題を解決するために次のことを行いました。遅かれ早かれXvfbプラグインが必要になることはわかっていますが..

  1. ワークスペース/ジェンキンス ジョブを削除するか、ジェンキンス ジョブの名前を変更しました。削除する場合はバックアップを取ってください。
  2. パテでは、gradle clean build と gradle clean build jacocoTestReport が機能しました。
  3. Jenkinsではまだ失敗しました。を。Jenkins Xvfb プラグインを削除しました b. Jenkins インスタンスを再起動しました
  4. 問題が解決しました。

前述のとおり、GUI テストには Xvfb が必要ですが、上記の手順を実行した後、発生していた問題は発生しなくなりました。

最終更新: 解決策は、Jenkins ジョブのワークスペース フォルダーのデータを削除することです。

于 2013-08-27T17:30:47.890 に答える