内容: 我想使用jenkins定期仅处理SVN中已更改的文件,并将处理的输出提交回SVN。
原因: 我们正在将二进制文件提交到SVN中(我们正在使用Oracle Forms,并且正在提交fmb- Files)。我创建了一个脚本,将fmb导出到xml(使用Oracle的原始Fmb2XML工具),然后我将XML转换为我们也想提交的纯源。这使我们可以进行摸索,查看更改等。
问题: 目前,我只能签出所有内容,转换整个目录并将整个目录提交回SVN。但是,由于所有纯文本文件都是新生成的,因此它们在SVN中显示为已更改。我只想提交更改的。
谁能帮我这个?
我安装了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”来提交更新的文件。