Рубрики
Без рубрики

Процесс Выпуска Библиотеки Java, Который Не Отстой

Каждый раз, когда я читаю о процессе выпуска Maven, это заставляет меня стонать. Должен быть лучший способ, чем этот… С тегами java, maven, gradle, ci.

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