Как получить список всех измененных файлов в конвейере Дженкинса?
Я использую многоотраслевой конвейер, и мне нужно получить список измененных файлов.
Я старался
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