Frage Verarbeitet nur geänderte Dateien


Was:
Mit jenkins möchte ich regelmäßig nur geänderte Dateien von SVN bearbeiten und die Ausgabe der Verarbeitung zurück an SVN übergeben.

Warum:
Wir binden Binärdateien in SVN ein (wir arbeiten mit Oracle Forms und commit fmb-Files). Ich habe ein Skript erstellt, das die FMBs nach XML exportiert (mit dem ursprünglichen Fmb2XML-Tool von Oracle) und dann wandle ich die XML in eine reine Quelle um, die wir auch einbinden wollen. Dies ermöglicht uns zu greping, die Änderungen zu sehen, ....

Problem:
Im Moment kann ich nur alles auschecken, das gesamte Verzeichnis konvertieren und das gesamte Verzeichnis zurück auf SVN übertragen. Da jedoch alle Nur-Text-Dateien neu generiert werden, erscheinen sie in SVN geändert. Ich möchte nur die geänderten festlegen.

Kann mir jemand dabei helfen?


5
2017-10-17 10:01


Ursprung


Antworten:


Ich habe das Groovy-Plugin installiert, die Groovy-Sprache konfiguriert und ein Skript erstellt, das ich als "System-Groovy-Skript" ausführe. Das Skript sieht folgendermaßen aus:

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()
}

Danach verwende ich die Befehlszeile mit "svn commit", um die aktualisierten Dateien zu committen.


4
2017-10-17 17:10



Vorbemerkung: Dateien bekommen aus Repo im SVN-Jargon ist "checkout", speichern repo - "verpflichten". Mischen Sie nicht CVS und SVN Begriffe, es kann zu Fehlinterpretationen führen

Um eine Liste der geänderten Dateien in Revision (oder Revset) zu erhalten, können Sie verwenden

  • Einfacher Weg - svn log mit Optionen -q -v. Für eine einzelne Revision fügen Sie auch -c REVNO hinzu, für den Revisionsbereich: -r REVSTART: REVEND. Wahrscheinlich wird zusätzlich --xml eine geeignetere Ausgabe als Klartext erzeugen

Sie müssen die Ausgabe des Protokolls nachbearbeiten, um eine reine Liste zu erhalten, denn: log enthält einige nutzlose Daten für Sie, im Falle von Protokoll für Bereich können Sie die gleiche Datei in mehr als einer Revision enthalten

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
------------------------------------------------------------------------

Beispiel für eine einzelne Revision: Sie müssen log | grep trunk | sort -u, fügen Sie Repo-Base zu Dateinamen hinzu

  • Harter Weg: mit zusätzlichen SCM (nämlich - Mercurial) und hgsubversion erhalten Sie etwas mehr (vielleicht) log mit hg log --template "{files}\n" - nur leicht Da Sie nur die Dateiliste erhalten, aber Dateigruppen in verschiedenen Revisionen durch Zeilenumbrüche getrennt sind, sind die Dateinamen in der Revision durch Leerzeichen getrennt

3
2017-10-17 17:25