Как выполнить разреженную проверку и обновление из SVN на Jenkins?

У нас есть большой репозиторий SVN, и я хотел бы немного проверить 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']])

Каждый раз, когда я запускаю этот код в первый раз, все выглядит так, как ожидалось. Однако, когда Дженкинс запускает его в следующие разы, UpdateWithCleanUpdater вызывает то, что FolderA и FolderB сначала удаляются, а затем снова извлекаются. Результат по-прежнему правильный, однако на это уходит гораздо больше времени, чем хотелось бы, и больше, чем необходимо.

Я хотел бы сохранить UpdateWithCleanUpdater, потому что хочу, чтобы Дженкинс очищал файлы, созданные при предыдущем запуске.

Есть ли какое-нибудь решение этой проблемы с использованием плагина Jenkins SVN? Как мне сделать это «вручную», т.е. выполнить проверку в первый раз, очистить и обновить только в следующие раз, и по-прежнему выполнять автоматические запуски Jenkins на основе обнаружения изменений в репозитории SVN?

Заранее спасибо!


person nogenius    schedule 06.05.2019    source источник


Ответы (2)


Это - очень узкая проблема. Я бы сказал, либо вы замените UpdateWithCleanUpdater ручным сценарием (путем вызова локального клиента svn; некоторые примеры здесь); или вы можете создать ответвление или внести свой вклад в подключаемый модуль SVN Jenkins.

person Saucistophe    schedule 06.05.2019
comment
Это может сработать, но кажется очень неудобным, потому что каждый файл / папка нужно обрабатывать отдельно. FolderA и FolderB считаются неверсированными при просмотре корневого каталога trunk /. svn info показывает ? для этих папок - person nogenius; 06.05.2019
comment
Если отображается svn info?, возможно, вы оказались в ситуации, когда в моем ответе я вызвал обычную проверку в другом рабочем пространстве SVN. Команды для выполнения разреженной проверки выглядят так: svn checkout --depth empty https://yourRepo workspace ; svn update --set-depth empty workspace/trunk ; svn update workspace/trunk/FolderA workspace/trunk/file.txt workspace/trunk/FolderB - person David L.; 08.03.2021

На 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.

person David L.    schedule 08.03.2021