jenkins ユーザーが ant を実行できないときの対処法

CentOS 6.3 にて、Template for Jenkins Jobs for PHP Projects にある ant タスク (build.xml) 通りに PHPUnit タスクを実行しようとしたら、エラーが出てしまいました。

かなり長時間ハマったのでメモを残しておきます。

症状

CentOS 6.3 にて、Template for Jenkins Jobs for PHP Projects にある以下のタスクを実行するとエラーが出ました。 <target name="phpunit" description="Run unit tests using PHPUnit and generates junit.xml and clover.xml"> <exec executable="phpunit" failonerror="true"/> </target>

エラーメッセージ: # sudo -u jenkins ant ... phpunit: BUILD FAILED /var/lib/jenkins/jobs/mojamoja-unit-testing/workspace/build.xml:22: Execute failed: java.io.IOException: Cannot run program "phpunit": error=2, No such file or directory Total time: 0 seconds

原因

どうやら phpunit へのパスが通っていないようです。

phpunit の実体は /usr/local/bin/phpunit なのですが、jenkins ユーザーがこの PATH を参照できていない模様。

試行錯誤

まず、jenkins ユーザーの ~/.bash_profile~/.bashrc を以下の内容で作成してもダメでした。PATH は反映されません。


export PATH=$PATH:/usr/local/bin

また、下記のように ant タスク内で PATH を変更するシェルを走らせてもダメでした。

<target name="setenv">
   <exec executable="/bin/sh">
     <arg line="./setenv.sh"/>
   </exec>
 </target>

 <target name="env"><exec executable="env" /></target>

setenv.sh の中身は下記。

#!/bin/sh
export PATH=${PATH}:/usr/local/bin
echo $PATH

これで ant を実行すると、setenv タスクの時点では PATH は変更されていますが、次に実行される env タスクで元に戻ってしまっています。まるで setenv と env が別々のプロセスで動いているように見えます。

Buildfile: build.xml

setenv:
     [exec] /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

env:
     [exec] HOSTNAME=mojamoja
     [exec] SHELL=/bin/bash
     [exec] TERM=xterm
     [exec] HISTSIZE=1000
     [exec] USER=jenkins
     ...
     [exec] PATH=/sbin:/bin:/usr/sbin:/usr/bin      <- /usr/local/bin が追加されていない

とういわけで、setenv で環境変数をセットする方法はボツでした。

解決方法

1. Jenkins のグローバルプロパティを設定する

Jenkins から環境変数を上書きすることで、PATH を追加することができます。

Jenkinsの管理 > システムの設定 > グローバルプロパティ > 環境変数 にて、以下のように設定します。

  • キー: PATH
  • 値: ${PATH}:/usr/local/bin

ただし、この方法だと Jenkins から Ant を実行した時しか PATH は上書きされません。

2. sudoers の secure_path を無効にする

Fedora 系では sudo ユーザー向けの PATH が /sbin:/bin:/usr/sbin:/usr/bin のみに制限されているので、これを外してやります。

visudo コマンドを実行して、以下のように書き直します。 # secure\_path をコメントアウト # Defaults secure\_path = /sbin:/bin:/usr/sbin:/usr/bin # env\_keep に PATH を追加 Defaults env\_keep += "PATH"

これで secure_path の縛りが解除されました。

sudoers の環境変数は `sudo -l` で確認できます。 # sudo -l Matching Defaults entries for root on this host: !visiblepw, always\_set\_home, env\_reset, env\_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS\_COLORS", env\_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC\_ADDRESS LC\_CTYPE", env\_keep+="LC\_COLLATE LC\_IDENTIFICATION LC\_MEASUREMENT LC\_MESSAGES", env\_keep+="LC\_MONETARY LC\_NAME LC\_NUMERIC LC\_PAPER LC\_TELEPHONE", env\_keep+="LC\_TIME LC\_ALL LANGUAGE LINGUAS \_XKB\_CHARSET XAUTHORITY", env_keep+=PATH User root may run the following commands on this host: (ALL) ALL

参考