Дженкинс строит из тега с помощью плагина Bitbucket Branch Source

#jenkins #jenkins-pipeline #bitbucket #jenkins-plugins

#Дженкинс #Дженкинс-конвейер #bitbucket #Дженкинс-плагины

Вопрос:

Я хотел бы создать свой конвейер jenkins, когда я создаю тег в главной ветке в bitbucket. У меня есть дженкинс, который строит на фиксации главной ветки, но, похоже, я не могу заставить его построить для создания тега.

Это то, что у меня есть до сих пор:

 stage('Update DEV ECS') {
  when { branch 'dev' }
  steps {
    script{
      withAWS(region:'us-east-1') {
        def outputs = cfnUpdate(stack: 'DEV-TARGETDB-SERVICE',
          params:["ImageUrl=${env.FULL_ECR_URL}"],
          keepParams:[
            'EnvVarName1',
            'EnvVarValue1',
            'EnvVarName2',
            'EnvVarValue2',
            'EnvVarName3',
            'EnvVarValue3',
            'ContainerCpu',
            'ContainerMemory',
            'ContainerPort',
            'DatabaseHost',
            'DatabaseName',
            'DatabasePassword',
            'DatabaseUser',
            'DesiredCount',
            'HttpCode',
            'HTTPSListener',
            'Path',
            'Priority',
            'Role',
            'TaskRole',
            'ServiceName',
            'StackName',
            'DataDogAPIKey',
            'TaskCpu',
            'TaskMemory'
          ],
          timeoutInMinutes:15,
          pollInterval:1000)
      }
    }
  }
}

stage('Update TEST ECS') {
  when { branch 'master' }
  steps {
    script{
      withAWS(region:'us-east-1') {
        def outputs = cfnUpdate(stack: 'TEST-TARGETDB-SERVICE',
          params:["ImageUrl=${env.FULL_ECR_URL}"],
          keepParams:[
            'EnvVarName1',
            'EnvVarValue1',
            'EnvVarName2',
            'EnvVarValue2',
            'EnvVarName3',
            'EnvVarValue3',
            'ContainerCpu',
            'ContainerMemory',
            'ContainerPort',
            'DatabaseHost',
            'DatabaseName',
            'DatabasePassword',
            'DatabaseUser',
            'DesiredCount',
            'HttpCode',
            'HTTPSListener',
            'Path',
            'Priority',
            'Role',
            'TaskRole',
            'ServiceName',
            'StackName',
            'DataDogAPIKey',
            'TaskCpu',
            'TaskMemory'
          ],
          timeoutInMinutes:15,
          pollInterval:1000)
      }
    }
  }
}

stage('Update PROD ECS') {
  when {
    branch 'master'
    tag 'v*'
  }
  steps {
    script{
      withAWS(region:'us-east-1') {
        def outputs = cfnUpdate(stack: 'PROD-TARGETDB-SERVICE',
          params:["ImageUrl=${env.FULL_ECR_URL}"],
          keepParams:[
            'EnvVarName1',
            'EnvVarValue1',
            'EnvVarName2',
            'EnvVarValue2',
            'EnvVarName3',
            'EnvVarValue3',
            'ContainerCpu',
            'ContainerMemory',
            'ContainerPort',
            'DatabaseHost',
            'DatabaseName',
            'DatabasePassword',
            'DatabaseUser',
            'DesiredCount',
            'HttpCode',
            'HTTPSListener',
            'Path',
            'Priority',
            'Role',
            'TaskRole',
            'ServiceName',
            'StackName',
            'DataDogAPIKey',
            'TaskCpu',
            'TaskMemory'
          ],
          timeoutInMinutes:15,
          pollInterval:1000)
      }
    }
  }
}
  

Этапы разработки и разработки работают, но этап разработки не работает. Я даже не вижу работы в дженкинсе для стадии разработки (я делаю для разработчиков и мастеров). В проекте jenkins есть раздел «теги», но он пуст.

Комментарии:

1. Если вы используете многоотраслевой конвейер, добавили ли вы «Обнаружение тегов» в раздел «Поведение» конфигурации источников ветки?

Ответ №1:

Когда вы извлекаете репозиторий Git, вы выполняете проверку либо по ветке, либо по тегу, но не по обоим. Когда Дженкинс проверяет ветку, он устанавливает переменную BRANCH_NAME на имя извлеченной ветки; когда он проверяет тег, он устанавливает TAG_NAME и BRANCH_NAME на имя тега.

В документации говорится:

Если директива when содержит более одного условия, все дочерние условия должны возвращать true для выполнения этапа.

Условие тега соответствует TAG_NAME, а условие перехода соответствует BRANCH_NAME, поэтому они оба должны быть истинными для выполнения stage. Поскольку они совпадают в случае проверки тега, эта настройка условия всегда ложна.

Решение зависит от того, чего вы хотите достичь. Если вы хотите выполнить этап, если какой-либо из них имеет значение true, условие должно гласить:

 when {
    anyOf {
        branch 'master'
        tag 'v*'
    }
}
  

Если вы просто хотите работать с тегами v *, я бы просто полностью отбросил условие ветки.