sed заменяется на символ новой строки, выполняющий роль пробела в Groovy Jenkinsfile - PullRequest
1 голос
/ 23 сентября 2019

У нас есть требование выполнить ниже в Jenkinsfile, и оно работает нормально прямо на сервере:

Server: echo $myval | sed 's/,/\n/g' | grep analysisId | cut -d":" -f2

However, when I am trying to execute it in Jenkinsfile, it is treating newline as spaces, even though when I tried using '\' to supress '\':

Jenkinsfile: echo $myval | sed 's/,/\\n/g' | grep analysisId | cut -d":" -f2

Есть идеи, что я могу делать не так?Намерение здесь заключается в том, что я пытаюсь проанализировать JSON, и это единственная опция, которую мне оставляют с

Значение myval

{"task":{"id":"AW1eTPbXXXXXXXX","type":"REPORT","componentId":"AWz2VsZM-CVpcXXXXXX","componentKey":"Sonar-Scanner-SFDX_CI-ProjectKey","componentName":"BV GitLAB Test Project","componentQualifier":"TRK","analysisId":"AW1eTP3AX12345","status":"SUCCESS","submittedAt":"2019-09-23T13:26:05+0000","submitterLogin":"vgulati","startedAt":"2019-09-23T13:26:07+0000","executedAt":"2019-09-23T13:26:08+0000","executionTimeMs":1216,"logs":false,"hasScannerContext":true,"organization":"default-organization"}}

Необходимо получить значение параметра analysisId, которыйявляется AW1eTP3AX12345.

Раздел Jenkinsfile:

def analysisId = sh script: "echo $sonarUrlContent | sed 's/,/\\n/g' | grep analysisId | cut -d':' -f2",returnStdout:true
echo "analysisId: ${analysisId}"

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Поскольку у вас нет возможности установить плагин Pipeline Utility, вы можете самостоятельно импровизировать.

Это хакерское хакерское решение! Это работает только после того, как вынужно только одно значение:

def json = '{"task":{"id":"AW1eTPbXXXXXXXX","type":"REPORT","componentId":"AWz2VsZM-CVpcXXXXXX","componentKey":"Sonar-Scanner-SFDX_CI-ProjectKey","componentName":"BV GitLAB Test Project","componentQualifier":"TRK","analysisId":"AW1eTP3AX12345","status":"SUCCESS","submittedAt":"2019-09-23T13:26:05+0000","submitterLogin":"vgulati","startedAt":"2019-09-23T13:26:07+0000","executedAt":"2019-09-23T13:26:08+0000","executionTimeMs":1216,"logs":false,"hasScannerContext":true,"organization":"default-organization"}}'
def data = json.split(",")

data.each{ item ->
    if(item.startsWith('"analysisId"')){
       result = item.split(":")[1].replace('"', '') 
    }
}

echo "$result"

Использование readJSON было бы предпочтительнее в любом случае, но это должно работать.

0 голосов
/ 23 сентября 2019

Я не знаю, почему команда sed завершается неудачно, но если вы хотите проанализировать JSON, как подразумевалось @daggett, вам следует использовать метод jenkins native readJSON вместо groovy jsonSlurper

Вы должны установить плагин Pipeline Utility и использовать его следующим образом:

def json = '{"task":{"id":"AW1eTPbXXXXXXXX","type":"REPORT","componentId":"AWz2VsZM-CVpcXXXXXX","componentKey":"Sonar-Scanner-SFDX_CI-ProjectKey","componentName":"BV GitLAB Test Project","componentQualifier":"TRK","analysisId":"AW1eTP3AX12345","status":"SUCCESS","submittedAt":"2019-09-23T13:26:05+0000","submitterLogin":"vgulati","startedAt":"2019-09-23T13:26:07+0000","executedAt":"2019-09-23T13:26:08+0000","executionTimeMs":1216,"logs":false,"hasScannerContext":true,"organization":"default-organization"}}'

def data = readJSON text: json
echo "$data.task.analysisId"

readJSON возвращает карту Groovy, которую можно использовать, как и следовало ожидать.

...