UncategorizedгаджетыНовостиразработчиктехнология

Быстрое и удобное управление выпусками для проектов Java с помощью JReleaser

Ключевые выводы

  • JReleaser намеревается упростить процесс выпуска и публикации двоичных файлов Java таким образом, чтобы эти двоичные файлы могли использоваться менеджерами пакетов, зависящими от платформы (файлы ZIP, TAR или JAR).
  • JReleaser позволяет публиковать двоичные файлы для Homebrew, Scoop, Snapcraft, Chocolatey и других.
  • Публикация с помощью JReleaser гарантирует создание журнала изменений из самого последнего тега, расчет контрольных сумм, подпись PGP, если подписание включено, создание и публикацию образа Docker на основе файла Docker, созданного в соответствии с предоставленными шаблонами.
  • JReleaser можно использовать прямо из коробки с Maven, Gradle, Bach и Ant. Для тех, кто использует собственные инструменты сборки, JReleaser предоставляет собственный интерфейс ToolProvider, что упрощает интеграцию. Это именно то, что сегодня делает инструмент сборки Баха.

Независимо от типа проекта, который вы пишете, будь то приложение микросервисов, мобильное приложение или даже собственные приложения, вам необходимо убедиться, что ваш код правильно упакован и распространяется по соответствующим каналам для достижения своей аудитории. В настоящее время службы стремятся сократить время разработки и охватить как можно более широкую аудиторию.

Андрес Алмирей, главный менеджер по продуктам в Oracle, хотел изучить язык программирования Go. Это привело его к открытию GoReleaser, инструмента автоматизации релизов для проектов Go, и его влияния на экосистему Go. Алмирея также вдохновила дискуссия с Максом Райдалом Андерсеном, выдающимся инженером Red Hat, о том, как JBang работает с выпусками. Этот опыт привел к появлению концепции JReleaser, инструмента сборки и распространения для экосистемы Java, аналогичного тому, что GoReleaser делал для экосистемы Go. Спустя всего пару месяцев разработки Almiray представил JReleaser сообществу Java в апреле 2021 года. С тех пор Almiray выпустил три версии (одну раз в две недели и управляемые самим JReleaser), которые в настоящее время имеют версию 0.4.0. Более свежие версии помогли сделать JReleaser еще более универсальным, обеспечив поддержку Java Runtime для MacOS, Windows, Linux (glibc) и Linux (musl), широко известных как Alpine Linux. JReleaser в настоящее время интегрируется с 14 инструментами CI и предоставляет возможность загружать артефакты в менеджер репозитория Artifactory JFrog и настраиваемые HTTP-серверы.

Чтобы лучше понять миссию JReleaser и то, как она может облегчить жизнь разработчикам программного обеспечения, InfoQ обратилась к Almiray с просьбой поближе познакомиться с тем, что это такое и как с ее помощью упростить управление проектами Java.

InfoQ: Спасибо, что нашли время ответить на вопросы наших читателей. Каковы ваши текущие повседневные обязанности? Есть ли связь между вашей повседневной работой и JReleaser?

Almiray: Спасибо, что пригласили меня. Я старший главный менеджер по продукту в группе Oracle Database, что может шокировать некоторых, поскольку у меня есть опыт работы с Java в течение последних 25 лет; Я даже стал участником программы Java Champions в 2010 году. Причина присоединения к группе баз данных состоит в том, чтобы продолжать наводить мосты между продуктами баз данных Oracle и сообществом Java, и поэтому я стараюсь следить за популярными открытыми приложениями. исходные проекты, разговаривать с разработчиками и возвращать ценные отзывы нашим внутренним командам. Кстати, я также продолжаю работать над проектами с открытым исходным кодом, в которых я участвовал в течение многих лет, прежде чем присоединиться к Oracle во второй раз. JReleaser – один из тех проектов с открытым исходным кодом, которые возникли из-за необходимости поддерживать другие проекты в актуальном состоянии. При этом нет прямой связи между моей текущей работой и JReleaser, кроме того, что он написан на Java, и я использую Java на работе.

InfoQ: Что послужило источником вдохновения для JReleaser и как вы начали?

