Опубликуйте свою библиотеку Android или JVM через пакеты GitHub и действия GitHub.

GitHub, вероятно, является самым известным сервисом для размещения репозиториев Git.

Хотя многие проекты общедоступны и публикуются под лицензией с открытым исходным кодом, такой как Apache-2.0, организации или даже отдельные лица могут захотеть сохранить свой код в тайне, но при этом иметь возможность легко включать свою кодовую базу в другие частные проекты.

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

Шаг 1. Создайте репозиторий GitHub для своей библиотеки.

Поскольку мы будем использовать GitHub Actions и GitHub Packages, для продолжения необходимо разместить свой репозиторий на GitHub.

Действия GitHub — это связанные задачи, которые можно включать и объединять в так называемые «рабочие процессы». Рабочий процесс можно использовать для создания непрерывной интеграции (CI) и непрерывного развертывания (CD). Это автоматизированный процесс, который можно запускать либо вручную, либо на основе настраиваемых триггеров. как git push на определенную ветку.

Пакеты GitHub, с другой стороны, — это служба размещения пакетов, например, Центральный репозиторий Maven. Это позволяет нам размещать нашу библиотеку, чтобы другие люди могли загружать их в свои проекты.

Хотя репозитории Maven Central, как правило, общедоступны, вам потребуется предоставить учетные данные для аутентификации, чтобы загрузить и установить библиотеку из пакетов GitHub.

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

1.1 Создайте новый общедоступный репозиторий

Если у вас его еще нет, первым шагом будет создание нового частного репозитория GitHub.

Конечно, содержание этой статьи также работает для общедоступного репозитория GitHub.

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

1.2.1 Предоставление разрешения рабочим процессам GitHub

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

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

Чтобы получить доступ к этим настройкам, перейдите на вкладку Настройки репозитория → Действия → Общие, а затем прокрутите страницу до самого низа.

Вы можете взглянуть на рисунок ниже для визуализации этого шага.

Шаг 2. Настройте библиотеку для публикации

Для публикации проекта через Gradle мы используем плагин maven-publish. Включите его в свой build.gradle, добавив в блок plugins.

Отличный

plugins {
  ..
  id("maven-publish")
}

Котлин DSL

plugins {
  ..
  `maven-publish`
}

Далее нам нужно определить репозиторий пакетов или службу, в которую мы хотим выполнить развертывание. Поскольку мы хотим опубликовать наш пакет в GitHub Packages нашего репозитория, нам нужно определить соответствующий URL-адрес со схемой https://maven.pkg.github.com/YOUR_GITHUB_USERNAME/YOUR_REPOSITORY_NAME.

Отличный:

publishing {
    repositories {
        maven {
            name = "GitHubPackages"
            // Note that your GitHub username should be in lowercase.
            url = uri("https://maven.pkg.github.com/YOUR_GITHUB_USERNAME/YOUR_REPOSITORY_NAME")
            credentials {
                username = System.getenv("GITHUB_ACTOR")
                password = System.getenv("GITHUB_TOKEN")
            }
        }
    }
    ..
}

Kotlin DSL:

publishing {
    repositories {
        // Note that your GitHub username should be in lowercase.
        maven("https://maven.pkg.github.com/YOUR_GITHUB_USERNAME/YOUR_REPOSITORY_NAME") {
            name = "GitHubPackages"
            credentials {
                username = System.getenv("GITHUB_ACTOR")
                password = System.getenv("GITHUB_TOKEN")
            }
        }
    }
    ..
}

Далее нам нужно добавить некоторую информацию для нашего пакета. Мы можем сделать это внутри блока publishing, добавив блок publications.

Взгляните на следующее для примера:

Отличный:

