12 gradle - xzima/gradle-semantic-release-example GitHub Wiki

Как должен выглядеть типовой gradle проект?

Использование кастомных свойств(properties) проекта

Для использования кастомных свойств рекомендуется использовать gradle-плагин vlsi.gradle-extensions. Он предоставляет dsl через делегаты и базовые проверки для типов свойств.

Разрешение конфликтов в дереве зависимостей

Для разрешения конфликтов в дереве зависимостей следует использовать конструкцию configurations.all.resolutionStrategy.failOnVersionConflict(). Эта конструкция будет приводить к возникновению исключений если в дереве зависимостей найдутся любые конфликты, без попытки автоматического их разрешения. Для разрешения конфликтов следую использовать конструкцию configurations.all.resolutionStrategy.force(<target-dependency-with-version>).

Пример использования можно найти в build.gradle.kts.

Валидация gradle wrapper в CI/CD

Для валидации gradle wrapper используется gradle/actions/wrapper-validation, который добавляется в секцию с тестированием.

Обновления графа зависимостей gradle в CI/CD

Для обновления графа зависимостей gradle используется gradle/actions/dependency-submission который добавляется в секцию с построением релиза, причем только для стабильных версий.

Настройка linters

Основой в использовании linters выступает gradle-плагин spotless.

Для языка kotlin используется linter ktlint в комбинации с .editorconfig.

Пример настройки можно увидеть в build.gradle.kts и .editorconfig.

Настройка Code Coverage

Для публикации отчета по покрытию кода тестами следует использовать madrapps/jacoco-report, который добавляется в секцию с тестированием.

Для настойки потребуется так же добавить gradle-плагин jacoco с включенной настройкой в task jacocoTestReport.reports.xml.required=true для публикации отчета в формате xml.

Пример настойки madrapps/jacoco-report можно найти в .github/workflows/__tests.yml.

Настройка Test Report

Для публикации отчета с результатами тестирования следует использовать EnricoMi/publish-unit-test-result-action, который добавляется в секцию с тестированием. При использовании junit5 достаточно будет указать только директорию с отчетом тестирования в формате xml build/test-results/test/TEST-*.xml.

Публикация в Maven Central

Основой для конфигурации публикации послужил репозиторий java-maven-sonatype-starter.

1: Создание аккаунта Sonatype

Предпочтительно создать аккаунт Sonatype Central используя для логина свой аккаунт GitHub. В таком случае не потребуется выполнять верификацию namespace. Во всех остальных случаях следует создать новый namespace и выполнить верификацию через доступ к домену.

2: Генерация и публикация GPG ключей

  • Создать GPG ключи посредством команды gpg --full-generate-key. Ключевые требования:
    • RSA and RSA
    • 4096
    • No expire
    • собрать user id, который включает name, email address, comment
    • указать passphrase
  • Получить GPG_KEY_ID посредством команды gpg --list-signatures <gpg-name>
  • Опубликовать свой GPG_KEY_ID посредством команды gpg --keyserver keyserver.ubuntu.com --send-keys <GPG_KEY_ID>
  • Экспортировать GPG_PRIVATE_KEY посредством команды и passphrase gpg --armor --export-secret-keys <GPG_KEY_ID> | grep -v '\-\-' | grep -v '^=.' | tr -d '\n'

3: Настройка Gradle-плагина

Основой для выполнения публикации посредством gradle выступает gradle-плагин com.vanniktech.maven.publish в комбинации со следующими плагинами:

Пример настройки можно увидеть в build.gradle.kts.

4: Настройка GitHub Actions

  • Создать GitHub Environments(your_repo/settings/environments)
  • Добавить следующие secrets:
  • Создать github workflow с триггером on.release.types: [published], который будет выполнять команду ./gradlew publishAndReleaseToMavenCentral --no-configuration-cache и следующими переменными окружения:
    env:
      ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.NEXUS_USERNAME }}
      ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.NEXUS_PASSWORD }}
      ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.GPG_PRIVATE_KEY }}
      ORG_GRADLE_PROJECT_signingInMemoryKeyId: ${{ secrets.GPG_KEY_ID }}
      ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.GPG_PASSPHRASE }}
⚠️ **GitHub.com Fallback** ⚠️