Almiray: Несколько лет назад я опубликовал проект с открытым исходным кодом под названием Ikonli, который оказался довольно популярным в пространстве JavaFX. Этот проект предоставляет значки, которые можно встроить в приложение Swing или JavaFX. Со временем количество пакетов значков росло, что затрудняло определение того, какие значки можно добавить в приложение. Ikonli предоставляет HTML-документацию со шпаргалками по иконкам, но мне очень хотелось иметь приложение, которое делало бы то же самое, браузер иконок, если хотите. Создать такое приложение с помощью JavaFX довольно просто, однако сделать его доступным для использования кем угодно – непростая задача. Как вы упаковываете и публикуете приложение, для которого требуются двоичные файлы для конкретной платформы? Вы предполагаете, что у пользователя будет правильная версия Java для запуска приложения? Вы связываете среду выполнения Java с двоичными файлами? Достаточно ли публиковать ZIP-файлы или менеджеры пакетов платформы подходят лучше? Я продолжал искать ответы на эти вопросы, когда наткнулся на два других проекта: JBang и GoReleaser.

JBang – это проект на основе Java, который упакован для нескольких каналов распространения, таких как Homebrew, Scoop, Chocolatey, Docker и других. Это вроде как решает большинство вопросов, которые у меня были с Ikonli, но автоматизация сборки требует некоторой работы, так как установка требует больших усилий для применения в другом проекте. Другими словами, настройка уникальна для нужд JBang. GoReleaser, с другой стороны, предоставляет именно то, что я искал, за исключением того, что он работает только для проектов Golang.

Однажды днем ​​мы с Максом Андерсеном (создателем JBang) болтали о настройке сборки, выпусках и других интересных вещах, когда нас осенило: а что, если бы существовала версия GoReleaser для Java? То есть инструмент, который позволит вам упаковывать, выпускать и публиковать проекты Java таким же образом, как GoReleaser для Golang, но вместо этого поддерживает Java? Что, если бы этот инструмент использовал уроки, извлеченные JBang, чтобы достичь того, чем он является сегодня? Так появился JReleaser.

InfoQ: Какова его миссия? Для каких проектов он создан?

Almiray: Первоначальная миссия JReleaser состоит в том, чтобы упростить процесс выпуска и публикации двоичных файлов Java таким образом, чтобы эти двоичные файлы могли использоваться менеджерами пакетов, зависящими от платформы, то есть предоставлять файлы ZIP, TAR или JAR. JReleaser решит все остальное, позволяя вам публиковать двоичные файлы для Homebrew, Scoop, Snapcraft, Chocolatey и других. Другими словами, JReleaser сокращает расстояние между вашими двоичными файлами и вашими потребителями, встречая их там, где они предпочитают управлять своими пакетами и двоичными файлами.

В начале разработки JReleaser стало очевидно, что разделение работы на несколько этапов, которые можно было бы запускать индивидуально или как одно целое, было бы лучшим подходом, чем то, что GoReleaser предлагает сегодня. Этот выбор дизайна позволяет разработчикам контролировать каждый шаг по мере необходимости, чтобы подключить JReleaser на определенном этапе их процесса выпуска без необходимости переписывать все. Например, вы можете запустить JReleaser и заставить его создать выпуск Git (GitHub, GitLab или Gitea) вместе с автоматически отформатированным журналом изменений, или вы можете указать JReleaser добавить ресурсы в существующий выпуск Git, созданный другими способами, или, возможно, вас интересует только упаковка и публикация пакета для Homebrew независимо от того, как был создан выпуск Git.

Возможность активировать шаги по отдельности или в целом дает вам достаточно места для игры. И не только это, он также дает вам возможность применять JReleaser к любому типу проекта, а не только к проектам Java. Например, вы можете использовать его для создания выпусков Git независимо от того, основан ли проект на Java или нет; вы также можете настроить JReleaser для работы с любым существующим программным обеспечением CI.

Конечно, если проект основан на Java, вы получите дополнительные преимущества, поскольку управление пакетами в настоящее время специализируется на этом виде проектов. Само собой разумеется, что если проект основан на Golang, то лучше придерживаться GoReleaser, поскольку он предоставляет специфические для Golang функции, которых нет в JReleaser.

Таким образом, любой проект, который хотел бы создавать и анонсировать выпуски Git, выиграет от JReleaser. Если это проект Java, он получает дополнительные преимущества. Приложения CLI, такие как реализованные с помощью PicoCLI, Micronaut, Quarkus или Spring Boot, безусловно, могут воспользоваться этими дополнительными преимуществами. Само собой разумеется, что приложения JavaFX также получают развитие.

