2013-01-10 1 views
0

Jenkins 빌드 서버에서 일부 처리를 호출하여 마지막 빌드 이후에 도메인 모델이 변경되었는지 여부를 판별합니다. 나는 앞으로 db-migration 플러그인에서 기존 스크립트의 시퀀스를 호출 할 스크립트를 작성하는 것이 결론에 도달했다. 그런 다음 테스트 응용 프로그램 및 전쟁을 호출하는 단계에서이를 호출 할 수 있습니다.grails : 스크립트 작성에 대한 지침, 기존 데이터베이스 이주 스크립트 호출에 대한 지침

나는 Grails 문서와 일부 db-migration 스크립트를 살펴 봤는데 막혀있는 것을 발견했다. 어떤 것을 시도해 볼지 전혀 모른다. 누군가가 적절한 출처를 가르쳐 주면 정말 고맙겠습니다. 나는 Grails에서 약간 녹슬 었어. 6 개월간 지속 된 개념 프로젝트를 통해 2 년 전에 나 자신을 가르치기 시작했습니다. 그런 다음 이클립스 리치 클라이언트 작업으로 돌아갔다. 그건 내가 스크립트에 관여하지는 않지만 내 문제의 일부일 수 있습니다.

Jenkins evt에서 내가 필요한 것은 빌드에 사용되는 현재 SVN 개정 번호를 얻는 것입니다. 제안을 환영합니다.

감사합니다, 존

답변

1

grails create-script scriptname을 실행하여 새 스크립트를 작성합니다. 데이터베이스 이주 플러그인 스크립트는 쉽게 다시 사용할 수 있도록 구성됩니다. _DatabaseMigrationCommon.groovy에는 많은 공유 코드가 있으며 각 스크립트는 고유 한 이름을 가진 하나의 대상을 정의합니다. 따라서 공유 스크립트 또는 임의의 독립 실행 형 스크립트 (또는 여러 스크립트)를 가져 와서 메서드처럼 대상을 호출 할 수 있습니다.

includeTargets << new File("$databaseMigrationPluginDir/scripts/DbmGenerateChangelog.groovy") 

당신이 할 경우 설치된 플러그인 '디렉토리를 가리 마법 변수를 활용 스크립트가 includeTargets << grailsScript("_GrailsInit")를 통해 create-script "수입"는 _GrailsInit 스크립트에 의해 생성과 같은 작업을 수행 할 수 있습니다 기본적으로

, 이미 포함되어 있기 때문에 _GrailsInit의 include를 제거 할 수 있지만 Grails가 파일을 한 번만 포함하기 때문에 괜찮 으면.

그런 다음 대상을 정의하고 플러그인 대상 중 하나를 호출 할 수 있습니다. 타겟은 매개 변수를 받아 들일 수 없지만, 사용자가 지정한 args를 시뮬레이트하기 위해 argsMap에 데이터를 추가 할 수 있습니다 (Grails가 구문 분석 된 명령 행 인수에서 생성 한 맵입니다). 스크립트에 전달 된 인수는 모두 argsMap을 사용하기 때문에 데이터베이스 이전 플러그인의 스크립트에서 볼 수 있습니다. 여기

그냥 dbm-generate-changelog 같은 일을하지만 추가하는 예제 스크립트의 전 (before) 및 메시지 후 : 내가 foomain에서 대상을 이름

includeTargets << new File("$databaseMigrationPluginDir/scripts/DbmGenerateChangelog.groovy") 

target(foo: "Just calls dbmGenerateChangelog") { 
    println 'before' 
    dbmGenerateChangelog() 
    println 'after' 
} 

setDefaultTarget foo 

주 그래서, 독특한 경우에 당신이 원하는 다른 스크립트에서 이것을 호출하십시오.

println 'before' 
if (!argsMap.params) { 
    argsMap.params = ['foo2.groovy'] 
} 
dbmGenerateChangelog() 
println 'after' 

편집 : 인수 작업의 예로서

가 여기에 아무도 제공하지 않은 경우 기본 변경 로그의 이름을 지정하는 수정 된 버전의 다음의 출력을 캡처하는 풀러 예입니다 DBM은-GORM 문자열에 대한 차이 :

includeTargets << new File("$databaseMigrationPluginDir/scripts/_DatabaseMigrationCommon.groovy") 

target(foo: "foo") { 
    depends dbmInit 

    def configuredSchema = config.grails.plugin.databasemigration.schema 
    String argSchema = argsMap.schema 
    String effectiveSchema = argSchema ?: configuredSchema ?: defaultSchema 

    def realDatabase 
    boolean add = false // booleanArg('add') 
    String filename = null // argsList[0] 

    try { 
     printMessage "Starting $hyphenatedScriptName" 

     ByteArrayOutputStream baos = new ByteArrayOutputStream() 
     def baosOut = new PrintStream(baos) 

     ScriptUtils.executeAndWrite filename, add, dsName, { PrintStream out -> 
     MigrationUtils.executeInSession(dsName) { 
      realDatabase = MigrationUtils.getDatabase(effectiveSchema, dsName) 
      def gormDatabase = ScriptUtils.createGormDatabase(dataSourceSuffix, config, appCtx, realDatabase, effectiveSchema) 
      ScriptUtils.createAndPrintFixedDiff(gormDatabase, realDatabase, realDatabase, appCtx, diffTypes, baosOut) 
     } 
     } 

     String xml = new String(baos.toString('UTF-8')) 
     def ChangelogXml2Groovy = classLoader.loadClass('grails.plugin.databasemigration.ChangelogXml2Groovy') 
     String groovy = ChangelogXml2Groovy.convert(xml) 

     // do something with the groovy or xml here 

     printMessage "Finished $hyphenatedScriptName" 
    } 
    catch (e) { 
     ScriptUtils.printStackTrace e 
     exit 1 
    } 
    finally { 
     ScriptUtils.closeConnection realDatabase 
    } 
} 

setDefaultTarget foo 
+0

감사합니다. 정말 도움이되는 초보자를 제공하기 위해 문제를 해결해 주셔서 감사합니다. 나는 지금 'diff'파일을 만들 수 있었다. dbmGormDiff()에 파일 이름 매개 변수를 제공하지 않으면 콘솔에 출력이 표시됩니다 (지정된대로). 스크립트에서 콘솔 출력을 클로저로 전달할 수 있습니까? 그런 식으로 '

+0

답변을 편집하고 예제를 추가했습니다 –

+0

감사합니다 버트 - 정말 큰 도움이됩니다. 여전히 1.2.2를 사용하고 있기 때문에 DbmGormDiff 버전의 복사본에 'boasOut'을 대신 사용하여 코드를 작성했습니다. 내 메인 스크립트에서 사용할 내부 'utils'스크립트를 만들었습니다. 최대량은 지금 작동하고있다. 도메인 변경이 있고 changelog-svnRevno.xml 파일 (재실행)이 있으면 삭제하고 계속 진행합니다. 하나의 문제는 master.xml이 duplicates 'includes'로 업데이트되는 것을 막는 방법입니다. SVN에서 이전 버전을 가져 와서 그 문제를 해결할 수 있는지 확신 할 수 없습니다. SVN에서 재실행하는 방법을 모를 수 있기 때문입니다. 간단한 스크립팅이 필요하다고 생각합니다. –