天天看點

【DEVOPS】快速實作SVN向zentao的流程打通

實作SVN向Zentao的打通,将原本由人推動的研發流程轉變為機器流轉,做到快速精準的價值流動。

1. 前言

DEVOPS中關于工具之間互通的重要性在 【DEVOPS】流程打通之快速實作SVN與Jenkins雙向關聯已經說明過了,這裡不再多廢話,直接進入正題。

2. zentao端擴充

這裡我們首先借鑒官網的內建禅道和svn,主要實踐其中的第四步(

代碼送出注釋格式:

)和第五步(

執行svn同步指令

)。這一步操作的主要目的是為了:

  1. 驗證zentao所提供的svn擴充功能正常。
  2. 熟悉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

腳本,請看如下測試結果:

  1. 直接CMD/Powershell指令行調用執行觸發 - 成功。
  2. python指令行調用執行觸發 - 成功。
  3. Ansible執行觸發 - 成功。
  4. 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. 最終效果

【DEVOPS】快速實作SVN向zentao的流程打通

5. Links

  1. Office Site - 禅道怎麼與svn內建?
  2. Office Site - 二次開發機制
  3. SVN用戶端配置日志模闆
  4. 禅道項目管理軟體的指令行入口

繼續閱讀