實作SVN向Zentao的打通,将原本由人推動的研發流程轉變為機器流轉,做到快速精準的價值流動。
1. 前言
DEVOPS中關于工具之間互通的重要性在 【DEVOPS】流程打通之快速實作SVN與Jenkins雙向關聯已經說明過了,這裡不再多廢話,直接進入正題。
2. zentao端擴充
這裡我們首先借鑒官網的內建禅道和svn,主要實踐其中的第四步(
代碼送出注釋格式:
)和第五步(
執行svn同步指令
)。這一步操作的主要目的是為了:
- 驗證zentao所提供的svn擴充功能正常。
- 熟悉SVN日志送出格式。
接着就是我們根據自身需求實作的自定義擴充了,這一步的主要目的是将上一步中配置在配置檔案中的SVN倉庫位址變更為指令行參數傳入。于是便有了以下擴充。
# E:\xmapp\zentao\module\svn
│ config.php
│ control.php
│ model.php
│
├─ext
│ ├─config
│ │ svn.php
│ │
│ ├─control
│ │ syncLog.php # 核心擴充類
│ │
│ ├─css
│ ├─js
│ ├─lang
│ │ ├─en
│ │ ├─zh-cn
│ │ └─zh-tw
│ ├─model
│ └─view
├─lang
│ en.php
│ zh-cn.php
│ zh-tw.php
│
├─syncer
│ config.php
│ Makefile
│ syncer.php
│ VERSION
│
└─view
cat.html.php
diff.html.php
其中
syncLog.php
擴充檔案的内容如下:
<?php
// syncLog.php
include '../../control.php';
class mySvn extends svn
{
public function syncLog($svnReposUrl)
{
$repos = new stdClass();
$repos ->path = base64_decode($svnReposUrl);
$repos ->username = "svnUsername";
$repos ->password = "svnPassword";
$sizeOfRepos = sizeof($this->config->svn->repos);
$this->config->svn->repos[$sizeOfRepos + 1] = $repos;
$this->run();
}
}
至此,zentao端的擴充結束,調用本API的URL位址為:
http://127.0.0.1:port/svn-syncLog-{svnReposUrl}
。這裡需要注意的是因為URL規範的要求,對于
svnReposUrl
參數我們需要将其進行base64編碼後傳入,這也是為什麼本擴充方法中有base64解碼的操作。
3. svn端擴充
依然是類似 【DEVOPS】流程打通之快速實作SVN與Jenkins雙向關聯的操作,這裡我們擴充出了
TriggerZentao.py
檔案。
from modules import Process
import collections
# `TriggerZentao.py`
def run(transaction, config):
check = config.getArray("TriggerZentao.CheckFiles", [".*\.*"])
ignore = config.getArray("TriggerZentao.IgnoreFiles", [])
files = transaction.getFiles(check, ignore)
java = config.getString("TriggerZentao.Java")
files = [transaction.getFile(oneFile[0]) for oneFile in files.iteritems() if oneFile[1] in ["A", "U", "UU"]]
filepath = files[0]
jenkinsInfo = getMatchedJenkinsInfo(filepath)
if jenkinsInfo is None:
return ("no matched Jenkins task", 1)
jenkinsJobName = jenkinsInfo[0]
svnPath = jenkinsInfo[1]
noteticedUser = transaction.getUserID() #.replace("zhengdandan","zhengdandan1")
command = "%s -jar {rootPath}/jenkins-cli.jar -s http://jenkinsIp:port/ -auth username:password build %s -p RESPO_URL=%s" % (java, jenkinsJobName, svnPath)
try:
Process.execute(command)
except Process.ProcessException, e:
msg = "Jenkins CLI trigger Zentao errors found:\n\n"
msg += e.output + "\n"
return (msg, 1)
return ("", 0)
def getMatchedJenkinsInfo(tempfileFullPath):
mappings = getMapping()
for k,v in mappings.items():
if k in tempfileFullPath:
return v
print tempfileFullPath
return None
def getMapping():
SVN_BASE_PATH = "https://ip:port/svn/"
d1=collections.OrderedDict()
d1["deployer"] = ["ADMIN_AUTO_TRIGGER_SVN_SYNC_TO_ZENTAO", SVN_BASE_PATH + "xxx/yyy"]
return d1
沒錯,這裡我們依然采用的是Jenkins + Ansible的觸發方式,至于為什麼會多此一舉,對于zentao提供的
ztcli.bat
腳本,請看如下測試結果:
- 直接CMD/Powershell指令行調用執行觸發 - 成功。
- python指令行調用執行觸發 - 成功。
- Ansible執行觸發 - 成功。
- python腳本執行觸發 - 失敗 。
最後附上 ansible腳本内容:
---
- hosts: windows_3
vars:
REPOS_URL_INNER: "{{ RESPO_URL | b64encode }}"
tasks:
- name: exec the exe of zentao, the respoUrl is {{ REPOS_URL_INNER }}
win_shell: |
cd E:/xmapp/zentao/bin
E:/xmapp/php/php.exe E:/xmapp/zentao/bin/ztcli http://127.0.0.1:port/svn-syncLog-{{ REPOS_URL_INNER }}
4. 最終效果
5. Links
- Office Site - 禅道怎麼與svn內建?
- Office Site - 二次開發機制
- SVN用戶端配置日志模闆
- 禅道項目管理軟體的指令行入口