Как получить доступ к $ GIT_COMMIT в пост-фазе декларативного конвейера Jenkins и электронной почте?

Я хочу отправлять электронное письмо, когда сборка завершается успешно/не удается, вместе с некоторой полезной информацией Git, такой как SHA фиксации, предыдущий успешный SHA, сообщение фиксации и т. д. Я смог сделать это в старом пользовательском интерфейсе, но теперь я создал декларативный конвейер и теперь я получаю GIT_BRANCH is not supported in this context в полученном электронном письме. Я использую Дженкинс вер. 2.89.3. Мой сценарий:

pipeline {
    agent { 
        ...
    }
    stages {
        stage('Checkout') {
            steps {
                sh 'printenv'
                checkout scm: [$class: 'GitSCM', branches: [[[name: '*/development']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [url: 'https://github.com/myrepo/']]]
                sh 'git submodule foreach --recursive \'git submodule sync\''
                sh 'git submodule update --init --recursive'
            }
        }
        stage('Build') {
            steps {
               ...         
            }
        }
    }
    post {
        success {
            sh 'printenv'
            emailext body: '$PROJECT_DEFAULT_CONTENT Commit message: ${FILE, path="commit_message.txt"}\nThis commit: ${GIT_COMMIT}Build URL: ${BUILD_URL}',
            recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'CulpritsRecipientProvider'], [$class: 'RequesterRecipientProvider']],
            subject: 'Some subject'
        }
    }
}

printenv напечатает все, что я ожидаю, включая GIT_COMMIT как на этапе «Оформить заказ», так и после успешного завершения. Поскольку я буду повторно использовать этот сценарий для более чем 10 заданий Jenkins, я хочу избежать добавления ручной работы с пользовательским интерфейсом для передачи параметров и прочего.

Я попытался объявить среду до stages, но не смог использовать ее из контекста emailext:

agent {
    ...
}
environment {
    MY_GIT_COMMIT = "${GIT_COMMIT}"
}
stages {
    ...
}

Любая помощь приветствуется. Заранее спасибо.


person Genki    schedule 13.03.2018    source источник


Ответы (3)


JENKINS-26100 предлагает

node {
    withCheckout(scm) {
         echo "GIT_COMMIT is ${env.GIT_COMMIT}"
    }
}
person David van Laatum    schedule 13.03.2018
comment
Спасибо за ответ. Я хочу указать, какую ветку я хочу построить из скрипта конвейера, могу ли я сделать это с этой настройкой? Обновил мой вопрос, чтобы отразить это. Или есть хороший способ определить, какие ветки создавать в одном месте, чтобы мне не приходилось обновлять более 10 заданий? - person Genki; 13.03.2018
comment
Лично я использую конвейер с несколькими ветвями для создания всех ветвей. Но вы можете добавить параметр задания для имени ветки. не знаю, как это сделать навскидку, но примеров должно быть много - person David van Laatum; 14.03.2018
comment
Да, у меня есть параметризованные переменные, которые я использую для других целей, но это не масштабируется. Может быть, я смогу построить любую ветку, как вы сказали. - person Genki; 14.03.2018
comment
как вы получаете короткую форму этого? - person Moses Liao GZ; 15.05.2020

Другой способ сделать это - подстановка команд, это работает для нас:

post {
        success {
        sh  '''    
            echo "Commit $(git rev-parse HEAD)" | mail -s "Deployment completed successfully" [email protected]
            '''                  
        }
    }
person Mario Jacobo    schedule 16.08.2019

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

node("my-node") {

    withCredentials([string(credentialsId: 'my-credential-id', variable: 'MY_CREDENTIAL')]) {

    def commitHash = checkout(scm).GIT_COMMIT

    stage ("stage 1") {
        // …
    }

}

или внутри сцены (мне так удобнее),

node("my-node") {
    def scmVars

    stage("stage-1") {
        scmVars = git branch: env.BRANCH_NAME, credentialsId: 'my-git-credentials', url: 'https://myrepo.git'

        commitHash = scmVars.GIT_COMMIT
    }
}

Я предпочитаю это на этапе, потому что checkout(scm).GIT_COMMIT получит коммит слияния целевой ветки, а не последний коммит из PR.

person Rahman Malik    schedule 31.07.2018
comment
Спасибо за указание на разницу GIT_COMMIT между checkout scm и веткой git: .... - person heatherz; 15.11.2018