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を取得できそうです。

ソース的には下記のようなラッパークラスを作って、登録や更新を呼び出し側で簡略化出来るようにしてます。
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つ作成し関連付けてます。
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に対して殆どの事は出来そうです。