# Публикация Java-пакетов с помощью Gradle

В этом уроке вы узнаете, как использовать Gradle для публикации Java-пакетов в реестр в рамках вашего рабочего процесса непрерывной интеграции (CI).

## Введение

В этом руководстве показано, как создать рабочий процесс, который публикует пакеты Java в GitHub Packages и центральном репозитории Maven. С помощью одного рабочего процесса можно публиковать пакеты в одном репозитории или в нескольких.

> \[!WARNING] Примеры, используемые в этом руководстве, ссылаются на устаревшую службу OSSRH. См [. статью "Публикация](https://central.sonatype.org/faq/what-is-different-between-central-portal-and-legacy-ossrh/#publishing) " в документации по Центральному репозиторию Maven.

## Необходимые компоненты

Рекомендуется иметь базовое представление о файлах рабочих процессов и параметрах конфигурации. Дополнительные сведения см. в разделе [Написание рабочих процессов](/ru/enterprise-server@3.22/actions/how-tos/write-workflows).

Для получения дополнительной информации о создании CI-рабочего процесса для вашего Java проекта с Gradle смотрите [Создание и тестирование Java с помощью Gradle](/ru/enterprise-server@3.22/actions/tutorials/build-and-test-code/java-with-gradle).

Также могут быть полезны базовые знания в следующих областях:

* [Работа с реестром Apache Maven](/ru/enterprise-server@3.22/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry)
* [Хранение сведений в переменных](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables)
* [Использование секретов в GitHub Actions](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)
* [Использование GITHUB\_TOKEN для проверки подлинности в рабочих процессах](/ru/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token)

## Сведения о конфигурации пакета

Поля `groupId` и `artifactId` в разделе `MavenPublication` файла *build.gradle* создают уникальный идентификатор пакета, используемый реестрами для связывания пакета с реестром. Они аналогичный полям `groupId` и `artifactId` файла Maven *pom.xml*. Дополнительные сведения см. в статье "Подключаемый [модуль](https://docs.gradle.org/current/userguide/publishing_maven.html) публикации Maven" в документации по Gradle.

Файл *build.gradle* также содержит конфигурацию для репозиториев управления дистрибутивами, в которые Gradle будет публиковать пакеты. Каждый репозиторий должен иметь имя, URL-адрес развертывания и учетные данные для проверки подлинности.

## Публикация пакетов в центральный репозиторий Maven

При каждом создании выпуска можно активировать рабочий процесс для публикации пакета. Рабочий процесс в приведенном ниже примере выполняется при активации события `release` с типом `created`. Если тесты CI проходят успешно, рабочий процесс публикует пакет в центральный репозитории Maven. Дополнительные сведения о событии см. в `release` разделе [События, инициирующие рабочие процессы](/ru/enterprise-server@3.22/actions/reference/workflows-and-actions/events-that-trigger-workflows#release).

Вы можете определить новый репозиторий Maven в блоке публикации файла *build.gradle*, который указывает на репозиторий пакетов. Например, если развертывание в центральный репозиторий Maven выполнялось с помощью проекта размещения OSSRH, файл *build.gradle* может указывать репозиторий с именем `"OSSRH"`.

```groovy copy
plugins {
  ...
  id 'maven-publish'
}

publishing {
  ...

  repositories {
    maven {
      name = "OSSRH"
      url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
      credentials {
        username = System.getenv("MAVEN_USERNAME")
        password = System.getenv("MAVEN_PASSWORD")
      }
    }
  }
}
```

С помощью этой конфигурации можно создать рабочий процесс, который публикует пакет в центральный репозитории Maven. Для этого нужно выполнить команду `gradle publish`. На этапе развертывания необходимо задать переменные среды для имени пользователя и пароля или маркера, используемого для проверки подлинности в репозитории Maven. Дополнительные сведения см. в разделе [Использование секретов в GitHub Actions](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).

```yaml copy

# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.

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

name: Publish package to the Maven Central Repository
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Set up Java
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'

      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@017a9effdb900e5b5b2fddfb590a105619dca3c3 # v4.4.2

      - name: Publish package
        run: ./gradlew publish
        env:
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
```

Этот рабочий процесс выполняет следующие действия:

1. Извлекает копию репозитория проекта.
2. Настраивает JDK Java.
3. Настраивает среду Gradle. Действие [`gradle/actions/setup-gradle`](https://github.com/gradle/actions) заботится о состоянии кэширования между выполнением рабочего процесса и содержит подробную сводку по всем выполнениям Gradle.
4. Выполняет задачу Gradle `publish` для публикации в `OSSRH` репозитории Maven. Переменная среды `MAVEN_USERNAME` будет задана с содержимым секрета `OSSRH_USERNAME`, а переменная среды `MAVEN_PASSWORD` — с содержимым секрета `OSSRH_TOKEN`.

   Дополнительные сведения об использовании секретов в рабочем процессе см. в разделе [Использование секретов в GitHub Actions](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).

## Публикация пакетов в GitHub Packages

При каждом создании выпуска можно активировать рабочий процесс для публикации пакета. Рабочий процесс в приведенном ниже примере выполняется при активации события `release` с типом `created`. Рабочий процесс публикует пакет, если GitHub Packages тесты CI проходят. Дополнительные сведения о событии см. в `release` разделе [События, инициирующие рабочие процессы](/ru/enterprise-server@3.22/actions/reference/workflows-and-actions/events-that-trigger-workflows#release).

Вы можете определить новый репозиторий Maven в блоке публикации *сборки.gradle* , на который указывает GitHub Packages. В этой конфигурации репозитория можно также использовать переменные среды, заданные в рабочем процессе CI. Переменную среды `GITHUB_ACTOR` можно использовать в качестве имени пользователя, а переменную среды `GITHUB_TOKEN`можно задать с помощью секрета `GITHUB_TOKEN`.

Секрет `GITHUB_TOKEN` устанавливается в качестве маркера доступа для репозитория при каждом запуске задания в рабочем процессе. Необходимо задать разрешения для этого маркера доступа в файле рабочего процесса, чтобы предоставить доступ для чтения для `contents` разрешения и доступа на запись для `packages` разрешения. Дополнительные сведения см. в разделе [Использование GITHUB\_TOKEN для проверки подлинности в рабочих процессах](/ru/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token).

Например, если ваша организация называется octocat, а репозиторий называется hello-world, GitHub Packages то конфигурация в *build.gradle* будет выглядеть примерно так же, как в следующем примере.

```groovy copy
plugins {
  ...
  id 'maven-publish'
}

publishing {
  ...

  repositories {
    maven {
      name = "GitHubPackages"
      url = "https://maven.pkg.github.com/octocat/hello-world"
      credentials {
        username = System.getenv("GITHUB_ACTOR")
        password = System.getenv("GITHUB_TOKEN")
      }
    }
  }
}
```

С помощью этой конфигурации можно создать рабочий процесс, в котором публикуется пакет GitHub Packages , выполнив `gradle publish` команду.

```yaml copy

# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.

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

name: Publish package to GitHub Packages
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@017a9effdb900e5b5b2fddfb590a105619dca3c3 # v4.4.2

      - name: Publish package
        run: ./gradlew publish
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

Этот рабочий процесс выполняет следующие действия:

1. Извлекает копию репозитория проекта.
2. Настраивает JDK Java.
3. Настраивает среду Gradle. Действие [`gradle/actions/setup-gradle`](https://github.com/gradle/actions) заботится о состоянии кэширования между выполнением рабочего процесса и содержит подробную сводку по всем выполнениям Gradle.
4. Выполняет задачу Gradle `publish` для публикации GitHub Packagesв . Переменная среды `GITHUB_TOKEN` будет задана с содержимым секрета `GITHUB_TOKEN`. Ключ `permissions` указывает доступ, разрешенный секретом `GITHUB_TOKEN`.

   Дополнительные сведения об использовании секретов в рабочем процессе см. в разделе [Использование секретов в GitHub Actions](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).

## Публикация пакетов в центральном репозитории Maven и GitHub Packages

Вы можете опубликовать пакеты в центральном репозитории Maven и GitHub Packages настроить каждый из них в файле *build.gradle* .

Убедитесь, что файл *build.gradle* содержит репозиторий для GitHub репозитория и поставщика центрального репозитория Maven.

Например, при развертывании в центральный репозиторий с помощью проекта размещения OSSRH может потребоваться указать его в репозитории управления дистрибутивом — `name` должен иметь значение `OSSRH`. При развертывании GitHub Packagesв, возможно, потребуется указать его в репозитории управления распределением с заданным значением `name``GitHubPackages`.

Например, если организация называется "octocat", а репозиторий называется "hello-world", конфигурация в файле *build.gradle* будет выглядеть примерно так, как показано в следующем примере.

```groovy copy
plugins {
  ...
  id 'maven-publish'
}

publishing {
  ...

  repositories {
    maven {
      name = "OSSRH"
      url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
      credentials {
        username = System.getenv("MAVEN_USERNAME")
        password = System.getenv("MAVEN_PASSWORD")
      }
    }
    maven {
      name = "GitHubPackages"
      url = "https://maven.pkg.github.com/octocat/hello-world"
      credentials {
        username = System.getenv("GITHUB_ACTOR")
        password = System.getenv("GITHUB_TOKEN")
      }
    }
  }
}
```

С помощью этой конфигурации можно создать рабочий процесс, который публикует пакет как в центральном репозитории Maven, так и GitHub Packages с помощью `gradle publish` команды.

```yaml copy

# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.

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

name: Publish package to the Maven Central Repository and GitHub Packages
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v6
      - name: Set up Java
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@017a9effdb900e5b5b2fddfb590a105619dca3c3 # v4.4.2

      - name: Publish package
        run: ./gradlew publish
        env: 
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

Этот рабочий процесс выполняет следующие действия:

1. Извлекает копию репозитория проекта.
2. Настраивает JDK Java.
3. Настраивает среду Gradle. Действие [`gradle/actions/setup-gradle`](https://github.com/gradle/actions) заботится о состоянии кэширования между выполнением рабочего процесса и содержит подробную сводку по всем выполнениям Gradle.
4. Выполняет задачу Gradle `publish` для публикации в `OSSRH` репозитории Maven и GitHub Packages. Переменная среды `MAVEN_USERNAME` будет задана с содержимым секрета `OSSRH_USERNAME`, а переменная среды `MAVEN_PASSWORD` — с содержимым секрета `OSSRH_TOKEN`. Переменная среды `GITHUB_TOKEN` будет задана с содержимым секрета `GITHUB_TOKEN`. Ключ `permissions` указывает доступ, разрешенный секретом `GITHUB_TOKEN`.

   Дополнительные сведения об использовании секретов в рабочем процессе см. в разделе [Использование секретов в GitHub Actions](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).