Привет, меня зовут Дима и я разработчик в компании Turbomates Soft. В этой статье я хочу поделиться своим опытом публикации Kotlin | Java проектов через Gradle и рассказать о некоторых тонкостях настройки. Начнем...
1. Регистрируем репозиторий в Sonatype
Сначала мы должны зарегистрироваться в Sonatype JIRA.
Sonatype OSSRH – это хостинг репозиториев для двоичных файлов проектов с открытым исходным кодом. OSSRH использует формат репозитория Maven и позволяет:
развернуть бинарные файлы для разработки
staging вашего проекта
синхронизировать их с центральным репозиторием
После регистрации создаем ticket в JIRA. Выбираем тип New Project. И наверное самое основное это указываем верный groupId. Иначе придется снова создавать таску и вам создадут новый репозиторий. Напоминание. Репозиторий при подключении будет выглядеть вот так:
implementation("groupId:artifactiId:version")
Это мы делаем для того, чтобы подтвердить владение данным доменом или профилем. Если вы указали профиль гитхаба, попросят создать публичный репозиторий с нужным именем. Через некоторое время для вас создадут репозиторий и мы сможем перейти к следующему шагу.
2. Требования Central Repositry
Перед тем как приступить уже к Gradle настройке деплоя, есть ряд требований для публикации твоего репозитория.
Наличие Javadoc и JavaSource. Eсли нет возможно предоставить исходные коды или документацию, можно сделать пустышки
sources.jar
илиjavadoc.jar
Подпись файлов с помощью GPG/PGP
Наличие конфигурационного
pom
файла. Gradle сам сгенерирует намpom
файл со всеми указаными конфигурация в последующих пунктах.Корректные координаты вашего проекта (
artefactId
,groupId
,version
)Наличие имени проекта, url и описания
Лицензия
Информация о разработчиках
SCM информация
Pom файл сгенерированый с помощью Gradle и всеми ниже перечисленными требованиями мы разберем чуть позже. А пока я хотел бы остановиться подробнее на пункте с подписью GPG/PGP
3. Подписываем файлы с помощью GPG
GPG (GnuPG) – програма для шифрования информации и создания электронных цифровых подписей. И именно такая подпись нам потребуется. Прежде всего нужно установить gpg если она еще у вас не установлена.
1. Проверяем наличие gpg |
|
2. Устанавливаем: на прямую через сайт для вашей ОС или через терминал |
|
3. Генерируем ключи. Выполняем все условия которые нам предлагаются |
|
4. Проверяем наши ключи |
|
5. Загружаем наши ключики на сервер этих ключей, где <PUBLIC-KEY-ID> — идентификатор открытого ключа для загрузки, который вы найдете в листе ключей. |
|
Отлично! Наш секретный шифр уже на сервере и теперь мы можем подписывать наши файлы. Мы же крутые программисты и не будем подписывать файлы в ручную, поэтому оставим это для Signing Plugin. Всю настройку я покажу позже, а пока согласно документации нам нужно заполнить наши секреты в файле gradle.properties
signing.keyId=24875D73
signing.password=1111111
signing.secretKeyRingFile=/Users/me/.gnupg/secring.gpg
keyId -> последние 8 символов <public-key-id> который мы использовали ранее
password -> пароль который вводился при генерировании ключей. Желательно чтобы он быть секретный как в примере
secretKeyRingFile -> путь до твоего файла с ключом. Но перед этим нужно его нам найти или создать.
Файл ~/.gnupg/secring.gpg — это закрытый ключ, который будет использоваться для подписи. Здесь есть подвох: если ты используешь GnuPG v2.1 или более позднюю версию, файла ~/.gnupg/secring.gpg не существует. Эта проблема обсуждается здесь, и ты можешь обойти ее, создав файл secring.gpg следующим образом:
gpg --export-secret-keys >~/.gnupg/secring.gpg
Если не будет работать попробуй
gng --export-secret-keys -o ~/secring.kbx
Готово! Теперь отметь путь к этому файлу в наших gradle.properties
4. Gradle конфигурация
Ну что, теперь самое вкусное. Коооод....
Для публикации проектов через Gradle есть замечательный плагин Maven Publish Plugin, который мы будем использовать совместно с Signing Plugin для нашей GPG подписи. Для начала подключим наши плагины
plugins {
`maven-publish`
signing
}
Maven Publish Plugin сгенерирует все необходимые файлы за нас, нам лишь необходимо указать нужную информацию согласно выше описаным требования. Смотри согласно документации, некоторые поля например версия опциональные, если ты их указал для проекта в build.gradle.kts.
Примечание. С февраля 2021 г. все новые проекты начали размещаться на https://s01.oss.sonatype.org/, до этого они размещаются на https://oss.sonatype.org/
java {
withJavadocJar()
withSourcesJar()
}
publishing {
publications {
create<MavenPublication>("mavenJava") {
artifactId = "super-project"
groupId = "com.turbomates"
version = "0.0.1"
from(components["java"])
pom {
packaging = "jar"
name.set("Super Puper Project")
url.set("https://github.com/turbomates/super-project")
description.set("Some description")
licenses {
license {
name.set("The Apache License, Version 2.0")
url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
}
}
scm {
connection.set("scm:https://github.com/turbomates/super-puper-project.git")
developerConnection.set("scm:git@github.com:turbomates/super-puper-project.git")
url.set("https://github.com/turbomates/super-puper-project")
}
developers {
developer {
id.set("JinEngine")
name.set("Dmitry Korotin")
email.set("jin.engine@gmail.com")
}
}
}
}
}
repositories {
maven {
val releasesUrl = uri("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/")
val snapshotsUrl = uri("https://s01.oss.sonatype.org/content/repositories/snapshots/")
url = if (version.toString().endsWith("SNAPSHOT")) snapshotsUrl else releasesUrl
credentials {
username = project.properties["ossrhUsername"].toString()
password = project.properties["ossrhPassword"].toString()
}
}
}
}
Логин и пароль от Sonatype ("ossrhUsername & ossrhPassword") можно тоже положить в gradle.properties
.
Что касается подписи, то достаточно указать какую публикацию подписать в build.gradle и наши секреты в gradle.properties
signing {
sign(publishing.publications["mavenJava"])
}
В итоге Gradle сгенерирует для нас 4 файла:
super-project-0.0.1.pom
super-project-0.0.1.jar
super-project-0.0.1-source.jar
super-project-0.0.1-javadoc.jar
И с помощью команды ./gradle publish мы наконец уже сможем опубликовать наш проект, но пока только в репозиторий который мы создали в Sonatype
5. Релиз репозитория в Sonatype
Мы будем использовать Gradle Nexus Staging Plugin. Сам sonatype его рекомендует для staging своего проекта. Что касается настройки, то все просто, там много опциональных переменных, но я думаю такая простая конфигурация покроет большую часть кейсов.
plugins {
apply("io.codearte.nexus-staging:0.30.0")
}
nexusStaging {
serverUrl = "https://s01.oss.sonatype.org/service/local/"
username = project.properties["ossrhUsername"].toString()
password = project.properties["ossrhPassword"].toString()
}
6. Радуемся новому релизу
Надеюсь эта статья помогла разобраться с достаточно раздутыми процессом публикации. Теперь легким сочетанием команд ./gradlew publish closeAndReleaseRepository мы можем опубликовать и зарелизить наш проект.
Что еще можно добавить: ставим пальцы вверх, нажимаем на колокольчики и пишем комментарии!
Дима jin_engine
Software Engineer | Turbomates Soft