Каждый раз, когда я читаю о Процесс выпуска 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”