2012/12/03

Jenkinsのプロジェクトにディスプレイ名を利用した場合にビルドパラメータが利用できなくなる

Jenkinsにおいて、プロジェクトにディスプレイ名を利用した上でそのプロジェクトをビルドパラメータに発生するというバグなので、かなりレアケースな気がしますが、再現性があって原因もわかったので報告がてら書いてみます。

2013.4.19追記   このバグについては修正済みのようです。

再現手順

  1. プロジェクトMyProject1にディスプレイ名Foobarを付ける
  2. ビルドパラメータを利用し、自分自身を利用する (実際には、ディスプレイ名を利用していればどのプロジェクトでもよい)
  3. そうすると、ビルド時のパラメータ指定ができなくなってしまう

原因 (の究明の過程)

まず、プロジェクトの設定ファイルconfig.xmlをのぞいてみました。

> cat ~/.jenkins/jobs/MySample1/config.xml
          :
  <parameterDefinitions>
    <hudson.model.RunParameterDefinition>
      <name>target_project</name>
      <description></description>
      <projectName>Foobar</projectName>
    </hudson.model.RunParameterDefinition>
  </parameterDefinitions>

どうやらprojectNameにディスプレイ名が保存されていることが原因のようです。 ということはプロジェクト設定の保存処理がおかしいのか…と思い、プロジェクト設定ページをインスペクトしてみました。

ビルドパラメータのプロジェクトをインスペクトした結果、次のようになりました。

<select name="parameter.projectName">
        :
  <option selected="true" value="Foobar">Foobar</option>
</select>

ここでもvalueがFoobarになっているということはこの設定を出力している個所が間違っているようです。

で、処理しているところを捜した結果、RunParameterDefinitionのconfig.jellyでjellyの出力時にvalueを出していないのが原因だとわかりました。

なので次のように修正。

 <f:entry title="${%Project}" help="/help/parameter/run-project.html">
     <select name="parameter.projectName">
       <j:forEach var="project" items="${app.items}">
-        <f:option selected="${instance.project==project}">${project.displayName}</f:option>
+        <f:option selected="${instance.project==project}" value="${project.name}">${project.displayName}</f:option>
       </j:forEach>
     </select>
 </f:entry>

とりあえず、この修正したファイルを再パックしたjarを$HOME/.jenkins/war/WEB-INF/libに置いたら動作することは確認しました。

プルリクエストはやったことがないので一旦ここまで。

自分としてはjelly周りとか軽く眺めてみてJenkinsの内部をちょっとわかった気になったのでよかったです。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。