publishing {
    ..
    publications {
        gpr(MavenPublication) {
            groupId = "com.yourgroupid"
            artifactId = "yourArtifactId"
            version = "1.0.0"

            from(components.java)
    }
}

Kotlin DSL:

publishing {
    ..
    publications {
        register<MavenPublication>("gpr") {
            groupId = "com.yourgroupid"
            artifactId = "yourArtifactId"
            version = "1.0.0"

            from(components["java"])
    }
}

Шаг 3. Настройте рабочий процесс публикации GitHub

Чтобы автоматизировать процесс публикации новой версии библиотеки, мы используем GitHub Actions.

Целью рабочего процесса является автоматическое выполнение задачи publish gradle, которую мы создали на предыдущем шаге, как только мы опубликуем новый выпуск нашей библиотеки в нашем репозитории GitHub.

Мы можем создать последовательность действий GitHub в форме рабочего процесса GitHub. Чтобы создать этот рабочий процесс для нашего репозитория, создайте новый файл в своем репозитории со следующей структурой папок: .github/workflows/publish-library-workflow.yml.

Полный фрагмент рабочего процесса для publish-library-workflow.yml, который позволяет публиковать библиотеку JVM/Android через Gradle, можно взять из приведенного ниже фрагмента:

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@v3
      - uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'adopt'
      - name: Validate Gradle wrapper
        uses: gradle/wrapper-validation-action@e6e38bacfdf1a337459f332974bb2327a31aaf4b
      - name: Publish package
        uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
        with:
          arguments: publish
        env:
          GITHUB_ACTOR: ${{ secrets.GITHUB_ACTOR }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Давайте быстро обсудим, что делает этот фрагмент:

  • on.release.types: [created]: Рабочий процесс запускается, как только публикуется новая версия нашего репозитория GitHub.
  • - uses: actions/checkout@v3: Проверяем текущее состояние нашего репозитория
  • - uses: actions/checkout@v3: Мы настроили среду Java с версией 17 JDK.
  • - uses: gradle/wrapper-validation-action: проверяет, что оболочка gradle является исполняемой.
  • - uses: gradle/gradle-build-actions: Позволяет нам выполнить задачу Gradle из нашего извлеченного проекта репозитория. with.arguments: publish выполнил задание publish gradle.

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

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

Оба секрета автоматически доступны для рабочих процессов GitHub как секреты GitHub, но мы должны явно указать их как переменные среды, чтобы наш процесс Gradle мог получить к ним доступ.

Шаг 4: Опубликуйте свою библиотеку

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

На рисунке ниже показано, как можно опубликовать новую версию библиотеки.

После того, как вы нажали «Опубликовать», рабочий процесс будет запущен. Если вы перейдете на вкладку Действия, вы увидите, что запущен наш ранее созданный рабочий процесс публикации.

Шаг 5. Используйте опубликованную библиотеку в проекте

В следующем разделе мы увидим, как мы можем использовать нашу опубликованную библиотеку в другом проекте Gradle.

5.1 Настройка токена личного доступа GitHub

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

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

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

На этой странице вы должны установить несколько конфигураций:

  • Примечание. Введите некоторую информацию о назначении этого ключа. В нашем случае он понадобится нам для загрузки новых версий нашей библиотеки из GitHub Packages.
  • Срок действия — определяет, как долго будет действовать ваш токен. По истечении срока действия вам нужно будет сгенерировать новый токен.
  • Выбранные области — здесь мы определяем, на что способен наш токен. Для загрузки пакетов GitHub убедитесь, что у вас активировано как минимум read:packages. Для получения дополнительной информации об областях и их возможностях ознакомьтесь с официальной документацией.

5.2 Включить библиотеку в проект

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

Мы не хотим предоставлять свои учетные данные непосредственно в нашем build.gradle, а либо получаем их из переменных среды, которые вы устанавливаете в своей ОС, либо предоставляя учетные данные через файл gradle.properties.

Для изменения свойств создайте новый файл gradle.properties в корневой папке проекта и добавьте следующие две переменные:

gpr.user=yourGitHubUsername
gpr.key=thePersonalAccessTokenWeCreatedInSection5.1

В приведенных ниже примерах показано, как добавить репозиторий пакетов GitHub в блок репозиториев сборки Gradle. Обратите внимание, как мы используем здесь переменные из файла gradle.properties или переменные окружения USERNAME и TOKEN соответственно, если Gradle не может найти переменную properties.

Примечание. Убедитесь, что вы не загружаете этот файл в GitHub. Вы должны добавить файл напрямую в свой .gitignore, чтобы случайно не опубликовать его.

Отличный

repositories {
    maven {
        url = uri("https://maven.pkg.github.com/YOUR_GITHUB_USERNAME/YOUR_REPOSITORY_NAME")
        credentials {
            username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
            password = project.findProperty("gpr.key") ?: System.getenv("TOKEN")
        }
    }
}

Котлин-DSL

repositories {
    maven {
        url = uri("https://maven.pkg.github.com/YOUR_GITHUB_USERNAME/YOUR_REPOSITORY_NAME")
        credentials {
            username = project.findProperty("gpr.user") as String? ?: System.getenv("USERNAME")
            password = project.findProperty("gpr.key") as String? ?: System.getenv("TOKEN")
        }
    }
}

Теперь, когда у нас есть репозиторий, осталось добавить зависимость к блоку dependencies, как вы обычно делаете это с любой другой библиотекой.

Отличный

dependencies {
  ..
  implementation "com.yourgroupid:yourartifactid:1.0.0"
}

Котлин DSL

dependencies {
  ..
  implementation("com.yourgroupid:yourartifactid:1.0.0")
}

Теперь, после синхронизации файлов Gradle, вы сможете получить доступ к своей библиотеке.

Заключение

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

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

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

Однако основным недостатком этого подхода является то, что вам нужно не только напрямую указать URL-адрес пакетов GitHub, но и сохранить учетные данные для доступа к нему.

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

Надеюсь, у вас есть какие-то выводы, аплодируйте, если вам понравилась моя статья, не забудьте подписаться на уведомления по электронной почте и следите за новостями!





Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу