Выполнять шаг Jenkins Pipeline только при создании тега

У меня есть определенная логика сборки, такая как публикация, которую я бы хотел, чтобы Jenkins выполнял только тогда, когда она собирает тег Git. Как я могу сделать это, используя декларативный конвейер Jenkin?

Другими словами, я пытаюсь создать функциональность, эквивалентную функциональности развертывания Travis CI по тегам:

deploy:
  [...]
  on: 
    tags: true

Существует встроенное условие для проверки ветки, но я не вижу такой, которая указывает тег.

3 ответа

Решение

Обновление: Начиная с версии 1.2.8 плагина определения модели конвейера, теперь вы можете использовать buldingTag():

stage('Deploy') {
  when {
    buildingTag()
  }
  steps {
    echo 'Replace this with your actual deployment steps'
  }
}

При использовании конфигурации Multibranch Pipeline вы можете использовать expression состояние наряду с TAG_NAME переменная окружения, предоставляемая базовым плагином API филиала. К сожалению, вы не можете напрямую проверить, определена ли переменная среды на уровне Groovy (ограничения API), поэтому вам нужно проверить ее в оболочке:

stage('Deploy') {
  when { expression { sh([returnStdout: true, script: 'echo $TAG_NAME | tr -d \'\n\'']) } }
  steps {
    echo 'Replace this with your actual deployment steps'
  }
}

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

Более простой способ может быть представлен в будущих версиях. Смотрите плагин jenkinsci / pipe-модель-определения-плагин # 240.

Декларативные конвейеры

Выполнять ЭТАП только при построении для тега

На протяжении всего этапа @vossad01 уже предоставил ответ на использование buildingTag() в пределах when нравиться

      stage('Deploy') {
  when {
    buildingTag()
    beforeAgent true
  }
  steps {
    echo 'deploy something when triggered by tag
  }
}

в beforeAgent true не является обязательным и обеспечивает проверку условия перед выполнением на агенте.

Выполнять ШАГ только при построении для тега

Если это всего лишь шаг внутри стадии, который должен быть обусловлен тегом, вы можете использовать синтаксис Groovy (используемый в сценариях конвейеров) внутри script блок следующим образом.

      stage('myStage') {                                              
  steps {                                                       
    echo 'some steps here that should always be executed'
    script {                                                    
      if (env.TAG_NAME) {                                       
        echo "triggered by the TAG:"                                 
        echo env.TAG_NAME                                       
      } else {                                                  
        echo "triggered by branch, PR or ..."                              
      }                                                         
    }                                                           
  }                                                             
}

Дополнительная подсказка для создания тегов

Возможно, вас также заинтересует плагин basic-branch-build-Strategies, который позволяет запускать сборки при нажатии тегов (который по умолчанию не включен). Смотрите здесь, как его использовать. Вы можете установить его через Manage Jenkins -> Manage Plugins -> Available tab а затем используйте панель поиска.

У меня была похожая ситуация, с которой я справился, получив название ветви, в случае тега это похоже на refs/tags/v101.0.0-beta8468, так что вы должны извлечь / проанализировать это, чтобы проверить, если это тег, в противном случае это просто имя ветви, как pipeline, например.

if(env.gitlabBranch.contains("tags"))
    {
        isTag = true
        echo "----------------true----------------"
        branch = env.gitlabBranch.split("/")[2]
        imageTag = branch

    }
    else
    {
        branch = "origin/$env.gitlabBranch"

    }

И в шаге chekout упомянуть ветку как

 branches: [[name: "${branch}"]

если вы хотите оформить заказ из того же проекта. На основе переменной isTag вы можете выбрать запуск определенной стадии. Подобно:

if(isTag) {
stage('Deploy') {
   // your logic here
}

инициализируйте ваш isTag как ложный:)

Другие вопросы по тегам