2012-10-17 91 views
5

什麼是:
與jenkins我想週期性地處理來自SVN的已更改文件並將處理輸出提交回SVN。只處理已更改的文件

爲什麼:
我們犯下的二進制文件到SVN(我們正在與甲骨文形式工作,犯下FMB文件)。我創建了一個腳本,將fmb導出到xml(使用Oracle的原始Fmb2XML工具),並將XML轉換爲我們也希望提交的普通源代碼。這讓我們greping,觀察變化,....

問題:
目前我只能夠檢出的一切,轉換整個目錄,並承諾整個目錄回SVN。但由於所有純文本文件都是新生成的,因此它們在SVN中出現更改。我只想提交更改後的內容。

任何人都可以幫助我嗎?

回答

4

我安裝了Groovy插件,配置了Groovy語言並創建了一個我作爲「系統Groovy腳本」執行的腳本。這些腳本看起來像:

import java.lang.ProcessBuilder.Redirect 

import hudson.model.* 
import hudson.util.* 
import hudson.scm.* 
import hudson.scm.SubversionChangeLogSet.LogEntry 

// uncomment one of the following def build = ... lines 

// work with current build 
def build = Thread.currentThread()?.executable 

// for testing, use last build or specific build number 
//def item = hudson.model.Hudson.instance.getItem("Update_SRC_Branch") 
//def build = item.getLastBuild() 
//def build = item.getBuildByNumber(35) 

// get ChangesSets with all changed items 
def changeSet= build.getChangeSet() 
List<LogEntry> items = changeSet.getItems() 

def affectedFiles = items.collect { it.paths } 

// get filtered file names (only fmb) without path 
def fileNames = affectedFiles.flatten().findResults { 
    if (it.path.substring(it.path.lastIndexOf(".") + 1) != "fmb") return null 
    it.path.substring(it.path.lastIndexOf("/") + 1) 
}.sort().unique() 

// setup log files 
def stdOutFile = "${build.rootDir}\\stdout.txt" 
def stdErrFile = "${build.rootDir}\\stderr.txt" 

// now execute the external transforming 
fileNames.each { 
    def params = [...] 
    def processBuilder = new ProcessBuilder(params) 

    // redirect stdout and stderr to log files 
    processBuilder.redirectOutput(new File(stdOutFile)) 
    processBuilder.redirectError(new File(stdErrFile)) 

    def process = processBuilder.start() 
    process.waitFor() 

    // print log files 
    println new File(stdOutFile).readLines() 
    System.err.println new File(stdErrFile).readLines() 
} 

然後我用命令行「svn commit」提交更新的文件。

3

初步注:獲取文件從回購在SVN行話是「結賬」,節約到回購 - 「提交」。不要混合使用CVS和SVN而言,它可能導致誤解

爲了得到修改過的文件列表中的修訂版本(或revset),可以使用

  • 簡單的方法 - 用選項-q -vsvn log。對於單版本,您還需要添加-c REVNO,對於版本範圍:-r REVSTART:REVEND。也許更多的--xml會生產出更適合的輸出,比純文本

你必須進行後處理,以獲得純淨的列表記錄的輸出,這是因爲:登錄包含一些你沒用的數據,在的情況下,日誌範圍可以有包含在一個以上的修改單修訂

z:\>svn log -q -v -r 1190 https://subversion.assembla.com/svn/customlocations-greylink/ 
------------------------------------------------------------------------ 
r1190 | lazybadger | 2012-09-20 13:19:45 +0600 (Чт, 20 сен 2012) 
Changed paths: 
    M /trunk/Abrikos.ini 
    M /trunk/ER-Telecom.ini 
    M /trunk/GorNet.ini 
    M /trunk/KrosLine.ini 
    M /trunk/Rostelecom.ini 
    M /trunk/Vladlink.ini 
------------------------------------------------------------------------ 

例如同一個文件:你必須log | grep trunk | sort -u,加回購基地,檔案名稱

  • 哈德方式:額外的SCM (即 - Merc赤羊)和hgsubversion你會得到稍多(也許)記錄與hg log --template "{files}\n" - 只有略有因爲你得到的只是文件列表,但在不同版本的文件集換行分隔,裏面修改文件名是空間分隔的
+0

好點!但是,如果我遵循簡單的路徑,我將不得不編寫一個腳本來解析XML,然後我將不得不啓動我的命令文件。因此,我更容易從腳本中獲取信息更改內容。 – ChrLipp