ページ更新: 2013-12-24 (火) (1817日前)

関連: ソフト/Continuous Integration

(2008-05-14 新規作成)

Jenkins (Hudson) のメモ。

目次

[編集]

情報源 #

(リンクは後でまとめるけど、とりあえずメモ)

起動オプションは Winstone Servlet ContainerCmdLineOption - winstone - Google Project Hostingwinstone/README.html - GitHub と同じ。オプションの説明はjava -jar hudson.war --helpで表示できる。

Wiki (Confluence? )に詳しい説明(mod_proxyとか、mod_proxy_ajpも)がある。

[編集]

ソースコードの文字コードが想定と異なっていたら報告する (2012-12-13) #

chardet (ソフト/Script言語/Python/chardet) を用いて、ソースコードが SHIFT_JIS を使っていたら報告する処理を書いてみた。

環境と準備

  • Linux (Ubuntu Server) を用いている。
  • python-chardet パッケージをインストールしておく (apt-get install python-chardet)

Jenkns のビルド→「シェルの実行」に以下のシェルスクリプトを追加する

## --- SHIFT_JIS を用いているソースコードを見つける

cd $WORKSPACE

# ソースコードの種別ごとに、文字コードの一覧を作成する
find . -name "*.h" -o -name "*.cpp" | xargs /usr/bin/chardet > /tmp/chardet-cpp.log.$$
find . -name "*.py"                 | xargs /usr/bin/chardet > /tmp/chardet-py.log.$$

# SHIFT_JIS を使っているソースコードの有無を判定する
if grep -i SHIFT /tmp/chardet-*.log.$$; then FOUND=1; else FOUND=0; fi
## TODO grepがエラーで終了したとき(exitcode >= 2) も検出すること。

# 作業ファイルを削除する
rm -f /tmp/chardet-*.log.$$

# 結果を返す (0= 違反なし、1=違反あり)
exit $FOUND

grep の返り値は Man page of GREP に記載されている。

  • 0 = 見つかった
  • 1 = 見つからない
  • 2 = エラー