InfoQ: Вы можете легко представить, как JReleaser можно использовать для проектов с открытым исходным кодом. Что бы изменилось в частных проектах?

Almiray: Рад, что ты спросил. Я счастлив сказать, что никакой разницы нет. JReleaser можно настроить для поддержки корпоративных версий программного обеспечения выпуска Git по вашему выбору. В его документации предлагается использовать лицензии, одобренные OSI, и идентификаторы SPDX, поскольку они требуются конкретными менеджерами пакетов, однако JReleaser не проверяет эти лицензии. Вы можете использовать любую схему лицензирования, которая может потребоваться для проекта. JReleaser также поддерживает широкий спектр услуг CI, не делая различий между их бесплатными и платными предложениями.

InfoQ: Полагается ли JReleaser на себя при управлении собственными выпусками?

Almiray: Да! Начиная с первого выпуска, JReleaser выпускается с использованием собственной версии моментальных снимков. Фактически, сборка JReleaser настроена таким образом, что она создает выпуски с ранним доступом при каждом нажатии на свой репозиторий Git. Эти выпуски с ранним доступом создаются с помощью предыдущей версии моментального снимка JReleaser, Inception.

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

Almiray: JReleaser основывается на уроках, извлеченных GoReleaser, JBang и всеми другими проектами с открытым исходным кодом, с которыми я работал в прошлом. Там много истории, несмотря на то, что кодовая база по сравнению с ней относительно молода. Поскольку JReleaser использует себя для выпуска, время от времени это означает, что мы можем выявить проблемы на ранней стадии разработки. Конечно, у других проектов другие потребности, и именно здесь мы черпаем вдохновение для новых функций и поведения. Я, конечно же, призываю других попробовать. Пусть вас не вводит в заблуждение его текущий номер версии, JReleaser – это отличный инструмент!

InfoQ: Можете ли вы дать нам несколько советов по быстрому началу работы?

Almiray: Возможно, лучше всего начать с ознакомления с руководствами по быстрому запуску, затем продолжить настройку DSL и некоторых примеров, приведенных в руководстве. Я предпочитаю условность конфигурации, поэтому мне нравится, когда инструмент делает за меня больше всего выбора. Однако мне также нравится, когда я могу делать свой собственный выбор и соглашаться. По этой причине JReleaser поддерживает несколько способов настройки: вы можете использовать внешние DSL с форматами YAML, TOML или JSON при работе в режиме CLI; или вы можете использовать Maven DSL в паре с jreleaser-maven-plugin; или Gradle DSL в паре с jreleaser-gradle-plugin.

InfoQ: Есть ли у JReleaser какие-то ограничения?

Almiray: Да, особенно когда речь идет о поддержке нескольких платформ. Некоторые упаковщики, такие как Snapcraft и Chocolatey, должны работать в очень специфических средах; Linux для первых и Windows для вторых. Это означает, что вы не можете упаковать и то, и другое на одном узле. То же самое и с двоичными файлами GraalVM Native Image, типом дистрибутива, который также поддерживает JReleaser, поскольку в настоящее время не существует способа создания межплатформенных двоичных файлов. JReleaser может генерировать кроссплатформенные среды выполнения Java с помощью Jlink при отсутствии модулей для конкретной платформы. Это мешает созданию таких сред выполнения для приложений JavaFX, поскольку для них требуются модули macOS, Linux или Windows.

Текущий обходной путь заключается в создании пакетов и дистрибутивов для конкретной платформы на разных узлах CI, сборе результатов и их выпуске с одного узла. Таким образом, в зависимости от вашей настройки, вы можете создавать выпуски как локально, так и удаленно с одинаковой конфигурацией (например, без упаковщиков для конкретной платформы), или вам может потребоваться дополнительная конфигурация и серверы сборки для сборки двоичных файлов, теряя возможность создания выпусков локально. .

InfoQ: Не могли бы вы кратко рассказать о том, что происходит под капотом?

