Jenkins共享库获取版本

Jenkins共享库获取版本,jenkins,jenkins-pipeline,shared-libraries,Jenkins,Jenkins Pipeline,Shared Libraries,我已经在Jenkins文件中加载了带有@library('libName')注释的共享库。如何获取(管道代码中)已加载哪个版本的知识?如何区分库是否已通过以下方式加载: @Library('libName'),@Library('libName')libName@master)或@Library('libName@superBranch)? 你好,Dawid。你可以做下面类似的事情 @Library('MyLibrary@test') _ node('master') { dir( "

我已经在Jenkins文件中加载了带有
@library('libName')
注释的共享库。如何获取(管道代码中)已加载哪个版本的知识?如何区分库是否已通过以下方式加载:
@Library('libName')
@Library('libName')libName@master)
@Library('libName@superBranch)

你好,Dawid。

你可以做下面类似的事情

@Library('MyLibrary@test') _
node('master') {

    dir( "${WORKSPACE}@libs/MyLibrary") {
        //This is the path library.
        //Run any command to get branch name
    }
}
要点:如果您同时运行此作业,库目录名称将如下所示MyLibrary@2取决于内部版本号


希望这有帮助

所以这并不容易,但我的项目就是这样做的。我们使用git标记,但本质上是相同的概念。然而,因为我们使用约定,我们可以区分。(Jenkins共享签出先将“whatever”作为分支签出,然后作为标记修订签出)

这是秘密的东西,所以不能保证它在詹金斯开发期间会保持不变

如果包装器函数已锁定到某个版本,则它本质上返回true/false。只要它的v.x.x.x,我们就返回它。如果它不是默认分支,您可能会返回它(无论您在jenkins中设置了什么)

/**
*用于检查加载的jenkins共享库是否指向git分支或标记的包装器
*
*@返回布尔值
*/
布尔值isLockedSharedLibraryRevision(){
列表操作=$build().getActions(BuildData.class)
返回CheckSharedLibrary分支(操作)
}
/**
*检查共享库是否锁定到特定的git标记(提交哈希)
*如果在特定版本(Git标记)上运行,则返回True
*如果在分支头上运行,则返回False(默认情况下开发)
*
*假设Git标记遵循vx.x.x格式(例如v1.0.22)
*
*@param actions(与BuildData.class匹配的jenkins操作列表)
*@返回布尔值
*/
布尔checkSharedLibrary分支(列表操作){
布尔值isLockedSharedLibraryRevision=false
布尔jenkinsSharedFound=false
if(actions==null | | actions.size()==0){
抛出新的IllegalArgumentException(“必须提供构建操作”)
}
//检查返回的每个BuildData操作是否包含jenkins共享修订
actions.each{action->
HashSet remoteURLs=action.getRemoteUrls()
remoteURLs.each{url->
if(url.contains(“”)){
jenkinsSharedFound=true
模式版本regex=~/^v\d+\.\d+\.\d+$/
/**
*找到jenkins shared后,评估修订分支/标记名称。
*getLastBuiltRevision()返回当前版本。这是经过功能测试的。
*如果较新的生成在当前作业之前运行并完成,则该值不会更改。
*即,建造303开始并正在进行中,建造304开始并完成。
*Build 303调用getLastBuiltRevision(),该函数返回作业303(不是304)
*/
修订版本=操作。getLastBuiltRevision()
/**
*这始终是1的集合,即使git中存在针对同一sha1的多个标记
*它始终是您查看的标签/分支,不报告任何额外信息。。。
*尽管如此,我们还是希望安全
*/
集合分支=revision.getBranchs()
branchs.each{branch->
字符串名称=branch.getName()
如果(名称==~versionRegex){
println“信息:Jenkins共享锁定到版本${name}”
isLockedSharedLibraryRevision=true
}
}
}
}
}
如果(!jenkinsSharedFound){
抛出新的IllegalArgumentException(“任何相关的生成操作都没有指向Jenkins Shared的remoteURL,正在中止”)
}
println“信息:isLockedSharedLibraryRevision==${isLockedSharedLibraryRevision}”
返回isLockedSharedLibraryRevision
}
    /**
     * Wrapper for checking if loaded jenkins shared libs are pointing to a git branch or tag
     *
     * @return Boolean
     */
    Boolean isLockedSharedLibraryRevision() {
        List<Action> actions = $build().getActions(BuildData.class)

        return checkSharedLibraryBranches(actions)
    }

    /**
     * Check if shared libraries are locked to specific git tag (commit hash)
     * Return True if running on a particular revision (Git Tag)
     * Return False if running on HEAD of a branch (develop by default)
     *
     * Assumption is that Git Tag follows format vx.x.x (e.g. v1.0.22)
     *
     * @param actions (List of jenkins actions thatmatch BuildData.class)
     * @return Boolean
     */
    Boolean checkSharedLibraryBranches(List<Action> actions) {
        Boolean isLockedSharedLibraryRevision = false
        Boolean jenkinsSharedFound = false
        if (actions == null || actions.size() == 0) {
            throw new IllegalArgumentException("Build actions must be provided")
        }
        // Check each BuildData Action returned for one containing the jenkins-shared revisions
        actions.each { action ->
            HashSet remoteURLs = action.getRemoteUrls()
            remoteURLs.each { url ->
                if ( url.contains('<insert-your-repo-name>') ) {
                    jenkinsSharedFound = true
                    Pattern versionRegex = ~/^v\d+\.\d+\.\d+$/
                    /**
                     * When jenkins-shared is found evaluate revision branch/tag name.
                     * getLastBuiltRevision() returns the current executions build. This was functionally tested.
                     * If a newer build runs and completes before the current job, the value is not changed.
                     * i.e. Build 303 starts and is in progress, build 304 starts and finishes.
                     * Build 303 calls getLastBuiltRevision() which returns job 303 (not 304)
                     */
                    Revision revision = action.getLastBuiltRevision()
                    /**
                     * This is always a collection of 1, even when multiple tags exist against the same sha1 in git
                     * It is always the tag/branch your looking at and doesn't report any extras...
                     * Despite this we loop to be safe
                     */
                    Collection<Branch> branches = revision.getBranches()
                    branches.each { branch ->
                        String name = branch.getName()
                        if (name ==~ versionRegex) {
                            println "INFO: Jenkins-shared locked to version ${name}"
                            isLockedSharedLibraryRevision = true
                        }
                    }
                }
            }
        }

        if (!jenkinsSharedFound) {
                throw new IllegalArgumentException("None of the related build actions have a remoteURL pointing to Jenkins Shared, aborting")
        }

        println "INFO: isLockedSharedLibraryRevision == ${isLockedSharedLibraryRevision}"
        return isLockedSharedLibraryRevision
    }