Обработка только измененных файлов
Что:
С jenkins я хочу периодически обрабатывать только измененные файлы из SVN и передавать выходные данные обработки SVN.
Почему:
Мы записываем двоичные файлы в SVN (мы работаем с Oracle Forms и делаем fmb-Files). Я создал script, который экспортирует файл fmb в xml (с помощью оригинального инструмента Fmb2XML из Oracle), и я конвертирую XML в простой источник, который мы также хотим совершить. Это позволяет нам сглаживать, просматривать изменения,...
Проблема:
На данный момент я могу только проверить все, конвертировать весь каталог и передать весь каталог обратно в SVN. Но так как все текстовые файлы вновь создаются, они появляются в SVN. Я хочу зафиксировать только измененные.
Может ли кто-нибудь помочь мне с этим?
Ответы
Ответ 1
Я установил плагин Groovy, настроил язык Groovy и создал script, который я выполняю как "system Groovy script". Сценарии выглядят так:
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" для фиксации обновленных файлов.
Ответ 2
Предварительное примечание: получение файлов из репо в SVN-жаргоне - это "проверка", сохранение для репо - "фиксация". Не смешивайте CVS и SVN-термины, это может привести к неправильной интерпретации
Чтобы получить список измененных файлов в ревизии (или отменить), вы можете использовать
- Простой способ -
svn log
с параметрами -q -v
. Для отдельной ревизии вы также добавляете -c REVNO, для диапазона модификации: -r REVSTART: REVEND. Вероятно, дополнительный -xml даст более подходящий вывод, чем обычный текст
Чтобы получить чистый список, вы должны отправить отчет журнала, потому что: log содержит некоторые бесполезные для вас данные, а в случае журнала для диапазона вы можете иметь один и тот же файл, включенный в более чем одну версию
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 (а именно - Mercurial) и hgsubversion вы получите немного больше (возможно) log с
hg log --template "{files}\n"
- только немного, потому что вы получите только файл списка, но набор файлов в разных версиях разделен на новую строку, имена файлов внутри ревизии разделены пробелами