Crimson.Lab

Лаборатория Кримсона

3 July 2023

Публикуем библиотеку на java в maven-central

  1. Регистрируемся на issues.sonatype.org
  2. Создаём тикет
    • Поле Issue Type = New Project
    • Summary = Краткое название проекта
    • Group Id = info.x-crm (Это ваш артефакт = имя домена наоборот)
    • Project URL = Ссылка на сайт проекта
    • SCM url = Ссылка на репозиторий
    • Already Synced to Central = No
  3. Ждём пока робот скажет что делать. Можно сразу создать TXT запись для домена с номером тикета OSSRH-XXYYZZ
  4. Скачиваем gpg4win и создаём там приватный ключ, публикуем.
  5. Экспортируем ключ в формате ascii-armored (*.asc)
  6. Создаём файл c:\Users\user.gradle\gradle.properties важный момент
sonatypeUsername=Логин от issues.sonatype.org
sonatypePassword=Пароль от issues.sonatype.org
signingKeyId=Последние 8 цифр идентификатора ключа (short формат)
signingPassword=Пароль от закрытого ключа
signingKey=-----BEGIN PGP PRIVATE KEY BLOCK-----\n\nСодержимое ключа в одну строку, где все символы новой строки явно обозначены\n-----END PGP PRIVATE KEY BLOCK-----\n
  1. Основные секции файла build.gradle для java приложения. Если в версию добавить слово SNAPSHOT - будет публикация в тестовом maven репозитории.
plugins {
    id 'java'
    id 'maven-publish'
    id 'signing'
}

group = 'info.x-crm'
version = '0.0.1'

java {
    withJavadocJar()
    withSourcesJar()
}
publishing {
    publications {
        mavenJava(MavenPublication) {
            artifactId = 'код-этой-библиотеки'
            from components.java

            versionMapping {
                usage('java-api') {
                    fromResolutionOf('runtimeClasspath')
                }
                usage('java-runtime') {
                    fromResolutionResult()
                }
            }

            pom {
                name = 'Название проекта'
                description = 'Описание проекта'
                url = 'https://x-crm.info/'
                licenses {
                    license {
                        name.set("The Apache License, Version 2.0")
                        url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
                    }
                }
                scm {
                    connection = 'scm:git:https://github.com/william-aqn/blog.git'
                    developerConnection = 'scm:git:https://github.com/william-aqn/blog.git'
                    url = 'https://github.com/william-aqn/blog'
                }
            }
        }
    }
    repositories {
        maven {
            def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
            def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
            credentials {
                username = findProperty("sonatypeUsername").toString()
                password = findProperty("sonatypePassword").toString()
            }
        }
    }
}

signing {
    def signingKeyId = findProperty("signingKeyId").toString()
    def signingKey = findProperty("signingKey").toString()
    def signingPassword = findProperty("signingPassword").toString()
    useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword)
    sign publishing.publications.mavenJava
}
  1. Если что то пошло не так - тут расшифрованы коды ошибок
  2. Отправляем на релиз публикацию (Нажать close, подождать немного, release)

Автопубликация библиотеки из репозитория при коммитах

  1. Для Github есть экшен, заполняем секреты sonatypeUsername / sonatypePassword / signingKeyId / signingKey / signingPassword
  2. Для Bitbucket создаём base64 строку из содержимого файла gradle.properties и сохраняем в секрет репозитория
  3. Создаём файл с пайплайном bitbucket-pipelines.yml
image: gradle:8.0

pipelines:
  default:
    - parallel:
      - step:
          name: Publish
          caches:
            - gradle
          script:
            - echo "$SECRET_BASE64_CONFIG" | base64 -d > ~/.gradle/gradle.properties
            - gradle publish

Рекомендации для библиотеки

tags: java - gradle - github - bitbucket