Windows の場合は、次のようにする。(コマンドプロンプトで確認済み、Jenkinsでは未確認)

  • find, xargs, grep は GnuWin32 などのものを使った GnuWin32
  • chardet は、Python 2.7.x (http://wwww.python.org) と pip をインストールして、pip install chardet でインストールして、 「python C:\Python27\Scripts\chardetect.py」を使う。
  • grep の終了コードは if %ERRORLEVEL% EQU 0 then で検査する。(コマンドプロンプトで「if /?」して、%ERRORLEVEL% の項目を参照のこと。)
setlocal

set FIND=c:\gnuwin32\bin\find
set XARGS=c:\gnuwin32\bin\xargs
set GREP=c:\gnuwin32\bin\grep
set CHARDET=python c:\Python27\Scripts\chardetect.py

cd %WORKSPACE%

%FIND% . -name "*.h" -o -name "*.cpp" | %XARGS% %CHARDET% > %TEMP%\chardet-cpp.log
%FIND% . -name "*.py"                 | %XARGS% %CHARDET% > %TEMP%\chardet-py.log

%GREP% -i SHIFT %TEMP%\chardet-*.log
if %ERRORLEVEL% EQU 0 (set FOUND=1) else (set FOUND=0)

del /q %TEMP%\chardet-*.log

exit /b %FOUND%
[編集]

テスト対象のWindowsプログラムの異常終了をトラップする (試してない) (2009-06-24) #

自動テスト対象のWindowsプログラムの異常終了によるテストの停止の検出・テスト停止の回避のために、 「Windowsプログラムの異常終了をトラップする」方法を調べていた。

で、4ヶ月ほど放置していたら、以下の記事が。正直ありがたい:

以下、当時のチケットに書いたリンクより:

[編集]

Apacheの背後でHudsonを動かす (2008-05-14) #

この作業の目的は次の2つ。

  1. SubversionやTracと同じ認証 (Basic認証、Digest認証、LDAP、.... Apacheがサポートしている全ての認証方式)で認証したい。
    1. でも、とりあえずは手慣れたBasic認証/Digest認証で試す。
  2. Hudsonを(ユーザーからの見た目上)Apacheと同じポートで動いているように見せたい。

Hudson 1.213 (安定版, 2008年5月2日) 、OSはDebian GNU/Linux 4.0 (Etch) と Windows XP Professional SP3 の2つで試した。

(なお、Debian では、自分で /etc/init.d/ スクリプトを書くのが面倒になったので Java Service Wrapper (Linux x86 32-bit Community 3.3.0) のテストも同時にやったが、Java Service Wrapper 経由だと転ける。未解決。java -jar hudson.war なら問題なし。)

Hudsonにアクセスできること、認証が使えること確認済み。

できればHudsonを丸ごと認証を書けるのではなく、設定画面とか、ソースコード(ワークスペース閲覧)とかだけ認証を掛けたい。 面倒なので追求してないけど。(HudsonでProxyPassとかの説明が書いてあるWikiにちょこっとだけ載ってたと思うけど)

[編集]

mod_proxy + mod_proxy_http でhttpPortで接続する場合 #

http://ホスト名/hudson → http://127.0.0.1:8080/hudson に送る場合

Hudsonの起動方法

java -jar hudson.war --prefix=/hudson --httpPort=8080 --httpListenAddress=127.0.0.1 --ajp13Port=-1 
  • --prefixを指定するとHudsonのドキュメントルートが移動する
  • --httpPort でポート番号を指定。ちなみに-1にするとHTTPをOffにできる。省略時は8080
  • --httpListenAddress でLISTENするIPアドレスやホスト名を指定できる。省略時は0.0.0.0(全ホスト)。
  • --ajp13port=-1 で、AJP13をOffにしている。

Windowsで試してみた:

C:> java -jar hudson.war --prefix=/hudson --httpPort=8080 --httpListenAddress=127.0.0.1 --ajp13Port=-1
[Winstone 2008/05/14 22:00:53] - Beginning extraction from war file
 : (略)
[Winstone 2008/05/14 22:00:54] - Winstone Servlet Engine v0.9.10 running: controlPort=disabled
[Winstone 2008/05/14 22:00:54] - HTTP Listener started: port=8080

Apache 2.2のmod_proxyとmod_proxy_httpを有効にする。

  • WindowsのApache2.2.8で、mod_proxyだけだと「[warn] proxy: No protocol handler was valid for the URL /hudson/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.」というエラーが出たので。
  • Debianだと明示的に有効にはしなかったけど(というかわざわざ無効にしたつもりだったのだが)、エラーが出なかった。(要 再確認)

httpd.confは次のようにする

<Location /hudson>
   Order allow,deny
   Allow from all
   
   # (略:ここに認証の処理を入れる)

   # HudsonのhttpPortを有効にしているときはこれを使う
   ProxyPass        http://127.0.0.1:8080/hudson
   ProxyPassReverse http://127.0.0.1:8080/hudson
</Location>
[編集]

mod_proxy + mod_proxy_ajp、ajp13Portで接続する場合 #

http://ホスト名/hudson → ajp://127.0.0.1:8009/hudson に送る場合

Hudsonの起動方法

java -jar hudson.war --prefix=/hudson --ajp13Port=8009 --ajp13ListenAddress=127.0.0.1 --httpPort=-1
  • --httpPort=-1 でHTTPをOffにする。
  • --ajp13port=8009 で、AJP13のポート番号を指定。省略時は8009
  • --ajp13ListenAddress でLISTENするIPアドレスやホスト名を指定できる。省略時は0.0.0.0(全ホスト)。

Windowsで試してみた:

C:> java -jar hudson.war --prefix=/hudson --ajp13Port=8009 --ajp13ListenAddress=127.0.0.1 --httpPort=-1
[Winstone 2008/05/14 22:03:58] - Beginning extraction from war file
  : (略)
[Winstone 2008/05/14 22:03:59] - Winstone Servlet Engine v0.9.10 running: controlPort=disabled
[Winstone 2008/05/14 22:03:59] - AJP13 Listener started: port=8009

Apache 2.2のmod_proxyとmod_proxy_ajpを有効にする。

httpd.confは次のようにする

<Location /hudson>
   Order allow,deny
   Allow from all
   
   # (略:ここに認証の処理を入れる)

   # Hudsonのajp13Portを有効にしているときはこれを使う
   ProxyPass         ajp://127.0.0.1:8009/hudson
   ProxyPassReverse  ajp://127.0.0.1:8009/hudson
</Location>
[編集]

HudsonTracPluginとの連携メモ(未完成)(2008-05-15) #

注意:この項目は後で別の場所に移すつもり。

HudsonTrac 0.1を使用。(svnで取得した物。zipは使わなかった)

プラグインの設定

  • feed_url http://ホスト/hudson/rssAll (ここのURLにTracのTimelineからリンクが貼られるので、localhost/127.0.0.1は使えない)
  • main_page /hudson/ (デフォルト値)

httpd.confの設定

<Location "/hudson">
    # (1) Digest認証
    AuthType Digest
    AuthName "SAMPLE"
    AuthUserFile "/path/to/htdigest"
    Require valid-user

    # (2) IPベースの認証
    Order allow,deny
    Allow from xxx.xxx.xxx.xxx (このPCのIPアドレス。ホスト名でもいいけどApacheにDNS逆引きの設定を追加すること。)

    # (3) (1)と(2)のいずれかの条件を満たせば、アクセスを許可する
    Satisfy Any
 
    # HTTP経由
#    ProxyPass         http://127.0.0.1:8080/hudson
#    ProxyPassReverse  http://127.0.0.1:8080/hudson

    # AJP13経由 
    ProxyPass         ajp://127.0.0.1:8009/hudson
    ProxyPassReverse  ajp://127.0.0.1:8009/hudson
</Location>

自分はTracのhtdigestは全プロジェクトで共通にしているので、こんな感じで。

[編集]

ごたく(まとめてない) #

Hudsonのワークスペースに存在するソースコードを、Hudson経由でダウンロードすることが可能。

これを、svn authzの粒度(リポジトリ毎、リポジトリ内のディレクトリ毎)でアクセス制限をかけるのは、 少々面倒だと思う。(少なくとも上記の<Location>や<LocationMatch>では)

もっとも、自分はCloverやCoberturaを使うのだけど、こちらのレポートにも全ソースコードが表示されるので、 そもそもHudson側を止める必要があるだけでは不十分なのだけど。

(いまのところ、ログイン権限を持つ人はソースコードを閲覧できる、という運用にしているので、困ってないけど。 なお、コミット権限はプロジェクトごとに管理してる)

なお、職場で Ant + findbugs, checkstyle, junit, cobertura, clover (2.2.1) を動かしてみた。うまくいった。しばらく様子を見てみる。 jdepend (textレポート, Graphvizによる図) のプラグインがないのが一寸残念。

Hudsonのプロジェクトの作成と設定は制限したい。 /hudson/manage, newJob,... を特定の人だけが操作できるように。 設定例はHudsonのwikiにあったはず。

[編集]

Subversionのパスワードを変更したら、Hudsonの方に反映しないと、Hudsonが重くなる (2008-10-29) #

環境:

  • Debian GNU/Linux 4.0 + etch-backports, Hudson 1.256, Apache 2.2.x, mod_dav_svn
    • Hudsonスレーブは Hudson 1.256 (Linux)、Hudson 1.255 (Windows)
  • 同一のPCでHudsonマスター、Subversionリポジトリサーバ(ついでにTracも)が動作している。
  • HudsonからSubversionリポジトリ()へのポーリング(2分間隔)を掛けているタスクがいくつかある。

Hudsonが使っているSubversionのパスワードを変更した。 Hudsonスレーブ (Linuxがいくつか、Windowsがいくつか) の方は1つ1つログインして「svn log -l 2 http://svn-server/svn/project」を実行して新しいパスワードを入力した。

この状態で、しばらくすると、Hudsonマスター兼Subversionリポジトリサーバがやたら重い。htopするとこうなった。

  1  [#####################################***99.3%]     Tasks: 130 total, 5 running
  2  [##################################******92.7%]     Load average: 1.98 1.89 8.37
  Mem[||||||||#**************************327/2026MB]     Uptime: 7 days, 15:52:00
  Swp[|                                    0/2855MB]

  PID USER     PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
 3689 hudson    20   0  737M  236M 10440 S 100. 18.0  1:03.02 java -jar /var/hudson/bin/hudson.war --httpPort=
 3532 www-data  20   0  273M 27044  5280 S 43.0  2.0  0:54.11 /usr/sbin/apache2 -k start
 3533 www-data  20   0  266M 23272  5352 S 39.7  1.7  0:45.11 /usr/sbin/apache2 -k start
 3800 hudson    20   0  737M  236M 10440 R 30.5 18.0  0:04.03 java -jar /var/hudson/bin/hudson.war --httpPort=
 4655 hudson    20   0  737M  236M 10440 R 19.9 18.0  0:00.78 java -jar /var/hudson/bin/hudson.war --httpPort=
 3801 hudson    20   0  737M  236M 10440 R 17.2 18.0  0:09.69 java -jar /var/hudson/bin/hudson.war --httpPort=
 3798 hudson    20   0  737M  236M 10440 R 14.6 18.0  0:16.63 java -jar /var/hudson/bin/hudson.war --httpPort=
 3700 hudson    20   0  737M  236M 10440 S 11.9 18.0  0:01.43 java -jar /var/hudson/bin/hudson.war --httpPort=
 3701 hudson    20   0  737M  236M 10440 S 10.6 18.0  0:01.39 java -jar /var/hudson/bin/hudson.war --httpPort=
 3702 hudson    20   0  737M  236M 10440 S  5.3 18.0  0:03.67 java -jar /var/hudson/bin/hudson.war --httpPort=
 3555 www-data  20   0  273M 26968  5280 S  5.3  2.0  0:02.33 /usr/sbin/apache2 -k start
 3541 www-data  20   0  273M 26968  5280 S  2.6  2.0  0:02.27 /usr/sbin/apache2 -k start
 3569 www-data  20   0  266M 23272  5352 S  2.6  1.7  0:01.88 /usr/sbin/apache2 -k start
 3556 www-data  20   0  273M 26968  5280 S  2.6  2.0  0:02.01 /usr/sbin/apache2 -k start
 3559 www-data  20   0  266M 23272  5352 S  2.6  1.7  0:01.97 /usr/sbin/apache2 -k start

HudsonがSubversionをポーリングするときに、なんか負荷がかかる処理に落ち込んでいる?

Hudsonでパスワードを変更する手順がわからなかったので、今回は乱暴にもhudson.scm.SubversionSCM.xmlを消去してみた。

最初に、Hudsonを停止して、hudson.scm.SubversionSCM.xml を消して、Hudsonを起動した。

次に、Hudsonのタスクの設定を1つ開き、Subversionアクセス用のユーザ名とパスワードを入力して、保存した。

これで、以前の負荷に戻ったようだ。

[編集]

Hudsonのslaveを半自動更新する (Unix編) (2009-02-23) #

2009-10時点では、SSH Slaves plugin - hudson - Hudson Wiki を使えば、以下の手順は不要になる。

sshで「マスターでコマンドを実行してスレーブを起動」している場合、 「マスターでコマンドを実行してスレーブを起動」にて、新しいスレーブを得ればよい。

「Hudson > nodes > スレーブ名」の「設定」にて、

  • 起動方法「マスターでコマンドを実行してスレーブを起動」、
  • 起動コマンド「ssh スレーブホスト名 '/var/hudson/slave.sh'」

スレーブ側 /var/hudson/slave.sh(エラーチェックがいい加減なので、もっとちゃんとすべき):

#!/bin/sh

## update slave agent

if [ -e hudson.war ]; then rm hudson.war; fi
wget -nv --no-proxy http://master/dav/Hudson/hudson.war

if [ -e slave.jar ]; then rm slave.jar; fi
unzip -p hudson.war WEB-INF/slave.jar > slave.jar

if [ -e hudson.war ]; then rm hudson.war; fi


## invoke slave agent

java -Xmx512m -jar /var/hudson/slave.jar

なお、Windowsでも同様のことを試みたが、うまくいかなかった。Hudson 1.250〜1.260くらいのころ。

  • Cygwin sshdは安定しているが、Windows版Subversionにて、svn up実行直後にスレーブが無反応になる
    • あと、Cygwin bashからWindowsのソフトウェアを呼ぶと、いろいろと齟齬があり、自動化の障害になる。(自動化しないなら無視できるものも多いが)
    • 試していないが、Cygwin版Subversionならうまくいくかもしれない。
  • 他のsshdを3つほど試したが、TCP接続が切れたり、派手に文字化けしたりしたので、ygwin sshdの方がましだった。