Jenkinsプラグインを作成する際のJellyテンプレート作成でのハマりポイントをメモしておきます。 順次追記していきます。
if/elseを使いたい
<j:if></j:if>
はありますが<j:else>
や<j:elseif>
はないようです。
<j:if></j:if>
を使用するか<j:when></j:when><j:otherwise></j:otherwise>
を使うといいと思います。
<!--
when/otherwise
-->
<j:choose>
<j:when test="${tool == 'chef'}">
<option value="chef" selected="selected">Chef</option>
</j:when>
<j:otherwise>
<option value="chef">Chef</option>
</j:otherwise>
</j:choose>
<!--
if文。elseやelseifはない
-->
<j:forEach var="summary" items="${it.ptdump}">
<j:if test="${summary.qindex=='1'}">
Hello World
</j:if>
<j:forEach>
repeatableタグ内のフォーム要素のhelpファイル
Jenkinsの管理画面ではフォーム要素の右側にクエスチョンマークが出て、クリックするとヘルプファイルを表示することができます。 通常はhelp-フォームのname属性.htmlという名前でhelpファイルを作成し、.javaファイルと同列に転がすと自動的にリンクされますが、repeatableタグを使用した場合、その中のフォーム要素でのヘルプファイルはこの命名規則が当てはまりません。
のように任意のhelpファイルを指定するようにします。 作成したhelpファイルは”src/webapp/“以下に設置するようにします。
repeatableタグ内のフォーム要素でFormValidationが効かない
フォームのバリデーション用メソッドはdoCheckName()
という名前で作成しますが、repeatableタグ内のフォーム要素にはこの法則が当てはまらないようです。 以下のように任意のバリデーションメソッドを使用するようにします。
プルダウンメニューで選択し保存された値が正しく表示できない
プルダウンメニューで、保存時の値を選択状態にしたい場合、公式プラグインでも以下のようにしている例を見ます。
しかしこの記述では描画されたHTMLではselected=”true”
のように描画されてしまい、ブラウザによっては動作しないと思われます。
<f:option value=”chef” selected=’${instance.tool==”chef”}’>Chef</f:option>
↓
<option selected=”true”>Chef</option>
そのため、私はwhen/otherwiseを使用して以下のように記述しました。
テンプレート中で外部CSSを参照したい
以下のようにテンプレートに記述すればOK。
<!--
実際のファイルの置き場所は以下のようになる。
src/main/webapp/css/style.css
src/main/webapp/script/jquery_min.js
-->
<link rel="stylesheet" href="/plugin/plugin_name/css/style.css" />
<script type="text/javascript" src="/plugin_name/script/jquery.min.js"></script>
JenkinsのActionクラスを拡張して「ビルド後の画面」を作成した場合に、左メニューが出ない
以下のようにsidepanel.jellyをincludeしてください。
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">
<l:layout>
<st:include it="${it.owner}" page="sidepanel.jelly" />
<l:main-panel>
<h2>右側メインエリア</h2>
</l:main-panel>
</l:layout>
</j:jelly>
repeatabledeletebuttonが出ない
という現象に遭遇しましたが、<f:entry></f:entry>
で括ってやらないと駄目です。
<f:section title="インスタンス設定">
<f:entry field="envs" title="インスタンス">
<f:repeatable field="envs" minimum="1">
<j:set var="helpURL" value="/plugin/aws_management/" />
<table width="100%">
<f:entry field="envName" title="名前(整理用)" help="${helpURL}help-envName.html" >
<f:textbox></f:textbox>
</f:entry>
<f:entry>
<div align="right">
<f:repeatableDeleteButton />
<hr />
</div>
</f:entry>
</table>
</f:repeatable>
<f:entry>
<div><hr /></div>
</f:entry>
</f:entry>
</f:section>