Subversion 與 Mantis 1.x 整合作法

當 Mantis 有張貼一個新的 Issue 時, 與這個 Issue 相關的 Subversion 更動紀錄可以自動回寫至 Mantis 這個 Issue 內的 Bug 筆記內.

要達成這個目標,主要是撰寫一個 svn2mantis.pl 整合 Subversion 內的 hook 與 Mantis 內的 checkin.php 來達成,可參考以下概念圖:

<style box float-left> <ditaa name=concept> +——–+ ———–\ /—————-\ | SVN {d}| | SVN Server | | Mantis Server | | Client |–>| +——+ /——-=——-+ +————-+ | | Commit | | | hook +-=→+ svn2mantis.pl +-=→+ checkin.php | | +——–+ \—–+——/ +—————/ \——-+—–+–/ | +—–+ +→|{s} | | | +—–+ </ditaa> </quote> ===== - 相關環境 ===== * Mantis 與 Subversion 都安裝在相同的主機上 或 Subversion 主機可以透過 ssh 不需輸入密碼方式登入 Mantis 主機 * Mantis 版本為 1.0.7 安裝在 /var/www/html/mantis * Subversion 版本為 1.4.3-1 ===== - 設定程序 ===== ==== - Mantis 建立特殊整合 user ==== * 建立 svnbot 這個特殊的 userid * 存取權限設定為開發者 (如果有多個專案, 每個專案都要授與 svnbot 這個權限) ==== - 設定 Mantis 的參數檔 ==== <code php|h vi /var/www/html/mantis/config_inc.php> : : #Source Control $g_source_control_account = 'svnbot'; $g_source_control_regexp = '/\b(?:bug|issue|mantis)\s*[#]{0,1}(\d+)\b/i'; $g_source_control_set_status_to = RESOLVED; $g_source_control_set_resolution_to = FIXED; $g_source_control_fixed_regexp = '/\bfix(?:ed|es)\s+(?:bug|issue|mantis)?\s*[#]{0,1}(\d+)\b/i'; : </code> * 設定 svnbot 為這個整合的 mantis 內特殊 user * 只要 SubVersion 內的紀錄出現 bug 或 issue 或 mantis #編號 表示整合 Mantis 內的 Issue # Bug 筆記 * 只要 SubVersion 內的紀錄出現 fixed 或 fixes + bug 或 issue 或 mantis #編號 表示整合 Mantis 內的 Issue # Bug 筆記外, 更會將 issue 狀態改成已修正解決 ==== - 測試整合 Mantis ==== 直接執行以下的命令, 可以在 mantis 內的 Issue#2 新增 Bug 筆記 <file> php /var/www/html/mantis/core/checkin.php «< “Test issue #2 by svnbot.” 或 php /var/www/html/mantis/scripts/checkin.php «< “Test issue #2 by svnbot.” </file> 直接執行以下的命令, 可以在 mantis 內的 Issue#2 新增 Bug 筆記以及將問題狀態更改為以解決 <file> php /var/www/html/mantis/core/checkin.php «< “Test fixed issue #2 by svnbot.” 或 php /var/www/html/mantis/scripts/checkin.php «< “Test fixed issue #2 by svnbot.” </file> <note> 如果這個步驟沒有正確在 Mantis 內出現新增的 Bug 筆記, 可能是這個專案並沒有給 svnbot 這個特殊使用者權限 </note> ==== - Mantis 與 SVN 安裝在相同主機 ==== === - 寫一段整合 Mantis 的 script === * 點這裡直接下載 svn2mantis.pl 檔 <code perl |h vi /var/www/svn2mantis.pl> #!/usr/bin/perl # # 11:23 2008/4/30 # Jonathan Tsai # Ver 1.11 # # 自動將 svn 訊息寫入 mantis 紀錄內 # # 參考 https://www.ichiayi.com/trywiki/tech/svnmantis 的說明方式 # 本 script 需配合: # 1. /var/www/svn/xxxrepos/hooks/post-commit 一起使用 # 2.apache user 可使用 ssh 免密碼登入 Mantis 主機 ← SVN 主機與 Mantis 主機不同時需要 # # 1.00 (2007/3/26) 第一版啟用 # 1.01 (2007/3/26) 增加 commit 後自動整合的說明 # 1.10 (2007/6/22) 增加 遠端登入 Mantis 主機功能設定 # 1.11 (2008/4/30) 增加第三個參數,當成 sshcmd 的外部設定(避免與 Source 混在一起) # $prgname = substr($0, rindex($0,“/”)+1); $ver = “1.11 (2008/4/30)”; # 讀取參數資料 $REPOS=$ARGV[0]; $REV=$ARGV[1]; # $sshcmd 設為空字串表示 SVN 與 Mantis 安裝在相同主機 $sshcmd = defined($ARGV[2])?“/usr/bin/ssh ”.$ARGV[2]:“”; # 第三個參數為由 svn 主機免密碼登入 Mantis 主機的 ssh 命令參數 Exp. [email protected] → $sshcmd = “/usr/bin/ssh jonathan\@10.10.10.96”; # 定義外部指令 $svnlook = “export LANG=zh_TW.UTF-8;/usr/bin/svnlook”; $phpcmd = “/usr/bin/php”; $checkincmd = “/var/www/html/mantis/core/checkin.php”; # 取得 svn 相關資訊 $auth=`$svnlook author -r $REV $REPOS`; $dt=`$svnlook date -r $REV $REPOS`; $changed=`$svnlook changed -r $REV $REPOS`; $log=`$svnlook log -r $REV $REPOS`; $msg=“Changeset [”.$REV.“] by $auth\n$dt\n$log\n$changed”; # 傳送至 mantis if (length($sshcmd)>0) { `$sshcmd $phpcmd -q $checkincmd «< “$msg”`; } else { `$phpcmd -q $checkincmd «< “$msg”`; } </code> === - 測試執行 script === * 假設 servercfg 的 svn 存放在 /var/www/svn/servercfg * 假設 servercfg 的 Reversion 644 訊息內容有出現 mantis #2 ← 表示整合至 Mantis Issue #2 <file> chmod a+x /var/www/svn2mantis.pl /var/www/svn2mantis.pl /var/www/svn/servercfg 644 </file> * 這樣就可以看到 Mantis Issue #2 內新增一個 Bug 筆記, 內容如下: <file> Changeset [644] by jonathan 2007-03-26 11:29:55 +0800 (一, 26 3月 2007) 將 svnlook 命令前加入 LANG=zh_TW.UTF-8 來測試整合 mantis 中文訊息問題. mantis#2 U PD-920/var/www/svn2mantis.pl </file> === - 設定 SVN Commit 後自動執行 svn2mantis.pl === 如果有多個 svn repos 就在每個 repos 內依照這步驟一一執行, 以下還是以 servercfg 的 svn repos 為例 <file> cd /var/www/svn/servercfg cd hooks </file> <code bash 1|h vi post-commit> #!/bin/sh REPOS=“$1” REV=“$2” /var/www/svn2mantis.pl “$REPOS” “$REV” </code> <file> chown apache:apache post-commit chmod a+x post-commit </file> 這樣一但 commit 後, 會馬上執行這個 post-commit 的 shell script, 來執行 svn2mantis.pl 將 SVN 內的紀錄內容整合到 Mantis 的 Issue Bug 筆記內. ==== - Mantis 與 SVN 在不同主機 ==== === - 設定在 SVN 主機可以不用密碼登入 Mantis 主機 === * SVN Server : 10.10.10.91 * Mantis Server : 10.10.10.96 * 假設 svn server 是與 httpd 整合, 透過 apache 執行 * 先設定 SVN 主機內的 jonathan 帳號可以不用密碼以相同帳號登入 Mantis 主機 * 再設定 SVN 主機內的 apache 帳號可以不用密碼以 jonathan 帳號登入 Mantis 主機 == - SVN 主機 == * 在 /home/jonathan/.ssh 內產生憑證與公鑰 * 將公鑰複製到 Mantis 主機內改命名為 10.10.10.91_authorized_keys2 <file> su - jonathan ssh 10.10.10.96 ← 輸入密碼確認可以登入 exit ← 回到 svn 主機 cd .ssh ssh-keygen -d ← 產生 id_dsa.pub (詢問時均 Enter 跳下不輸入任何字元) scp id_dsa.pub 10.10.10.96:/home/jonathan/.ssh/10.10.10.91_authorized_keys2 </file> == - Mantis 主機 == * 將 SVN 主機公鑰加入認證公鑰清單檔內 * 將認證公鑰清單檔權限設為只有自己可以讀寫 <file> su - jonathan cd .ssh cat 10.10.10.91_authorized_keys2 » authorized_keys2 chmod 600 authorized_keys2 </file> == - 測試由 SVN 主機免密碼登入 Mantis 主機 == * 先使用 jonathan 帳號登入 SVN 主機 * 執行 ssh 10.10.10.96 就可以發現不需要密碼就可登入 Mantis 主機 <file> [[email protected] ~]$ ssh [email protected] Last login: Fri Jun 22 10:14:40 2007 from 10.10.10.91 [[email protected] ~]$ </file> == - 設定 SVN 主機內的 apache 免密碼登入 Mantis 主機 == * 登入 SVN 主機, 切換成 root * 將上面設定的 /home/jonathan/.ssh 目錄複製到 /var/www 內就可以 <file> su - cd /var/www cp -a ~jonathan/.ssh . chown -R apache:apache .ssh </file> === - 寫一段整合遠端 Mantis 的 script === <note important> * svn2mantis.pl Ver 1.11 (2008/4/30) 之後就不區分遠端與 Local 版本,增加第三個輸入參數 (遠端 ssh 所需要的參數) * 透過 svn 內的 hook/post-commit 直接指定 ssh 參數 </note> === - 測試執行 script === * 假設 moeaprj 的 svn 存放在 /var/www/svn/moeaprj * 假設 moeaprj 的 Reversion 1700 訊息內容有出現 mantis #516 ← 表示整合至 Mantis Issue #516 <file> chmod a+x /var/www/svn2mantis.pl /var/www/svn2mantis.pl /var/www/svn/moeaprj 1700 [email protected] </file> * 這樣就可以看到 Mantis Issue #516 內新增一個 Bug 筆記, 內容如下: <file> Changeset [1700] by chou 2007-06-20 12:09:04 +0800 (三, 20 6月 2007) 更改發文查詢的本文含附件列印 mantis#516 U EDOC2/Source/docsrv_html/inc/templates/edrecvquery_2.inc.htm </file> === - 設定 SVN Commit 後自動執行 svn2mantis.pl === 如果有多個 svn repos 就在每個 repos 內依照這步驟一一執行, 以下還是以 moeaprj 的 svn repos 為例 <file> cd /var/www/svn/moeaprj cd hooks </file> <code bash |h vi post-commit> #!/bin/sh REPOS=“$1” REV=“$2” /var/www/svn2mantis.pl “$REPOS” “$REV” [email protected] </code> <file> chown apache:apache post-commit chmod a+x post-commit </file> 這樣一但 commit 後, 會馬上執行這個 post-commit 的 shell script, 來執行 svn2mantis.pl 將 SVN 內的紀錄內容整合到 Mantis 的 Issue Bug 筆記內. ===== 參考資料 ===== * Integrating Mantis and Subversion * Mantis 官方網站手冊-Source Control Integration * 針對這整合作法可在這邊討論

  • tech/svnmantis1x.txt
  • 上一次變更: 2021/01/16 14:51
  • jonathan