Almiray: Удивительно, но движком JReleaser движет процессор шаблонов файлов. Разработчик предоставляет конфигурацию проекта в качестве входных данных (модель), которые обрабатываются на каждом этапе рабочего процесса выпуска. Большинство шагов используют этот ввод и генерируют файлы на основе шаблонов, которые, в свою очередь, также используются в качестве входных данных для текущего или следующего шага. Например, модель определяет распределение типа JAVA_BINARY (обычно это ZIP-файл с файлами JAR и исполняемой программой запуска) и активирует упаковщик Docker. Вызов шага публикации выполнит следующие задачи:

  • Создайте журнал изменений от самого последнего тега до текущего HEAD.
  • Подсчитайте контрольные суммы входящего распределения.
  • Создайте подписи PGP, если подписание активно.
  • Создайте Dockerfile на основе предоставленных шаблонов.
  • Создайте образ Docker на основе разрешенного файла Dockerfile.
  • Опубликуйте образ Docker на настроенном сервере (ах).

Модель предоставляет большое количество разумных настроек по умолчанию и требует от вас настройки сгенерированных файлов. Но в случае, если этого недостаточно, вы также можете предоставить свои собственные шаблоны, переопределив или дополнив шаблоны по умолчанию.

InfoQ: С какой самой большой технической проблемой вы столкнулись при разработке JReleaser?

Almiray: Я считаю, что это позволит сохранить как можно меньшее количество зависимостей, а также сделать Java 8 минимально поддерживаемой версией Java. Это почему? Это сделано для поддержки запуска JReleaser как плагинов Ant, Maven и Gradle. Я хотел бы перейти на Java 11, полностью использовать систему модулей Java и получить доступ к более свежим функциям, добавленным в язык Java. Однако хорошая игра со всеми инструментами сборки требует компромиссов.

InfoQ: Как это интегрируется в конвейеры CI?

Almiray: В настоящее время есть два простых способа сделать это. Вы можете запустить JReleaser как процесс Java или использовать его образ Docker.

Первая форма – это то, что делает действие GitHub jreleaser / release-action. Он загружает (настраиваемую) версию JReleaser как отдельный überjar и выполняет свой основной класс. Для этого требуется Java Runtime на целевом узле, в данном случае Java 11 Runtime, если быть точным, поскольку überjar запускает экземпляр ToolProvider.

Вторая форма упаковывает среду выполнения Java и двоичные файлы JReleaser в виде образа Docker, что позволяет использовать его с любым сервером CI, который может использовать образы контейнеров.

Третий способ, если вы действительно хотите это сделать, – это использовать настраиваемую стратегию загрузки, чтобы захватить файл ZIP или TAR со страницы релизов, распаковать и выполнить. Или вы также можете использовать SDKMAN! чтобы установить его, что на данном этапе не должно вызывать удивления, поскольку JReleaser может публиковать и анонсировать пакеты в SDKMAN! также.

InfoQ: Есть ли способ настроить использование JReleaser для пользовательских инструментов? Или какой-то механизм расширения?

Almiray: Прямо сейчас JReleaser можно использовать “из коробки” с Maven, Gradle, Bach и Ant. Эти интеграции требуют небольшой абстракции над механизмом выполнения. Если инструмент сборки полагается на интерфейс Java 9 ToolProvider для настройки своего поведения, то у меня есть новость: JReleaser уже предоставляет собственный ToolProvider, что упрощает его интеграцию. Это именно то, что сегодня делает инструмент сборки Баха.

Движок написан таким образом, что при необходимости его можно легко интегрировать с любым другим инструментом сборки. Если бы это было так, я настоятельно рекомендую тем, кто заинтересован в новой интеграции, присоединиться к нашей странице обсуждений и поделиться своей идеей.

Независимо от типа создаваемого вами проекта, независимо от его сложности или способа написания, всем программным проектам необходим способ управления их выпусками. Чаще всего процедуры и процессы выпуска представляют собой списки рутинных работ, которые необходимо выполнять автоматически, вручную или с помощью специальных инструментов или сценариев, используемых в разных компаниях. С постоянно растущей сложностью программных продуктов и проектов их становится еще труднее объединить в единый продукт или проект.

InfoQ: Не могли бы вы рассказать нам о будущем JReleaser? Есть ли определенная дорожная карта?

