13

我想在构建成功/失败时发送电子邮件以及一些有用的 Git 信息,例如提交 SHA、先前成功的 SHA、提交消息等。我能够以旧的 UI 方式执行此操作,但现在我已经创建了声明性管道和现在我正在GIT_BRANCH is not supported in this context收到收到的电子邮件。我正在使用 Jenkins 版本。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 作业中重复使用这个脚本,所以我想避免添加手动 UI 工作来传递参数和东西。

我尝试在之前声明环境,stages但无法从以下上下文中使用它emailext

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

任何帮助表示赞赏。提前致谢。

4

3 回答 3

10

JENKINS-26100建议

node {
    withCheckout(scm) {
         echo "GIT_COMMIT is ${env.GIT_COMMIT}"
    }
}
于 2018-03-13T08:32:47.877 回答
1

另一种方法是使用命令替换,这对我们有用:

post {
        success {
        sh  '''    
            echo "Commit $(git rev-parse HEAD)" | mail -s "Deployment completed successfully" ADDRESS@EMAIL.COM
            '''                  
        }
    }
于 2019-08-16T09:20:47.843 回答
0

您可以通过以下方式执行此操作——尽管这可能不适用于声明性管道,但也许它会给你一些东西——从多分支管道设置......</p>

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 的最新提交

于 2018-07-31T18:07:55.863 回答