リビジョン管理にSVN-1.7.4を使用し、LAMPWebサイトの課題追跡システムとしてアトラシアンJIRAを使用しています。チームメンバーのいずれかが同じJiraIssueキーに言及せずにコミットした場合、SVNコミットを制限したいと思います。JIRAスタンドアロンを使用していて、サーバーにインストールしました。Google検索でSubversionJiraプラグイン(https://studio.plugins.atlassian.com/wiki/display/SVN/Subversion+JIRA+plugin)が見つかりましたが、JIRAキーを持つコミットを追跡するのに役立つだけで、それらを制限することで。この問題についてさらに詳細を投稿する必要がある場合は、お知らせください。
7 に答える
JIRA ReST APIを使用して、問題がJIRAにも存在することを確認することは難しくありません。
私たちの場合、私はpre-commit.tmpl
ファイルを使用し、冒頭のコメントセクションの後に以下を追加しました:
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
CURL=/usr/bin/curl
JIRAURL=http://our.jira.url:8080/rest/api/latest/issue
# Make sure that the log message contains some text.
LOGMSG=$($SVNLOOK log -t "$TXN" "$REPOS")
echo ${LOGMSG} | grep "[a-zA-Z0-9]" > /dev/null || exit 1
# check that log message starts with a JIRA ticket
# should have format 'FOO-123: my commit message' or 'FOO-123 my commit message'
JIRAID=$(expr "${LOGMSG}" : '^\([A-Z]*-[0-9]*\)[: ].*')
if [[ "$JIRAID" == "" ]]
then
echo "No JIRA id found in log message \"${LOGMSG}\"" >&2
echo "Please use log message of the form \"JIRA-ID: My message\"" >&2
exit 1
fi
# check if JIRA issue exists
JIRAISSUE=$(${CURL} ${JIRAURL}/${JIRAID})
if [[ "${JIRAISSUE}" =~ "Issue Does Not Exist" ]]
then
echo "The JIRA id ${JIRAID} was not found" >&2
echo "Please use log message of the form \"JIRA-ID: My message\"" >&2
exit 1
fi
これには、メッセージが「JIRA-id:text」または「JIRA-idtest」の形式である必要があります。正規表現をより一般的にして、テキスト内の任意の場所でJIRAIDを許可することができます。必要に応じて、にチェックを追加${JIRAISSUE}
して問題が開いていることを確認することもできますが、これは私たちの目的には十分なようです。
私はたまたまこれ(および他の多くのもの)をカバーするpre-commitフックを持っています。
フックはGit-Hubから入手できます。Jira IDが存在することは確認されませんが、コミットメッセージにJiraのようなIDが存在することは確認できます。これは通常、開発者がコミットメッセージにJiraチケット番号を追加するのに十分です。コミットメッセージでJiraのようなチケット番号を確認する方法を示すサンプルcontrol.ini
ファイルがあります。有効なコミットメッセージは次のようにフォーマットされます。
- なし:Jiraチケット番号がない問題を修正しました
- FDS-1231:1つのJiraチケットを修正しました
- FDS-1231、FDS-3232:いくつかのJiraチケットを修正しました
ただし、pre-commitフックよりも優れた方法は、職場の文化を変えることです。これにより、開発者はJiraチケット番号をコミットメッセージに自然に入れ、より詳細なコミットメッセージを自動的に提供します。Jenkinsのような継続的ビルドサーバーを使用すると、これが可能になることがわかりました。
Jenkinsは、チェックインするたびにコードを自動的にビルドします。ビルドごとに、変更とコミットコメントが表示されます。JenkinsはJiraに統合されているため、ワンクリックでJira情報を表示できます。Jenkinsはコミットメッセージとビルド#もJiraチケットに添付するため、QA担当者は特定のJiraチケットを確認し、どのビルドがこのチケットを修正したかを確認できます。
突然、コミットメッセージ情報がより見やすくなります。開発者とQAはそれに依存し始めます。Jiraチケットを追加しない開発者は、ビルドを行う人ではなく、上司や仲間の開発者に捕らえられます。良いコミットメッセージを置くことは今やその場所の文化になります。そして、それはどの事前コミットフックよりもはるかに優れた執行者です。
Atlassianは、SVNを含む最も一般的なVCSシステムに対してこれを行うトリガースクリプトに加えて、コミットの説明で何を探すかを定義できるJIRAプラグインを提供します。JIRACommitAcceptanceプラグインページを参照してください。
さて、私は、jiraの問題キーが正規表現によって提供されたかどうかを確認し、REST APIを呼び出して問題がサーバーに存在することを保証する、単純なシェルスクリプト(pre-commit)フックを作成しました。
#!/bin/sh
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
JIRAURL=http://myown.jira.server:8080/rest/api/latest/issue
CURL=/usr/bin/curl
LOGMSG=$($SVNLOOK log -t "$TXN" "$REPOS")
# check if any comment has supplied by the commiter
if [ -z "$LOGMSG" ]; then
echo "Your commit was blocked because it have no comments." 1>&2
exit 1
fi
#check minimum size of text
if [ ${#LOGMSG} -lt 20 ]; then
echo "Your Commit was blocked because the comments does not meet minimum length requirements (20 letters)." 1>&2
exit 1
fi
# get jira ID by regex
JIRAID=$(expr "$LOGMSG" : '^\([A-Z]*-[0-9]*\)[: ].*')
# Check if jira id was found.
if [ -z "$JIRAID" ]; then
echo "No JIRA id found in log message \"$LOGMSG\"" 1>&2
echo "Please use log message of the form JIRA-ID: My message" 1>&2
exit 1
fi
# check if JIRA issue exists on the server
JSON_RETURN=$(${CURL} -s ${JIRAURL}/${JIRAID} -u username:password | grep -o "errorMessage")
if [ -n "$JSON_RETURN" ]; then
echo "The specified Jira Issue \"$JIRAID\" was not found in Jira server." 1>&2
echo "Please, verify the specified issue ID and try again!" 1>&2
exit 1
fi
Commit Policy Pluginは、これを実施するためのかなり新しいJIRAアドオンです。
ここで提案されている他のソリューションとは異なり、コミットメッセージにパターンのような問題キー(「FOO-123」など)があるかどうかを検証するだけでなく、JIRAのconfigureJQLクエリと照合します。
たとえば、これにより、言及された問題が次のとおりであるかどうかを確認できます。
- 現在のスプリントで進行中のユーザーストーリー
- 次の製品バージョンを対象とした未解決のバグまたはタスク
- チームリーダーに割り当てられた優先度の高いタスク(コード凍結期間中)
上記の問題を確認する以外に、次のことも確認できます。
- コミッターのID(彼はJIRAにいますか?彼はJIRAグループにいますか?)
- 変更されたファイル(画像のみが送信されますか?.class、 .obj、*。tmpファイルはありますか?すべての*.PNGは/imagesディレクトリにありますか?)
- コミットメッセージ(この10文字以上は空白なしですか?JIRAキーで始まりますか?)
ドキュメントを確認して試してください。
免責事項:私はこのアドオンに取り組んでいる開発者です。それにもかかわらず、これはこの問題に利用できる最良の解決策です。
次のスクリプトは、abc-123のようなパターンを見つけて、それがjiraに存在するかどうかを確認するための正規表現を追加しました。また、コメントのどこにでも同様のパターンが存在する可能性がありますが、1つの成功したパターンが存在すると、コミットが可能になります-
#!/usr/bin/perl -w
$STATUS="1";
$REPOS=$ARGV[0];
$TXN=$ARGV[1];
$SVNLOOK="/usr/bin/svnlook";
$CURL="/usr/bin/curl";
$JIRAURL="http://x.x.x.x/jira/rest/api/2/issue";
$LOGMSG = `$SVNLOOK log -t $TXN $REPOS`;
chomp ($LOGMSG);
print "--$LOGMSG--\n";
if ($LOGMSG !~ /[A-Za-z][A-Za-z]*-[0-9][0-9]*/ ) {
print STDERR "NO JIRA case Found in comment - $LOGMSG";
exit (1);
}
@ARRAY= split (' ',$LOGMSG);
foreach (@ARRAY){
next if ! /[A-Za-z][A-Za-z]*-[0-9][0-9]*/ ;
chop();
$JIRAISSUE = `$CURL $JIRAURL/$_`;
chop ($JIRAISSUE);
if ($JIRAISSUE =~ /Issue Does Not Exist/){
print STDERR "The JIRA id $_ was not found\n";
}else { exit (0) };
}
exit ($STATUS);
pre-commitフックで単純な正規表現を使用する前にこれが行われるのを見ました。
プラス面としては、Jiraをチェックする必要はまったくありませんでしたが、有効な課題キーのように見えるものを入れることができるということでもありました。