Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scm签出之前的Jenkins Pipeline Git提交消息_Git_Jenkins_Jenkins Pipeline - Fatal编程技术网

scm签出之前的Jenkins Pipeline Git提交消息

scm签出之前的Jenkins Pipeline Git提交消息,git,jenkins,jenkins-pipeline,Git,Jenkins,Jenkins Pipeline,我希望能够在实际的签出scm之前访问Jenkins管道中的提交消息,因为我有巨大的存储库(>2GB)和许多分支(>200),并且对于每个分支,完整的repo都会再次被克隆,我希望通过过滤提交消息以获得明确的“标记”(例如[ci]),来限制克隆数量)。如果你知道一种不同的方法可以解决我的问题,请告诉我 编辑:我正在使用脚本化文件和带有多分支管道的共享库。。因此,我正在寻找一种以编程方式实现这一点的方法:)您可以使用预scm buildstep插件 此插件允许在SCM签出之前运行构建步骤,以便 在

我希望能够在实际的
签出scm
之前访问Jenkins管道中的提交消息,因为我有巨大的存储库(>2GB)和许多分支(>200),并且对于每个分支,完整的repo都会再次被克隆,我希望通过过滤提交消息以获得明确的“标记”(例如
[ci]),来限制克隆数量
)。如果你知道一种不同的方法可以解决我的问题,请告诉我


编辑:我正在使用脚本化文件和带有多分支管道的共享库。。因此,我正在寻找一种以编程方式实现这一点的方法:)

您可以使用预scm buildstep插件

此插件允许在SCM签出之前运行构建步骤,以便 在工作区上执行任何构建步骤操作,(清理,添加 使用SCM的某些设置等)或调用 需要在从SCM签出之前运行


因此,基本上,您可以在SCM签出/克隆开始之前执行任何命令。

您可以使用预SCM buildstep插件

此插件允许在SCM签出之前运行构建步骤,以便 在工作区上执行任何构建步骤操作,(清理,添加 使用SCM的某些设置等)或调用 需要在从SCM签出之前运行


因此,基本上,您可以在SCM签出/克隆启动之前执行任何命令。

因为我没有看到任何其他方法,所以我执行了以下操作:

#!/usr/bin/env groovy

def getCommitMsg(branch, path_parent, path_mirror, url) {
    if (!(fileExists(path_mirror))) {
        echo "Directory $path_mirror doesn't exist, creating.."
        dir (path_parent) {
            bat("git clone --mirror $url mirror")
        }
    }
    dir (path_mirror) {
        bat("git fetch origin $branch:$branch")
        bat("git symbolic-ref HEAD refs/heads/$branch")
        return bat(script: "@git log -n 1 --pretty=format:'%%s'",
            returnStdout: true).trim().replaceAll("'","")
    }
}

def updateRepo(branch, path_parent, path_clone, url) {
    if (!(fileExists(path_clone))) {
        echo "Directory $path_clone doesn't exist, creating.."
        dir (path_parent) {
            bat("git clone --recurse-submodules $url clone")
        }
    }
    dir (path_clone) {
        bat("git pull")
    }
    dir (path_parent) {
        bat(script: "robocopy /MIR /NFL /NDL /NC /NS /NP " +
            path_clone + " " + path_parent + "\\" + branch.replaceAll("/","_"),
            returnStatus: true)
    }
}

node("some_label") {

    ws("workspace/${env.JOB_NAME}".replaceAll("%2F","_")) {

        def default_test = ["develop", "release", "feature/test"]
        def branch = env.BRANCH_NAME
        def path_current = bat(script: 'echo %CD%',
            returnStdout: true).split("\n")[2]        
        def path_parent = path_current.split("\\\\").dropRight(1).join("\\")
        def path_mirror = path_parent + "\\mirror"
        def path_clone = path_parent + "\\clone"
        def url = scm.userRemoteConfigs[0].url
        def commit = getCommitMsg(branch, path_parent, path_mirror, url)

        if (!(default_test.contains(branch)
            || commit.contains("[ci]"))) {
            echo "Branch should not be tested by default and commit message contains no [ci]-tag, aborting.."
            currentBuild.result = "FAILURE"
            return
        }

        stage("Checkout") {
            updateRepo(branch, path_parent, path_clone, url)
            checkout scm
        }

        stage("Build") {
            some stuff here
            }
        }

    }

}
这将在镜像repo中解析提交消息,还将减少bitbucket服务器上的带宽,因为每个代理上只克隆一次repo,然后将其复制到每个分支的其他目录。这对我来说是最有用的方法。如果您有问题,请告诉我:)

编辑:我现在正在解析Bitbucket REST API,代码如下所示:

// get commit hash
withCredentials([sshUserPrivateKey(credentialsId: 'SSH',
    keyFileVariable: 'SSHKEYFILE')]) {
    String commitHash = sh(script: """
        ssh-agent bash -c 'ssh-add ${env.SSHKEYFILE}; \
        git ls-remote ${url} refs/heads/${branch}'""",
        returnStdout: true).trim().split('\\s+')[0]

    echo("commitHash: ${commitHash}")
}

// create the curl url like this
String curlUrl = BBUrl + '/rest/api/1.0/projects/' + project + '/repos/' + repo + '/commits/' + commitHash

