Как получить и отформатировать журнал изменений git в декларативном конвейере

У меня есть декларативная настройка конвейера в Jenkins. На этапе после сборки я хочу отправить в Discord красиво отформатированный журнал изменений git с момента последней сборки. Для этого есть плагин, простой как кусок пирога:

    post {
        always {
            discordSend result: currentBuild.result, title: 'Build ' + env.BUILD_NUMBER, link: env.BUILD_URL, webhookURL: DISCORD_WEBHOOK
        }
        failure {
            discordSend result: currentBuild.result, title: 'Failed Build ' + env.BUILD_NUMBER, link: env.BUILD_URL, webhookURL: DISCORD_FAILED_WEBHOOK            
        }
    }

Выглядит это так:

введите описание изображения здесь

Ссылка ведет на мой сервер Jenkins, где есть подробный журнал изменений с момента последней сборки. Однако я хотел бы дополнительно включить этот журнал изменений в это сообщение Discord.

Мне не удалось понять, как это сделать для декларативного конвейера.

  1. Как мне получить журнал изменений?
  2. Как отформатировать его для Markdown 101?

person Hedin    schedule 08.12.2019    source источник


Ответы (1)


Вот пример изучения ревизий, это может направить вас по правильному пути:

@NonCPS
def printCurrentBuildChangesets() {
  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}"
        }
    }
  }
}

В качестве альтернативы вы можете попробовать следующее из примеров конвейера:

// This should be performed at the point where you've
// checked out your sources on the agent. A 'git' executable
// must be available.
// Most typical, if you're not cloning into a sub directory
// and invoke this in the context of a directory with .git/
// Along with SHA-1 id of the commit, it will be useful to retrieve changeset associated with that commit
// This command results in output indicating several one of these and the affected files:
// Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R)
commitChangeset = sh(returnStdout: true, script: 'git diff-tree --no-commit-id --name-status -r HEAD').trim()

Отформатировать его как Markdown и прикрепить через discordSend description: myDescription оставлено как упражнение;)

person MaratC    schedule 08.12.2019
comment
Я не понимаю, как команда diff tree выведет разницу между текущей ревизией (создаваемой) и последней созданной ревизией (это то, что Дженкинс делает внутри описания сборки). Нет доступной переменной среды (я знаю), которая также показывает идентификатор предыдущей версии сборки. - person Hedin; 10.12.2019
comment
Вы должны выяснить это с помощью entry.commitId, как в первой части. - person MaratC; 12.12.2019