2016-08-25 4 views
2

Ich habe einen Pipeline-Job, der eine Vorlagendatei (z. B. eine XML-Datei) behandelt und einige Variablen aus der Datei mit Jobparametern ersetzen muss, bevor die gerenderte Datei verwendet wird, aber ich kann nicht scheinbar nichts sauberes zu tun, für jetzt benutze ich nur Shell-Skript und sed, um jede Variable einzeln zu ersetzen. HierJenkins-Pipeline: Templating eine Datei mit Variablen

ist ein Beispiel XML-Vorlagendatei:

<?xml version='1.0' encoding='UTF-8'?> 
<rootNode> 
    <properties> 
     <property1>${property1}</property1> 
     <property2>${property2}</property2> 
     <property3>${property3}</property3> 
    </properties> 
</rootNode> 

Ich möchte die „Variablen“ in meiner Vorlagendatei ersetzt werden mit meinem Job-Parameter $property1, $property2 und $property3. Hier ist, was ich heute tun:

sh "sed -i 's/@[email protected]/${property1}/' '${templateFile}'" + 
    "sed -i 's/@[email protected]/${property2}/' '${templateFile}'" + 
    "sed -i 's/@[email protected]/${property3}/' '${templateFile}'" 

... aber ich finde es ziemlich hässlich ... gibt es etwas in Jenkins für Dateien Templating wie was Jinja2 (oder einer Templat-Framework) tun würde?

Antwort

0

Wenn Sie nur etwas für XML-Dateien benötigen, dann wird das Konfigurationsdatei-Provider-Plugin für Jenkins funktionieren, aber für meine Zwecke ist es begrenzt. Es bietet einen zentralen Speicherort für Vorlagendateien (oder Sie können auf eine Datei im Dateisystem zeigen) und optional Token ersetzen. Das Problem besteht jedoch darin, dass die Token-Option auf alle oder keine Token abzielt (und fest codiert ist, um nach Tokens im Format $ {VAR} oder $ VAR) zu suchen. Wenn also alle Ihre Token in der jenkins-Umgebung verfügbar sind, ist alles in Ordnung, aber wenn Sie etwas Brauchbares haben, wird es einen Fehler verursachen. So zum Beispiel:

This is my instruction file. This file is saved to ${BUILD_URL}/file.txt 

Die oben wird jedoch funktionieren, wenn ich einen Bash-Skript erstellt werden soll ....

VAR = ${BUILD_URL} 
echo $VAR 

Dies wird scheitern, weil es keinen Wert für $ VAR finden. Es ist nicht hilfreich, dem $ zu entkommen, also bin ich mir nicht sicher, was ich in meinem Fall tun soll. Hier

+0

Haben Sie versucht, das '$' so zu umgehen: 'echo $ {'$'} VAR'? – jayhendren

0

ist die Lösung, die ich gefunden: Ich habe einen globalen Shared Library mit den folgenden Dateien erstellt:

resources/report.txt.groovy (das ist meine Template-Datei):

Hello from ${job}! 

vars/helpers.groovy:

import groovy.text.StreamingTemplateEngine 

def renderTemplate(input, variables) { 
    def engine = new StreamingTemplateEngine() 
    return engine.createTemplate(input).make(variables).toString() 
} 

Dann, in meiner Pipeline, fügte ich den folgenden Schritt hinzu:

variables = [ "job": currentBuild.rawBuild.getFullDisplayName() ] 
template = libraryResource('report.txt.groovy') 
output = helpers.renderTemplate(template, variables) 

Dies erzeugt eine Zeichenfolge in dem mit folgendem Inhalt output Variable gespeichert:

Hello from SIS Unix Automation Testing » myjob » master #29! 

wo SIS Unix Automation Testing » myjob » master der vollständige Name meiner Pipeline mehrfach verzweigten Jobs.

Natürlich können Sie mit dem Inhalt dieser Variable alles machen, was Sie wollen, wie in eine Datei schreiben oder per E-Mail verschicken, und Sie können XML-Dateivorlagen oder einen beliebigen Dateityp verwenden, nicht nur txt .

Beachten Sie, dass Sie die Sandbox- oder Genehmigungs-/Whitelist-Skripts deaktivieren müssen, um diesen Ansatz zu verwenden, da einige der Interna von StreamingTemplateEngine andernfalls blockiert werden.

Das Template-Format für das Streaming Template Engine ist wie folgt: etwas von der Form ${variable} oder $VARIABLE wird direkt ersetzt bekommen und <% %>/<%= %> Syntax verwendet werden kann Scriptlets (wie Schleifen oder if-Anweisungen) als auch (ähnlich einbetten zu ERB-Vorlagen). Die Dokumente für StreamingTemplateEngine sind verfügbar .