Обнаружить, что ветка git касается только определенных путей - PullRequest
2 голосов
/ 04 октября 2019

Фон

В моем проекте запросы на извлечение битбакета проверяются сборками Jenkins. Сборка и тестирование занимает около 50 минут. Это работает очень хорошо.

Проблема

Есть некоторые изменения, которые не влияют на рабочий код (связанный с интерфейсом). Таким образом, если запрос на удаление затрагивает только один из двух подкаталогов, нет смысла создавать и запускать тесты. Цель состоит в том, чтобы сэкономить время (меньше времени для выпуска незначительных безвредных изменений) и ресурсы (не занимать сборочную машину для бесполезных заданий).

Я не хочу разбивать проект (одно из возможных решений), так какдовольно часто изменения во внешнем интерфейсе требуют изменений в реальном внутреннем коде, поэтому в таком случае требуется тестирование.

Возможное решение

Я нашел способ остановить сборку Jenkins с успехом наПервый шаг, который выбирает новый код.

Проблема в том, как спросить git, затрагивает ли ветвь (изменение) только две подкаталоги. Вероятно, для этого потребуется что-то вроде этого:

git diff master...featureBranch  <some other options> 

Возможные альтернативы

Или, может быть, есть другие способы решения этой проблемы? Использование некоторых функций bitbucket или Jenkins?

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Вероятно, самый простой способ добиться того, чего вы хотите, - это git log или git diff, так как оба могут принимать диапазон оборотов и путь:

git log [<options>] [<revision range>] [[--] <path>…​]
git diff [<options>] <commit> <commit> [--] [<path>…​]

Например, чтобы проверить, касается ли последний коммит касанияdirectory1 и / или directory2, вы можете использовать:

git log --oneline HEAD^..HEAD directory1 directory2

Для отрицательного соответствия, исключение pathspec должно сделать трюк:

git log --oneline HEAD^..HEAD -- '.' ':(exclude)./directory1'

Или аналогично с diff:

git diff HEAD^..HEAD '.' ':(exclude)directory'
1 голос
/ 04 октября 2019

Чтобы решить эту проблему, используйте функцию git :(exclude)directory' (спасибо @sbat). Подробности этой функции описаны здесь .

Вот как это можно сделать в деталях (конвейер Jenkins для платформы Windows):

// inside some step:
node('master') {
    def diffStat = "undetermined"
    try {
        diffStat = bat (
            returnStdout: true, 
            script: """@ECHO OFF
                cd $repoDirecory
                git diff ${PULL_REQUEST_TO_BRANCH} --shortstat --  "." ":(exclude)./FrontendA" ":(exclude)./FrontendB"
                """).trim()

        if (!diffStat) {
            currentBuild.description = "Frontend only"
            error("There is no significant changes, build is not required!")
        }
    } finally {
        if (diffStat) {
            echo diffStat
        } else {
            currentBuild.result = 'SUCCESS'
        }
        notifyBitbucket(commitSha1: PULL_REQUEST_FROM_HASH, ignoreUnverifiedSSLPeer: true)
    }
}

Поскольку неткод выхода из: git diff --shortstat <....>, но git ничего не печатает, если нет видимых изменений. Таким образом, используя bat returnStdout: true в groovy, вывод git присваивается переменной. Затем в groovy-скрипте могут быть предприняты надлежащие действия в зависимости от того, пуста переменная diffStat или нет.

Теперь, если обнаружены только несущественные изменения (пусто diffStat), выдается сообщение об ошибке, которое затем обрабатывается. как успех. Bitbucket видит эту сборку как успешную (это было целью). На Jenkins все этапы сборки не выполнены (красный), но для меня это не проблема.

Если были обнаружены значительные изменения, Jenkins печатает статистику различий (реальный пример):

6 files changed, 62 insertions(+), 48 deletions(-)

Вкл. В Windows есть ловушка: ' (символ одинарной кавычки) не может быть использован, но, как вы можете видеть выше " (двойная кавычка), сделайте свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...