釘釘自定義機器人配合SVN鉤子事件進行消息的推送實踐
目前很多公司還是使用SVN(TortoiseSVN)進行版本控制,使用簡單,適合管理一般項目。協同辦公軟件目前釘釘比較成熟,阿裏也一直在宣傳推廣,這兩年公司也在使用,主要用於信息的溝通,其它的績效、考勤、日誌、審批等都是掛載的我們公司內部的系統,很方便,之後釘釘推出了釘釘機器人,一開始覺得沒用,也就一直沒關註,但是最近我看了釘釘自定義機器人,覺得這個可以好好利用起來,看到網上也有這方面的應用說明,看著很簡單,但是按照流程操作起來各種坑,而且相關知識過於碎片化,今天我在這裏進行一下簡單的整合,梳理一下,希望對有這方面需求但是遇到問題的朋友們有所幫助。
一、環境說明
系統:CentOS7
客戶端SVN版本:1.8.7(Windows版本)
服務端SVN版本:1.7.14
二、CentOS7安裝SVN服務端
1、安裝SVN
yum install subversion
安裝完成後使用
svnserve --version
查看SVN版本,表示安裝成功。
2、創建版本庫
例如:創建一個 /var/svnroot/test的版本庫目錄,首先創建目錄
mkdir -p /var/svnroot/test
然後使用svnadmin創建版本庫:
svnadmin create /var/svnroot/test
創建完成之後/var/svnroot/test下面生成如下文件:
3、修改SVN配置文件
SVN的配置文件在conf目錄下面:
【authz】是權限控制文件
【passwd】帳號密碼文件
【svnserve.conf】SVN服務配置文件
1)創建SVN用戶,設置密碼
修改【authz】文件,命令:vi passwd
在文檔最下面加入如下內容:
2)修改權限控制
表示用戶guof對版本庫的根目錄讀寫權限
3)配置SVN服務
vi svnserve.conf
打開以下註釋:
auth-access = write #授權用戶可寫
password-db = passwd #使用哪個文件作為賬號文件
authz-db = authz #使用哪個文件作為權限文件
realm = /var/svnroot/test #認證空間名,版本庫所在目錄
4、啟動版本庫
啟動:
svnserve -d -r /var/svnroot/test
停止:
killall svnserve
5、Windows客戶端檢出測試
然後提示輸入賬戶、密碼即可檢出。
到此為止,CentOS7上安裝SVN服務端結束,很簡單吧!
接下來就是釘釘機器人以及SVN鉤子的配合了....
釘釘機器人相關參考資料:
釘釘開發平臺-文檔中心:https://open-doc.dingtalk.com/docs/doc.htm?treeId=257&articleId=105735&docType=1
其實無非就是post請求釘釘機器人而已,大家可以下載jar包自己在處理,封裝成一個jar包供SVN鉤子使用,進而進行消息的通知。此處就先不說Java代碼怎麽封裝了,有需要的可以留言聯系。
什麽是SVN的hooks?
svn hooks是一組“外掛”腳本程序,是svn提供的一組由svn事件觸發的特別有用的程序。這些程序在服務器端執行,可以提供svn之外的一些附加功能。鉤子可以調用批處理文件、可執行文件或者一些類似於perl、python等的腳本,SVN鉤子有如下幾種:
參考:https://www.cnblogs.com/gaohj/p/3154448.html
http://blog.csdn.net/wepe12/article/details/53510223
我們想在有人提交SVN後知道是誰在哪個時間提交了什麽內容,那麽就需要post-commit鉤子了,首先我們要把post-commit.tmpl模板文件拷貝一份,改名為post-commit (註意:post-commit.tmpl是模板文件,要使用的話必須改名為post-commit,即事件名和文件名要一直,要是SVN規定的,當時就坑在這裏了,忘記改名,同時賦予其可執行權限)
cp post-commit.tmpl post-commit
chmod +x post-commit # 賦予可執行權限
其中post-commit在觸發後會傳入兩個參數,一個是當前修改的目錄,一個是當前版本號,有了這倆其實就足夠了,但是有人會問:我看很多人做的消息推送裏面有修改時間、修改人、提交的內容以及提交的備註日誌信息啊,這倆參數怎麽夠呢?其實開始我也是納悶這個問題,後來仔細看了一下SVN官方文檔加各種博客才知道可以使用 svnlook命令啊,例如我想知道某個版本是誰提交的,可以使用:svnlook author -r 版本號 版本庫路徑,想知道提交時候都寫了什麽說明,可以使用:svnlook log -r 版本號 版本庫路徑,具體可參考:https://www.cnblogs.com/wangjiyuan/p/svnnn.html
此時我們修改post-commit裏面的內容,我把其中的內容都刪除了,加入了我自己的:
#!/bin/sh # 建議加上這句,防止中午亂碼,也可以是export LANG=zh_CN.GBK 根據實際情況設置 export LANG=zh_CN.UTF-8 REPOS="$1" REV="$2" # 作者 AUTHOR=$(svnlook author -r $REV $REPOS) # 備註信息 MESSAGE=$(svnlook log $REPOS -r $REV) # 本次提交的內容,返回格式: A 新建文本文檔.txt 其中,A:新增 D:刪除 U:修改 UU:內容和屬性改變 CHANGEDLIST=$(svnlook changed -r $REV $REPOS) # 修改日期 DATE=$(svnlook date -r $REV $REPOS) if [ "" = "$MESSAGE" ]; then "$MESSAGE"="無" fi #echo [MESSAGE:]$MESSAGE > /tmp/2222.log # PARAM="提交者:""$AUTHOR""|目錄:"$REPOS"|提交日期:"$DATE"|備註信息:"$MESSAGE "|文件列表:"$CHANGEDLIST"|版本號:"$REV #echo "$AUTHOR"|"$REPOS"|"$DATE"|"$MESSAGE"|"$CHANGEDLIST"|"$REV" >/tmp/3333.log # 下面調用jar包個人根據實際情況處理,不一定調用jar包,可以是Python腳本,甚至當前這個腳本都可以用Python寫,就不用調用了,直接調用機器人發送消息 java -jar /var/svnroot/DingDingReboot.jar /var/svnroot/config.properties "$AUTHOR" "$REPOS" "$DATE" "$MESSAGE" "$CHANGEDLIST" "$REV"
這樣的話就把提交人、版本庫路徑、提交時間、提交日誌、改動的內容、當前版本庫傳入你的jar包了,然後你的jar包接收參數、處理參數、封裝、按照要求post釘釘機器人即可發送消息。
相關坑和關鍵點說明
1、釘釘收到的消息中文亂碼,例如:
目前的解決方案就是在post-commit頭加入
export LANG=zh_CN.UTF-8 或者:
export LANG=zh_CN.GBK
2、一定要把hooks下面用到的鉤子改名,即用到哪個,就把文件後綴.tmpl去掉,或者直接創建一個新文件
3、要給post-commit賦予可執行權限,不然出現255錯誤
4、靈活應用svnlook命令,很多你想要的信息都可以通過它獲取到
最終效果:
至此svn安裝、鉤子配置全部完成,希望可以幫到有需要的各位!
釘釘自定義機器人配合SVN鉤子事件進行消息的推送實踐