Как получить владельца сборки upstream в сборке downstream без использования параметра? - PullRequest
0 голосов
/ 04 августа 2020

У меня есть восходящий и нисходящий конвейеры, а в нисходящем конвейере я хочу сохранить пользователя, который начал сборку восходящего потока, в переменной сборки ниже по потоку. *

Owner = currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()

Один из способов - сохранить его в переменной в восходящем конвейере и передать его как параметр в нисходящий конвейер, но это дополнительная обработка, и, учитывая мой список параметров, это немного сложно.

Можно ли каким-либо образом получить пользователя, который начал сборку из восходящего потока в нисходящей сборке без передачи параметра?

Аналогично, JOB_NAME и BUILD_NUMBER из восходящего потока в нисходящий.

1 Ответ

0 голосов
/ 04 августа 2020

Ваша текущая сборка будет выводить указанную ниже причину сборки при запуске пользователем.

env.current_BUILD_CAUSE = currentBuild.getBuildCauses().toString()

env.current_BUILD_CAUSE:

[
  {
    "_class": "hudson.model.Cause$UpstreamCause",
    "shortDescription": "Started by upstream project \"ABC/XYZ/JobA\" build number 621",
    "upstreamBuild": 621,
    "upstreamProject": "ABC/XYZ/JobA",
    "upstreamUrl": "job/ABC/job/XYZ/job/JobA/"
  }
]

Итак, теперь я бы взял необходимые параметры из приведенных выше значений. Я не очень хорошо знаком с методом groovy. Итак, мы использовали директиву sh.

env.upstream_BUILD_NUMBER = sh(script: 'echo \"${current_BUILD_CAUSE}\" | jq .[].upstreamBuild | tr -d \'"\'', returnStdout: true).trim()
env.upstream_JOB_NAME = sh(script: 'echo \"${current_BUILD_CAUSE}\" | jq .[].upstreamProject | tr -d \'"\'', returnStdout: true).trim()
env.upstream_JOB_URL = sh(script: 'echo \"${current_BUILD_CAUSE}\" | jq .[].upstreamUrl | tr -d \'"\'', returnStdout: true).trim()

Поскольку вы не хотите передавать параметры от одного к другому, я бы просто скрутил JSON api сборку, а затем используйте ее для получения значений, которые требуются от сборки восходящего потока. Я использую здесь учетные данные, поскольку вам может потребоваться или не потребоваться аутентификация для jenkins в соответствии с вашими требованиями. Вы можете удалить это, если оно не требуется, вместе с аргументами -u в curl.

withCredentials([usernamePassword(credentialsId: 'your-CredentialsID-for-Jenkins', usernameVariable: 'user', passwordVariable: 'password')]) {
  env.upstream_OWNER_ID = sh(script: "curl -s -u $user:$password https://${JENKINS_DASHBOARD}/${upstream_JOB_URL}/{upstream_BUILD_NUMBER}/api/json | jq -r \'.actions[].causes[]?.userId | select(length>0)\'", returnStdout: true).trim()
}

Теперь у меня будет все, что нужно как для текущей, так и для восходящей сборки, без передачи каких-либо параметров от или до.

Примечание : приведенные выше примеры кода также содержат escape-последовательности, которые я сейчас использую в своей работе jenkins.

...