String commitMessage = null
withCredentials([usernameColonPassword(credentialsId: 'USERPASS',
    variable: 'USER_PASS')]) {

    String pwBase64 = "${env.USER_PASS}".bytes.encodeBase64().toString()
    String rawResponse = sh(script: """
        curl --request GET --url '${curlUrl}' \
        --header 'Authorization: Basic ${pwBase64}'""",
        returnStdout: true).trim()

    def rawMessage = readJSON(text: rawResponse)
    commitMessage = rawMessage.message
    echo("commitMessage: ${commitMessage}")
}

只需在安装了curl的Jenkins master上执行此操作,希望能有所帮助。

因为我没有看到任何其他方法,所以我执行了以下操作:

#!/usr/bin/env groovy

def getCommitMsg(branch, path_parent, path_mirror, url) {
    if (!(fileExists(path_mirror))) {
        echo "Directory $path_mirror doesn't exist, creating.."
        dir (path_parent) {
            bat("git clone --mirror $url mirror")
        }
    }
    dir (path_mirror) {
        bat("git fetch origin $branch:$branch")
        bat("git symbolic-ref HEAD refs/heads/$branch")
        return bat(script: "@git log -n 1 --pretty=format:'%%s'",
            returnStdout: true).trim().replaceAll("'","")
    }
}

def updateRepo(branch, path_parent, path_clone, url) {
    if (!(fileExists(path_clone))) {
        echo "Directory $path_clone doesn't exist, creating.."
        dir (path_parent) {
            bat("git clone --recurse-submodules $url clone")
        }
    }
    dir (path_clone) {
        bat("git pull")
    }
    dir (path_parent) {
        bat(script: "robocopy /MIR /NFL /NDL /NC /NS /NP " +
            path_clone + " " + path_parent + "\\" + branch.replaceAll("/","_"),
            returnStatus: true)
    }
}

node("some_label") {

    ws("workspace/${env.JOB_NAME}".replaceAll("%2F","_")) {

        def default_test = ["develop", "release", "feature/test"]
        def branch = env.BRANCH_NAME
        def path_current = bat(script: 'echo %CD%',
            returnStdout: true).split("\n")[2]        
        def path_parent = path_current.split("\\\\").dropRight(1).join("\\")
        def path_mirror = path_parent + "\\mirror"
        def path_clone = path_parent + "\\clone"
        def url = scm.userRemoteConfigs[0].url
        def commit = getCommitMsg(branch, path_parent, path_mirror, url)

        if (!(default_test.contains(branch)
            || commit.contains("[ci]"))) {
            echo "Branch should not be tested by default and commit message contains no [ci]-tag, aborting.."
            currentBuild.result = "FAILURE"
            return
        }

        stage("Checkout") {
            updateRepo(branch, path_parent, path_clone, url)
            checkout scm
        }

        stage("Build") {
            some stuff here
            }
        }

    }

}
这将在镜像repo中解析提交消息,还将减少bitbucket服务器上的带宽,因为每个代理上只克隆一次repo,然后将其复制到每个分支的其他目录。这对我来说是最有用的方法。如果您有问题,请告诉我:)

编辑:我现在正在解析Bitbucket REST API,代码如下所示:

// get commit hash
withCredentials([sshUserPrivateKey(credentialsId: 'SSH',
    keyFileVariable: 'SSHKEYFILE')]) {
    String commitHash = sh(script: """
        ssh-agent bash -c 'ssh-add ${env.SSHKEYFILE}; \
        git ls-remote ${url} refs/heads/${branch}'""",
        returnStdout: true).trim().split('\\s+')[0]

    echo("commitHash: ${commitHash}")
}

// create the curl url like this
String curlUrl = BBUrl + '/rest/api/1.0/projects/' + project + '/repos/' + repo + '/commits/' + commitHash

String commitMessage = null
withCredentials([usernameColonPassword(credentialsId: 'USERPASS',
    variable: 'USER_PASS')]) {

    String pwBase64 = "${env.USER_PASS}".bytes.encodeBase64().toString()
    String rawResponse = sh(script: """
        curl --request GET --url '${curlUrl}' \
        --header 'Authorization: Basic ${pwBase64}'""",
        returnStdout: true).trim()

    def rawMessage = readJSON(text: rawResponse)
    commitMessage = rawMessage.message
    echo("commitMessage: ${commitMessage}")
}

只需在安装了curl的Jenkins master上执行此操作,希望能有所帮助。

我应该提到,我正在使用脚本化的Jenkins文件和带有多分支管道的共享库。。因此,我正在寻找一种以编程方式实现这一点的方法:)在
scm签出之前,我是否有权访问提交消息?
?是的,因为repo不是克隆的,所以使用GitHub API可以通过以下方式实现:curl--user:“它将传递需要解析的json o/p。我还没有检查GitLab/BitBucket API。对于SVN,它相当简单,SVN日志正常,但我需要手动与bitbucket rest api(curl)交互,并且没有可以使用的预定义步骤?我应该提到,我正在使用脚本化的Jenkins文件和带有多分支管道的共享库。。因此,我正在寻找一种以编程方式实现这一点的方法:)在
scm签出之前,我是否有权访问提交消息?
?是的,因为repo不是克隆的,所以使用GitHub API可以通过以下方式实现:curl--user:“它将传递需要解析的json o/p。我还没有检查GitLab/BitBucket API。对于SVN,它相当简单,SVN日志可以,但我需要手动与bitbucket rest api(curl)交互,并且没有可以使用的预定义步骤?