Каждый раз, когда я читаю о Процесс выпуска Maven это заставляет меня стонать. Должен быть лучший способ, чем этот. Что-то менее ручное, с меньшим количеством фиксаций и меньшими шагами, верно?
Требования
У меня были некоторые строгие требования к этому процессу выпуска:
- нет нескольких коммитов
- никаких обязательств со стороны CI
- следует создавать версии моментальных снимков, когда кто-то создает локально
- следует создавать версии моментальных снимков по умолчанию при сборке в CI, поэтому не каждый толчок к освоению является “выпуском”
- управление версиями должно осуществляться semver и не должно включать номера сборок
- не должно быть привязано к выбору CI (т. Е. Не должно быть конкретного выпуска CircleCI)
Новое решение
Лучший и самый простой способ выпуска Java-приложений, который я нашел, – это использовать теги git и менее известный плагин Gradle Я недавно обнаружил, поэтому я покажу вам, как я сейчас выпускаю библиотеки Java без боли.
Как это работает
Текущая версия проекта определяется самым последним тегом git в ветке. Так что, если последний тег был 0.0.5 , 2 коммита назад, и вы настроили плагин для увеличения версии исправления, это будет 0.0.6-СНИМОК . Если вы объедините этот коммит с master, CI также создаст 0.0.6-СНИМОК и опубликует его в вашем репозитории Maven, чтобы другие могли его опробовать. Если вы хотите выпустить эту фиксацию в качестве новой версии, просто пометьте фиксацию нужной версией, например 0.0.6 . CI подберет новый тег git и соберет его заново. Он увидит, что текущий коммит имеет семантически версионный тег, и будет использовать его в качестве версии проекта. Вы также можете пометить его любым номером версии, например 0.1.0 или 1.0.0 . Это позволяет разработчику контролировать, как увеличиваются версии.
Как добавить его в проект
1. Добавьте плагин semver git
plugins {
id "io.wusa.semver-git-plugin" version "2.2.1"
}
2. Настройте плагин
Это простая конфигурация, которую я выбрал: все ветви ведут себя одинаково (увеличивая версию исправления, когда тег отсутствует в текущей фиксации), и что версия просто major.minor.patch с возможным -СНИМКОМ суффиксом. Доступны дополнительные опции, как показано в плагине README.md .
semver {
snapshotSuffix = "SNAPSHOT"
initialVersion = "0.0.1"
branches {
branch {
regex = ".+"
incrementer = "PATCH_INCREMENTER"
formatter = { "${semver.info.version.major}.${semver.info.version.minor}.${semver.info.version.patch}" }
}
}
}
3. Используйте версию
Назначьте версию, рассчитанную плагином, версии проекта. Я явно вызываю .toString () здесь так что это оценивается только один раз. Если у вас многомодульная сборка, версия будет оцениваться для каждого подпроекта и .toString () метод будет вызываться каждый раз (именно здесь выполняются все команды git и поиск тегов).
Я также нахожу очень полезным выводить создаваемую версию для наглядности.
version = semver.info.toString() println "Building version $version of $rootProject.name"
4. Настройте свой CI для сборки при появлении нового тега
Это будет отличаться в зависимости от того, какой CI вы используете, но в совокупности я добавил новый ресурс git с tag_filter: *. *. * а затем добавил новый ввод в задание сборки, который также запустит задание:
resources:
- name: commons-utils.git-release-tags
type: git
check_every: 2m
source:
uri: git@github.com:PhilHardwick/commons-utils.git
branch: master
private_key: #private key config
fetch_tags: true
# only detect a new version when tag matches the semver pattern
tag_filter: "*.*.*"
jobs:
- name: build-commons-utils
plan:
- get: commons-utils.git
trigger: true
params:
fetch_tags: true
# use new resource as input and trigger job on new releases
- get: commons-utils.git-release-tags
trigger: true
Бонус на Github
В качестве бонуса, если вы используете Github, он также подберет теги и покажет их в качестве выпусков в вашем репозитории Github, чтобы разработчики могли легко проверить текущую версию.
Вывод
Я большой поклонник этого процесса выпуска, так как он проще, чем обычный процесс выпуска Maven с несколькими фиксациями. Он также не привязан к какой-либо реализации CI и работает в CI так же, как и локально.
Что дальше? Все еще нужно найти хороший способ сделать заметки о выпуске! Возможно, используя обычную фиксацию…
Оригинал: “https://dev.to/philhardwick/a-java-library-release-process-which-doesn-t-suck-4lb3”