Выпуск 1
Существует два способа объединить несколько сборок в один экземпляр buildInfo в сценарии конвейера.
Первый - именно то, что вы сделали - сохранитьэкземпляр buildInfo возвращается из методов server.uoload или server.downkoad , а затем используется метод buildInfo.append для добавления (агрегирования) двух экземпляров buildInfo.
Второй способ, который, вероятно, вам нужен, - это создать экземпляр buildInfo и отправить его в качестве аргумента в методы server.uoload или server.doenload .Таким образом, вы можете отправить один и тот же экземпляр buildInfo нескольким методам выгрузки или загрузки и заставить его объединять все.
Вот как вы это делаете:
def buildInfo = Artifactory.newBuildInfo()
server.download spec: downloadSpec, buildInfo: buildInfo
server.upload spec: uploadSpec, buildInfo: buildInfo
server.publishBuildInfo buildInfo
Как это вам поможет?
Ну, так как вы вручную создаете свой экземпляр buildInfo, вы можете определить его в области действия, которая находится выше двух этапов, и таким образом, все этапы могут использовать экземпляр buildInfo.
Вот пример:
node {
// Obtain an Artifactory server instance, defined in Jenkins --> Manage:
def server = Artifactory.server "SERVER_ID"
// Create a buildInfo instance, to be used by the stages of this pipeline:
def buildInfo = Artifactory.newBuildInfo()
stage ('Upload files to Artifactory') {
def uploadSpec = """{
"files": [
{ "pattern": "/Users/eyalb/.m2/repository/a*a*.jar",
"target": "generic-local",
"excludePatterns": ["*SNAPSHOT*"],
"flat": "false"
}
]
}"""
server.upload spec: uploadSpec, buildInfo: buildInfo
}
stage ('Collect env vars') {
buildInfo.env.filter.addExclude("DONT_COLLECT*")
// By default the filter is configured to exclude "*password*,*secret*,*key*", but since we're overriding this configuration by adding our own exclusion, let's add these excludes:
buildInfo.env.filter
.addExclude("*password*")
.addExclude("*secret*")
.addExclude("*key*")
withEnv(['DO_COLLECT_FOO=BAR', 'DONT_COLLECT_FOO=BAR']) {
buildInfo.env.collect()
}
}
stage ('Access build info env vars') {
// BAR will printed
echo buildInfo.env.vars['DO_COLLECT_FOO']
// null will be printed, because we excluded it.
echo buildInfo.env.vars['DONT_COLLECT_FOO']
}
stage ('Set build retention') {
buildInfo.retention maxBuilds: 1, maxDays: 2, doNotDiscardBuilds: ["3"], deleteBuildArtifacts: true
}
stage ('Publish build info') {
server.publishBuildInfo buildInfo
}
}
Если вы хотите использовать декларативный конвейер, вот как вы разделяете один и тот же экземпляр buildInfo между несколькими этапами.Обратите внимание на метод initBuildInfo () - его нужно вызывать только один раз.Приведенный ниже пример включает в себя только два этапа из приведенного выше скриптового примера конвейера:
pipeline {
agent {
label "my-agents"
}
stages {
stage('Upload files to Artifactory') {
steps {
initBuildInfo()
def uploadSpec = """{
"files": [
{ "pattern": "/Users/eyalb/.m2/repository/a*a*.jar",
"target": "generic-local",
"excludePatterns": ["*SNAPSHOT*"],
"flat": "false"
}
]
}"""
server.upload spec: uploadSpec, buildInfo: buildInfo
}
}
stage('Collect env vars') {
steps {
buildInfo.env.filter.addExclude("DONT_COLLECT*")
// By default the filter is configured to exclude "*password*,*secret*,*key*", but since we're overriding this configuration by adding our own exclusion, let's add these excludes:
buildInfo.env.filter
.addExclude("*password*")
.addExclude("*secret*")
.addExclude("*key*")
withEnv(['DO_COLLECT_FOO=BAR', 'DONT_COLLECT_FOO=BAR']) {
buildInfo.env.collect()
}
}
}
}
}
def rtServer, buildInfo
void initBuildInfo() {
script {
rtServer = Artifactory.server "JX_ARTIFACTORY_SERVER"
buildInfo = Artifactory.newBuildInfo()
}
}
Выпуск 2
Когда вы работаете:
buildInfo.env.collect()
Сейчас вы просите Дженкинса собрать переменные среды (во время выполнения метода collect () ) и сохранить их в этом экземпляре buildInfo.
При установке:
buildInfo.env.capture = true
Вы просите Дженкинса собирать переменные среды при каждом методе загрузки и выгрузки, который использует этот buildInfo.Вы можете использовать это следующим образом:
def buildInfo = Artifactory.newBuildInfo()
buildInfo.env.capture = true
server.download spec: downloadSpec, buildInfo: buildInfo
server.upload spec: uploadSpec, buildInfo: buildInfo
server.publishBuildInfo buildInfo
Обратите внимание, что вы должны установить
buildInfo.env.capture = true
перед выполнением выгрузки или загрузки.
Так что преимущество использования:
buildInfo.env.capture = true
заключается в том, что вы можете установить его один раз в своем экземпляре buildInfo, а затем собрать env-переменные для вас с этого момента.С другой стороны, есть сценарии, когда вы хотите собирать переменные в определенной точке во время вашего конвейера.Вот тогда
buildInfo.env.collect()
пригодится.