2017-06-18 6 views
0

Ich versuche folgende:Bash Variable in einem Jenkinsfile Flucht

sh ''' 
    changelog=$(git log `git describe --tags --abbrev=0 HEAD^`..HEAD --oneline) 
    curl --data '{"\tag_name\": \\"v0.0.${BUILD_NUMBER}\\",\"target_commitish\": \"master\",\"name\": \\"Release v0.0.$BUILD_NUMBER\\",\"body\": \\"$changelog\\",\"draft\": false,\"prerelease\": false}' https://****/api/v3/repos/****/****/releases?access_token=$JENKINS_ACCESS_TOKEN_PSW 
''' 

Grundsätzlich I "dynamische" Werte für tag, name und body enthalten sein soll, die die Jenkins Build-Nummer ($BUILD_NUMBER) aufgenommen verwenden und einen Bash-Variable, die das Ergebnis von git log (changelog) enthält.

Ich habe alle Arten von einfachen und doppelten Anführungszeichen und andere entkommene Änderungen gemacht, die ich nicht mehr sicher bin, wie es sein sollte.

Dies scheitert derzeit mit:

curl: (6) kann nicht Host lösen: variable
curl: (6) kann nicht Host beheben: Flucht
curl: (6) kann nicht Host auflösen : 9a21d71
curl: (6) Host nicht lösen kann: mehr
curl: (6) nicht Host auflösen kann: Flucht
curl: (6) Host nicht lösen kann: Versuch
curl: (6) kann nicht Host auflösen: 708ed0f
curl: (6) kann nicht Host beheben: mehr
curl: (6) kann nicht Host beheben: Flucht‘

Es ist nicht die Inhalte innerhalb des changelog Variable verarbeiten kann.

Antwort

4

Die Herausforderung besteht hier nicht nur darin, die Anführungszeichen beim dynamischen Erzeugen eines Strings korrekt zu umgehen, sondern auch sicherzustellen, dass das Ergebnis ein gültiger JSON ist. Zum Beispiel in Ihrem Fall changelog möglicherweise Zeilenumbrüche und Zitate und, wenn es in den "body": "$changelog" Teil Ihrer POST-Daten erweitert wird, müssen diese Zeichen richtig maskiert werden.

Zu diesem Zweck verwenden Sie das Dienstprogramm jq die POST-JSON-Daten zu erzeugen, wie in den answer zu einem ähnlichen question erklärt:

sh ''' 
    changelog=$(git log `git describe --tags --abbrev=0 HEAD^`..HEAD --oneline) 
    jq -n --arg tagname "v0.0.$BUILD_NUMBER"  \ 
      --arg name "Release v0.0.$BUILD_NUMBER" \ 
      --arg body "$changelog"     \ 
      '{"tag_name": $tagname, "target_commitish": "master", "name": $name, "body": $body, "draft": false, "prerelease": false}' | 
    curl [email protected] https://****/api/v3/repos/****/****/releases?access_token=$JENKINS_ACCESS_TOKEN_PSW 
''' 
+0

Hmm ... das ist für mich nicht gut funktioniert, ist es nicht mit " Probleme beim Parsen von JSON ". Sehen Sie das Ergebnis von Jenkins hier: https://pastebin.com/kSVd57Zc –

+0

@IdanAdar Was genau funktioniert nicht? Ich habe es schwer, es aus den bereitgestellten Daten zu erraten. – Leon

+0

Nun, es scheitert aufgrund der Analyse des JSON, das ist das einzige Ergebnis, das ich bekomme. Der Pastebin zeigt den Befehl an, der ausgeführt wird. –