如何在Jenkins上从SVN进行稀疏签出和更新?

时间:2019-05-06 08:39:10

标签: jenkins svn jenkins-pipeline sparse-checkout

我们有一个庞大的SVN存储库,我想对Jenkins进行稀疏签出。我确实了解稀疏结帐的概念,并在本地拥有它,我可以按照自己的意愿使事情正常进行。但是,在Jenkins上执行操作并反复运行,我无法上班。

我的回购结构如下

trunk\file.txt
trunk\FolderA
trunk\FolderB
trunk\FolderC
trunk\FolderD

我想签出并更新

trunk\file.txt
trunk\FolderA
trunk\FolderB

trunk\FolderC
trunk\FolderD

我的管道代码如下

checkout([$class: 'SubversionSCM', 
    additionalCredentials: [[credentialsId: strCredentialsId, realm: strRealm]],
    excludedCommitMessages: '', 
    excludedRegions: '', 
    excludedRevprop: '', 
    excludedUsers: '', filterChangelog: false, 
    ignoreDirPropChanges: false, 
    includedRegions: '', 
    locations: [
        [
            remote: "${strRepoPath}/trunk",
            local: "${softwarePath}", 
            depthOption: 'unknown', 
            credentialsId: strCredentialsId,
            cancelProcessOnExternalsFail: true, 
            ignoreExternalsOption: false
        ],
        [
            remote: "${strRepoPath}/trunk/FolderA",
            local: "${softwarePath}/FolderA", 
            depthOption: 'infinity', 
            credentialsId: strCredentialsId, 
            cancelProcessOnExternalsFail: true, 
            ignoreExternalsOption: false
        ],
        [
            remote: "${strRepoPath}/trunk/FolderB",
            local: "${softwarePath}/FolderB", 
            depthOption: 'infinity', 
            credentialsId: strCredentialsId, 
            cancelProcessOnExternalsFail: true, 
            ignoreExternalsOption: false
        ]
    ],
    quietOperation: false, 
    workspaceUpdater: [$class: 'UpdateWithCleanUpdater']])

每当我第一次运行此代码时,一切都会按预期进行。但是,当詹金斯(Jenkins)在以下时间运行它时, UpdateWithCleanUpdater 导致先删除FolderA和FolderB,然后再次检出。结果仍然是正确的,但是,我需要花费更长的时间,而且比必要的时间更长。

我想保留 UpdateWithCleanUpdater ,因为我希望Jenkins清除上一次运行中生成的文件。

使用Jenkins SVN插件对此有什么解决方案吗?我将如何“手动”执行此操作,即第一次结帐,清理并仅更新以下时间,并且仍然会基于SVN存储库上的更改检测来自动运行Jenkins?

谢谢!

2 个答案:

答案 0 :(得分:1)

trunk 上:

depthOption: 'unknown',

值不应该是'empty'吗?

然而,虽然这可能会避免“FolderA 和 FolderB 被首先删除然后再次签出”,所以我怀疑您是否真的会以这种方式获得“稀疏签出”。这将是“正常结帐到另一个 SVN 工作区”。

作为一种解决方法,您可以考虑使用 svn:externals:创建一个文件夹 trunk/JenkinsWorkspace/trunk,并使用如下内容设置 svn:externals 属性:

 ^/trunk/FolderA FolderA
 ^/trunk/FolderB FolderB
 ^/trunk/file.txt file.txt

然后,在 Jenkins 中,您只需从 ${strRepoPath}/JenkinsWorkspace 进行一次结帐。

答案 1 :(得分:0)

现在是一个非常狭窄的问题。 我会说,要么用手动脚本替换 UpdateWithCleanUpdater (通过调用本地svn客户端;一些示例here);或者您可以为Jenkins SVN plugin分叉或贡献力量。