今度は、backlogへの課題登録を自動化したいという話があり、前回のredmineと似通った要件なので再利用箇所も多く、redmine java api部分をヌーラボ公認のbacklog4jに置き換えて実装してみました。
redmineとの違いはそれなりにありますが、backlog4jの方はKeyとIDを混同しやすい感じがします。例えば、課題のKeyはURLを見ればすぐ解りますが、IDの方は内部的なユニークな数値です。これに注意しながらbacklog用に前回のラッパークラスを置き換えてみました。
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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
import java.net.MalformedURLException; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import com.nulabinc.backlog4j.BacklogClient; import com.nulabinc.backlog4j.BacklogClientFactory; import com.nulabinc.backlog4j.Category; import com.nulabinc.backlog4j.Issue; import com.nulabinc.backlog4j.IssueComment; import com.nulabinc.backlog4j.IssueType; import com.nulabinc.backlog4j.Project; import com.nulabinc.backlog4j.Status; import com.nulabinc.backlog4j.api.option.AddIssueCommentParams; import com.nulabinc.backlog4j.api.option.CreateIssueParams; import com.nulabinc.backlog4j.api.option.GetIssuesParams; import com.nulabinc.backlog4j.api.option.UpdateIssueParams; import com.nulabinc.backlog4j.conf.BacklogConfigure; import com.nulabinc.backlog4j.conf.BacklogJpConfigure; import com.nulabinc.backlog4j.conf.BacklogPackageConfigure; public class BacklogRegist { private BacklogClient backlog; public BacklogRegist(String url, String apikey) throws MalformedURLException { BacklogConfigure conf = null; //オンプレ環境 if(url.startsWith("http")){ conf = new BacklogPackageConfigure(url); } //クラウド else{ conf = new BacklogJpConfigure(url); } conf.apiKey(apikey); backlog = new BacklogClientFactory(conf).newClient(); } /** * 課題を取得する * @param issueKey * */ public Issue getIssue(String issueKey){ if(issueKey == null){ return null; } return getIssue = backlog.getIssue(issueKey); } /** * 課題を作成する * @param projectKey * @param issueTypeName 種別名称 * @param categoryName カテゴリ名称 * @param summary 件名 * @param description 詳細 * @return ticketID 0は登録失敗 * */ public long regist(String projectKey, String issueTypeName, String categoryName, String summary, String description){ CreateIssueParams param = new CreateIssueParams( getProjectID(projectKey), summary, getIssueTypeId(projectKey, issueTypeName), Issue.PriorityType.Normal); param.description(description); if(StringUtils.isNotEmpty(categoryName)){ List<String> categoryIds = new ArrayList<String>(); categoryIds.add(getCategoryId(projectKey, categoryName)); param.categoryIds(categoryIds); } Issue issue = backlog.createIssue(param); if(issue != null){ return issue.getId(); } return 0; } /** * 課題を更新する(コメントの追加も可能) * @param projectKey プロジェクトKey * @param issueIdorKey 課題IDまたはKey * @param status ステータス名称(更新しなければセットしない) * @param addComment 更新なければセットしない * @return commentID 0は登録失敗 * */ public long update(String issueIdorKey, String status, String addComment){ long ret = 0; Issue issue = null; if(StringUtils.isNotEmpty(status)){ UpdateIssueParams param = new UpdateIssueParams(issueIdorKey); for( Status Entity: backlog.getStatuses()){ if( Entity.getName().equals(status)){ param.status(Entity.getStatusType()); } } issue = backlog.updateIssue(param); } else{ issue = backlog.getIssue(issueIdorKey); } if(StringUtils.isNotEmpty(addComment)){ AddIssueCommentParams params = new AddIssueCommentParams(issue.getIssueKey(), addComment); IssueComment cmt = backlog.addIssueComment(params); ret = cmt.getId(); } else{ ret = issue.getId(); } return ret; } /** * 課題にコメントを追加する * @param projectKey * @param issueKey * @param addComment * @return commentID 0は登録失敗 * */ public long addComment(String issueKey, String addComment){ Issue issue = backlog.getIssue(issueKey); if( issue != null){ AddIssueCommentParams params = new AddIssueCommentParams(issue.getIssueKey(), addComment); IssueComment cmt = backlog.addIssueComment(params); return cmt.getId(); } return 0; } /** * 課題のタイプ(種別)を取得する * @param prjKey プロジェクトキー * @param name 種別名称 * */ public String getIssueTypeId(String projectKey, String name){ for( IssueType type: backlog.getIssueTypes(projectKey)){ if( type.getName().equals(name)){ return type.getIdAsString(); } } return null; } /** * カテゴリを取得する * @param prjKey プロジェクトキー * @param name 種別名称 * */ public String getCategoryId(String projectKey, String name){ for( Category type: backlog.getCategories(projectKey)){ if( type.getName().equals(name)){ return type.getIdAsString(); } } return null; } /** * プロジェクトIDを取得する * @param prjKey プロジェクトキー * @return Projectid * */ public String getProjectID(String projectKey){ for( Project type: backlog.getProjects()){ if( type.getProjectKey().equals(projectKey)){ return type.getIdAsString(); } } return null; } } |
上記を呼び出すのはこんな感じ
1 2 3 4 5 6 7 8 |
BacklogRegist backlog = new BacklogRegist("{URLまたはスペースID}","{apiKey}"); //チケット取得 Issue issue = backlog.getIssue("PROJECT-3"); //チケット登録 long issueId = backlog.regist("PROJECT", "要望", "設定変更", "ユーザーの追加について", "○○さんを追加してください"); |
後日談
GetIssieで3ヶ月経って問題発生・・・たまに課題の取得に失敗するようになりました・・・
下記のようにしましたが、最初からそうしろ!って事ですね。でも、3ヶ月は何も問題なかったのですが・・
public Issue getIssue(String issueKey)
1 |
Issue getIssue = backlog.getIssue(issueKey); |