Almiray: Проект поддерживает широкий спектр интеграций, начиная от публикации выпусков на GitHub, GitLab и Gitea; упаковка с Homebrew, Scoop, Chocolatey, Snapcraft, JBang, Docker; анонсирование выпусков SDKMAN !, Twitter, Gitter, Discord, Zulip, e-mail, Slack, Microsoft Teams; поддержка типов распространения, таких как двоичный файл Java, отдельный JAR, Jlink и собственный образ GraalVM.

Есть и другие службы, которые могут быть интегрированы в будущем, возможно, другая платформа Git, или, может быть, еще один пакетировщик для конкретной платформы, или служба объявлений. Здесь мы рассчитываем получить обратную связь от пользователей, чтобы сообщить нам, какие службы им, возможно, потребуется интегрировать в свои проекты.

Java 16 добавила jpackage в качестве опции для создания установщиков для конкретной платформы. Это также может быть другой тип дистрибутива, который может быть добавлен в будущем. В конце концов, некоторые выходные данные, создаваемые jpackage, могут распространяться, например, с Homebrew (.dmg и .pkg в виде контейнеров).

Недавно была добавлена ​​возможность создавать отформатированный журнал изменений, однако в настоящий момент это делается только при просмотре локальных коммитов. Это означает, что мы упускаем из виду метаданные, доступные удаленно, такие как запросы на вытягивание, метки задач и другие данные. Возможно, в будущем появится возможность настроить JReleaser для получения этих данных перед созданием журнала изменений.

InfoQ: Апрель был важным месяцем для JReleaser. У него был первый запуск, а две недели спустя последовала версия 0.2.0. Каковы на данный момент самые важные особенности?

Almiray: Действительно. Проект медленно продвигался в скрытом режиме с сентября 2020 года, поскольку команда разработчиков все еще возвращалась к идеям и проверяла гипотезы. К марту 2021 года мы знали, что у нас есть ядро ​​звука, и составили план для первого релиза.

Возможно, его наиболее важной особенностью является его гибкость: JReleaser может многое решить за вас, если вы будете следовать соглашениям. Вы просто расслабляетесь и позволяете JReleaser управлять процессом выпуска. Но при этом вы можете сесть за руль и решить, как и куда вы хотите отправиться с выпуском. В этом случае один размер не подходит для всех, JReleaser стремится поддерживать как можно больше вариантов использования.

Эта гибкость также выражается в его реализации для интеграции нового сервиса, упаковщика или инструмента оповещения, что является довольно простыми задачами.

InfoQ: Сейчас это похоже на спектакль одного актера. Есть ли планы по развитию сообщества? Какие-нибудь советы разработчикам, которые хотели бы внести свой вклад?

Almiray: Конечно, похоже, не так ли? Однако с самого начала у проекта был небольшой набор участников. Что мне нравится в JReleaser, так это то, что он предоставляет единую модель для создания и публикации двоичных файлов независимо от выбранного инструмента сборки, службы хостинга Git или решения CI. Я ожидал, что другие разработчики придут к такому же выводу и попробуют проект, что может привести к обратной связи, запросам функций и исправлениям. Мы приветствуем любые виды вкладов, будь то упорядочивание выпусков, документация, исправления и т. Д.

Хорошее место для начала – принять участие в нашей странице обсуждений и опубликовать вопрос, или взглянуть на наш трекер проблем и оставить отзыв о проблеме или даже патче. Всегда полезно начать разговор, прежде чем работать над кодом, чтобы мы могли помочь вам получить функцию или исправить форму для скорейшего слияния.

Заключение

Независимо от инструмента, который вы используете для организации своего проекта, Maven, Gradle или даже Ant, и каналов, которые вы используете для публикации или анонса ваших выпусков, миссия JReleaser состоит в том, чтобы связать их вместе и гарантировать, что все работает должным образом. . Выполняя последовательную смену выпусков раз в две недели, JReleaser следует своей миссии – стать фактическим инструментом для управления выпусками в мире Java.

Об интервьюируемом

Андрес Альмирай – разработчик Java / Groovy и чемпион по Java с более чем 20-летним опытом проектирования и разработки программного обеспечения. Он занимался разработкой веб-приложений и приложений для настольных компьютеров с первых дней развития Java. Андрес искренне верит в открытый исходный код и участвовал в популярных проектах, таких как Groovy, Griffon и DbUnit, а также в создании собственных проектов (Json-lib, EZMorph, GraphicsBuilder, JideBuilder). Член-основатель сообщества Griffon framework и Hackergarten.

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button