Периодическая сборка Jenkins Pipelines не отправляет уведомление по электронной почте из-за пустого списка получателей

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

Мы используем emailext плагин для отправки этих писем и агенты Kubernetes в качестве узлов.

Задание запускается по таймеру, потому что это периодическая сборка, заставляющая его запускать следующую конфигурацию конвейера (вы можете игнорировать определение контейнера агента, поскольку оно не имеет значения, IMO):

pipeline {
  agent {
    kubernetes {
      yaml """
metadata:
  labels:
    some-label: some-label-value
spec:
  containers:
    - name: agent
      image: python:3.7
      command:
        - cat
      tty: true
"""
    }
  }
  options {
    timestamps()
  }
  stages {
    stage('SCM') {
      steps {
        checkout(
          changelog: false,
          poll: false,
          scm: [$class                           : 'GitSCM',
                userRemoteConfigs                : [[credentialsId: 'Git SSH Key', url: '[email protected]:company/repository.git']]],
                branches                         : [[name: 'master']],
                doGenerateSubmoduleConfigurations: false,
                extensions                       : [[$class   : 'CloneOption',
                                                     depth    : 1,
                                                     noTags   : false,
                                                     reference: '',
                                                     shallow  : true],
                                                    [$class: 'PruneStaleBranch'],
                                                    [$class: 'GitLFSPull'],
                                                    [$class             : 'SubmoduleOption',
                                                     disableSubmodules  : false,
                                                     parentCredentials  : true,
                                                     recursiveSubmodules: true,
                                                     reference          : '',
                                                     trackingSubmodules : false]],
                submoduleCfg                     : []
        )
      }
    }
    stage('Build') {
      steps {
        container('agent') {
          echo '-> install tox'
          sh 'pip install tox'

          sh 'python --version'
          sh 'pip --version'
        }
      }
    }
    stage('Test') {
      steps {
        container('agent') {
          sh 'tox -c ./tox.ini'
        }
        post {
          always {
            echo '-> collecting artifacts'
            archiveArtifacts allowEmptyArchive: true, artifacts: '*.txt'

            echo '-> collecting test results'
            junit allowEmptyResults: true, testResults: 'output/pytest.xml'
          }
        }
      }
    }
  }
  post {
    changed {
      emailext(
        subject: '$DEFAULT_SUBJECT',
        body: '$DEFAULT_CONTENT',
        recipientProviders: [culprits(),
                             developers(),
                             requestor(),
                             brokenBuildSuspects(),
                             brokenTestsSuspects(),
                             upstreamDevelopers()]
      )
    }
  }
}

Вышеупомянутое работает, когда есть ручной запуск задания (начинающий разработчик получает соответствующее электронное письмо), однако, когда задание запускается из периодической сборки (cron) - список получателей всегда пуст:

Попытка отправить электронное письмо пустому списку получателей игнорируется.

В чем может быть проблема?


person Dror Weiss    schedule 26.12.2019    source источник


Ответы (2)


Очевидно, что все провайдеры-получатели возвращают пустой список.

  • requestor() возвращает пустой список, потому что нет запросчика
  • upstreamDevelopers() возвращает пустой список, потому что нет основной сборки

Проверьте исходный код, чтобы выяснить, почему culprits(), developers(), brokenBuildSuspects() и brokenTestsSuspects() возвращают пустой список.

person Yuri G.    schedule 27.12.2019

Другой способ — получить коммиттеры с помощью git:

// Get all commits from the latest merge in an array 
def gitCommits = sh(returnStdout: true, script: 'git log --merges -1 --format=%p').trim().split(' ')

// Get committer emails:
def emails = ""
gitCommits.each {
 emails = emails + sh(returnStdout: true, script: 'git --no-pager show -s --format=%ae ${it}').trim() + ","
}
echo "${emails}"
person Volkan Kumbasar    schedule 27.12.2019