Как получить список всех измененных файлов в конвейере Дженкинса?

Я использую многоотраслевой конвейер, и мне нужно получить список измененных файлов.

Я старался

git diff $PREVIOUS_COMMIT $COMMIT

но у них один и тот же SHA.

3 ответа

Решение

Согласно этой статье в CloudBees, вы можете получить доступ к такой информации внутри конвейера также без белого списка (используя безопасность песочницы / скрипта, по сравнению с моим другим ответом), начиная с плагина поддержки рабочих процессов версии 2.2:

def changeLogSets = currentBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++) {
    def entries = changeLogSets[i].items
    for (int j = 0; j < entries.length; j++) {
        def entry = entries[j]
        echo "${entry.commitId} by ${entry.author} on ${new Date(entry.timestamp)}: ${entry.msg}"
        def files = new ArrayList(entry.affectedFiles)
        for (int k = 0; k < files.size(); k++) {
            def file = files[k]
            echo "  ${file.editType.name} ${file.path}"
        }
    }
}

Ссылочная ссылка: https://support.cloudbees.com/hc/en-us/articles/217630098

К вашему сведению: API поддержки конвейера, плагин 2.2 или выше

Вы можете использовать currentBuild.changeSets в изолированной сборке, как вы могли видеть в следующем примере Git:

def changeLogSets = currentBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++) {
    def entries = changeLogSets[i].items
    for (int j = 0; j < entries.length; j++) {
        def entry = entries[j]
        echo "${entry.commitId} by ${entry.author} on ${new Date(entry.timestamp)}: ${entry.msg}"
        def files = new ArrayList(entry.affectedFiles)
        for (int k = 0; k < files.size(); k++) {
            def file = files[k]
            echo "  ${file.editType.name} ${file.path}"
        }
    }
}

Плагин поддержки API для конвейеров старше 2.2

Вы можете использовать currentBuild.rawBuild.changeSets, но это не доступно из песочницы. Ниже приведен пример Git для сборки без песочницы:

def changeLogSets = currentBuild.rawBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++) {
    def entries = changeLogSets[i].items
    for (int j = 0; j < entries.length; j++) {
        def entry = entries[j]
        echo "${entry.commitId} by ${entry.author} on ${new Date(entry.timestamp)}: ${entry.msg}"
        def files = new ArrayList(entry.affectedFiles)
        for (int k = 0; k < files.size(); k++) {
            def file = files[k]
            echo "  ${file.editType.name} ${file.path}"
        }
    }
}

Вы можете получить доступ к такой информации (после белого списка вызовов API) через currentBuild переменная:

currentBuild.rawBuild.getChangeSets().each { cs ->
  cs.getItems().each { item ->
    item.getAffectedFiles().each { f ->
      println f
    }
  }
}

Не проверено мной (но имеет смысл). Источник: Суть Лосьостроа.

Я предполагаю, что это решение отображает только изменения в текущей сборке, что в большинстве случаев бесполезно в DevOps. Нам нужен набор изменений из последней успешной сборки. Я нашел здесь другое решение: конвейер Jenkins - подход к получению всех коммитов с момента последней успешной сборки:https://gist.github.com/ftclausen/8c46195ee56e48e4d01cbfab19c41fc0

Другие вопросы по тегам