5

内容:
jenkins を使用して、SVN から変更されたファイルのみを定期的に処理し、処理の出力を SVN にコミットします。

理由:
バイナリ ファイルを SVN にコミットしています (Oracle Forms を使用しており、fmb ファイルをコミットしています)。fmb を xml にエクスポートするスクリプトを作成し (Oracle の元の Fmb2XML ツールを使用)、XML をコミットしたいプレーン ソースに変換します。これにより、grepしたり、変更を表示したりできます....

問題:
現時点では、すべてをチェックアウトし、ディレクトリ全体を変換し、ディレクトリ全体を SVN にコミットすることしかできません。ただし、すべてのプレーン テキスト ファイルは新しく生成されるため、SVN では変更されているように見えます。変更したものだけをコミットしたい。

誰でもこれで私を助けることができますか?

4

2 に答える 2

5

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

その後、「svncommit」を指定したコマンドラインを使用して、更新されたファイルをコミットします。

于 2012-10-17T17:10:28.247 に答える
3

予備的な注意: SVN 用語でリポジトリからファイルを取得することは「チェックアウト」であり、リポジトリに保存することは「コミット」です。CVS と SVN の用語を混同しないでください。誤解を招く可能性があります

リビジョン(またはリビジョンセット)で変更されたファイルのリストを取得するには、次を使用できます

  • 簡単な方法 -svn logオプション付き-q -v。単一リビジョンの場合は、-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ファイル名に repo-base を追加する必要があります

  • より難しい方法: 追加の SCM (つまり - Mercurial) と hgsubversion を使用すると、ファイルリストのみを取得するため、わずかに多くの (おそらく) ログをhg log --template "{files}\n"取得できますが、異なるリビジョンのファイルセットは改行で区切られ、リビジョン内のファイル名はスペースです。 -分離
于 2012-10-17T17:25:57.027 に答える