redmineへのチケット登録を自動化したいという話があり、内容的には常時トリガーを拾って登録という感じだったので、javaの常駐プロセスでトリガーを拾う事を前提として、こちらを使用して実装してみました。
https://github.com/taskadapter/redmine-java-api
なお、登録対象のredmineは2.5系でしたが、それほどバージョンを意識しなくても大丈夫そうです。
事前準備として、対象のredmineへapi登録用のユーザーを用意し、登録対象のプロジェクトへの権限を付与、個人設定画面からapiキーを取得します。
その他、プロジェクトidやトラッカーid等のredmine内部で持っているidの値はブラウザからapiで下記のようにidの値を確認してセットとなります。ただ、redmine java apiには、様々なマネージャーがあるので、id指定でなくても都度問い合わせしてidを取得できそうです。
ソース的には下記のようなラッパークラスを作って、登録や更新を呼び出し側で簡略化出来るようにしてます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
package jp.eosoro.redmine; import java.util.ArrayList; import java.util.List; import com.taskadapter.redmineapi.Include; import com.taskadapter.redmineapi.RedmineException; import com.taskadapter.redmineapi.RedmineManager; import com.taskadapter.redmineapi.RedmineManagerFactory; import com.taskadapter.redmineapi.bean.CustomField; import com.taskadapter.redmineapi.bean.Issue; import com.taskadapter.redmineapi.bean.ProjectFactory; import com.taskadapter.redmineapi.bean.TrackerFactory; import com.taskadapter.redmineapi.bean.User; import com.taskadapter.redmineapi.bean.UserFactory; /** * Redmine登録クラス * */ public class RedmineRegist { RedmineManager mgr; private Issue issue; private List<CustomField> customeField; /** * コンストラクタ * @param String RedmineサイトURI * @param String APIキー */ public RedmineRegist(String uri, String apiAccessKey) { mgr = RedmineManagerFactory.createWithApiKey(uri, apiAccessKey); issue = new Issue(); customeField = new ArrayList<CustomField>(); } /** * チケット登録 * @param subject タイトル * @param description 詳細 * @param assigned_toId 担当者を指定する時はユーザーid 指定しない場合は0 * @param assigned_toGroupId グループを指定するときはグループid 指定しない場合は0 * @param parentid 親チケットを指定する時はチケットid 指定しない場合は0 * @param projectId * @param trackerId * @param priorityId * @param statusId * @return int 登録チケットID 登録失敗時はゼロ * */ public int regist(String subject, String description, int assigned_toId, int assigned_toGroupId, int parentid, int projectId, int trackerId, int priorityId, int statusId){ getIssue().setSubject(subject); getIssue().setDescription(description); //プロジェクト指定 getIssue().setProject(ProjectFactory.create(projectId)); //トラッカー指定 getIssue().setTracker(TrackerFactory.create(trackerId)); //ステータス/優先度指定 getIssue().setPriorityId(priorityId); getIssue().setStatusId(statusId); // カスタムフィールド設定 getIssue().addCustomFields(getCustomeField()); try { //担当者指定 if(assigned_toId > 0){ getIssue().setAssignee(getMgr().getUserManager().getUserById(assigned_toId)); } //グループ else if(assigned_toGroupId > 0){ User u = UserFactory.create(assigned_toGroupId); getIssue().setAssignee(u); } //親チケット if(parentid > 0){ getIssue().setParentId(parentid); } return getMgr().getIssueManager().createIssue(getIssue()).getId(); } catch (RedmineException e) { return 0; } } /** * 関連するチケットをセットする * @param int チケットID * @throws RedmineException * */ public void setRelation(int id, int relateid) throws RedmineException{ getMgr().getIssueManager().createRelation(id, relateid, "relates"); } /** * ジャーナル追加 * @param id チケットID * @param Notes コメント * @throws RedmineException * */ public int addJournal(int id, String Notes) throws RedmineException{ Issue issue = getMgr().getIssueManager().getIssueById(id, Include.journals); issue.setNotes(Notes); getMgr().getIssueManager().update(issue); return issue.getId(); } public RedmineManager getMgr() { return mgr; } private Issue getIssue() { return issue; } public List<CustomField> getCustomeField() { return customeField; } public void setCustomeField(List<CustomField> customeField) { this.customeField = customeField; } } |
下記の呼び出し側では、親チケットを作成してジャーナルを追加、子チケットを2つ作成し関連付けてます。
1 2 3 4 5 6 7 8 9 10 11 12 |
RedmineRegist mine = new RedmineRegist (url, apikey); int parentId = mine.regist("親チケット", "親チケット本文", 0, 0, 0, 4, 4, 2, 1); mine.addJournal(parentId, "ジャーナル"); int childId = mine.regist("子チケット", "子チケット本文", 0, 0, parentId, 4, 4, 2, 1); int relationId = mine.regist("関連チケット", "関連チケット本文", 0, 0, parentId, 4, 4, 2, 1); mine.setRelation(childId, relationId); |
いろいろやってみましたが、redmineに対して殆どの事は出来そうです。