JenkinsでRedmineプラグインつくってみた(公開は来年になりそう) #jenkinsja
JenkinsAdventCalendar2011 の 19日目です。
Jenkins Advent Calendar jp 2011 : ATND
以前に作っていたRedmineプラグインを公開しようと思うので、その前説的な位置づけでこの記事を書きました。
プラグインの概要は
- このプラグインはpushされたことを検知して起動するジョブであることが前提になっている
- ビルドの失敗でチケットを作成する
- ビルドの成功でコミットコメントに含まれるチケットをクローズする
って感じです。
2.2, 2.3が不完全なのでまだリリース出来ない感じ。
Jenkinsプラグインの作成方法
ここらへん読みましょう
Plugin tutorial - 日本語 - Jenkins Wiki
Hudsonプラグイン開発 - wyukawa’s blog
Jenkinsプラグインの作り方
JenkinsとRedmineを連携させる方法
JenkinsプラグインはJavaで書く事が多いと思います。
Redmineとの連携にはRedmineRESTAPIのJavaライブラリラッパーを使いました。
http://code.google.com/p/redmine-java-api/
RedmineRESTAPIは便利なので、もっと拡張してほしいです><
使ったクラス
ビルド後の通知なのでNotifierクラスを継承しました。
なんとなく次の感じ。
@Override public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) { RedmineManager mgr = new RedmineManager(redmineHost, apiAccessKey); List<String> ids = new ArrayList<String>(); if (build.getResult().isBetterOrEqualTo(Result.SUCCESS)) { Pattern pattern = Pattern.compile(".*(close\\s+refs\\s+)#(\\d+)"); for (Entry change : build.getChangeSet()) { Matcher matcher = pattern.matcher(change.getMsg()); if (matcher.find()) { ids.add(matcher.group(2)); } } for (String id : ids) { Issue issue = new Issue(); issue.setId(Integer.valueOf(id)); issue.setDoneRatio(100); try { mgr.updateIssue(issue); } catch (Exception e) { e.printStackTrace(); } } return true; } Issue issue = new Issue(); StringBuilder sb = new StringBuilder(); for (Entry change : build.getChangeSet()) { sb.append(change.getMsg() + "\n"); } issue.setSubject("Jenkins Build is FAILURE : " + build.getNumber()); issue.setDescription(build.getUrl() + "\n" + sb.toString()); try { mgr.createIssue(projectKey, issue); ScmType.reject(build, launcher, listener); } catch (Exception e) { e.printStackTrace(); } return true; }
SCMTypeっていうenumを同じクラス内で作っていて、MercurialかGitかBazaarのリポジトリでpushされたものをリジェクトする感じです。
でも、もう少し設定を柔軟に出来るようにして、リジェクトはオプションのほうがいいかも。