Обеспечение поставок программного обеспечения

1. Обзор

Реестр артефактов позволяет хранить различные типы артефактов, создавать несколько репозиториев в одном проекте и связывать определенный регион или несколько регионов с каждым репозиторием. Существует несколько режимов хранилища. Каждый режим служит своей цели. На следующей диаграмме показан один из многих возможных способов совместного использования репозиториев в разных режимах. На диаграмме показан рабочий процесс в двух проектах Google Cloud. В проекте разработки разработчики создают приложение Java. В отдельном проекте среды выполнения другая сборка создает образ контейнера с приложением для развертывания в Google Kubernetes Engine.

5af5e4da3ccfdff3.png

В ходе этой лабораторной работы вы научитесь выполнять следующие задачи.

  • Используйте стандартные репозитории для развертывания ваших частных пакетов.
  • Используйте удаленные репозитории для кэширования центральных пакетов maven.
  • Используйте виртуальные репозитории для объединения нескольких исходящих репозиториев в одной конфигурации.

Самостоятельная настройка среды

  1. Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google. Вы можете обновить его в любое время.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (невозможно изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно он обозначается как PROJECT_ID ). Если вам не нравится сгенерированный идентификатор, вы можете создать другой случайный идентификатор. Кроме того, вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага, и он останется в силе на протяжении всего проекта.
  • К вашему сведению, есть третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
  1. Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Чтобы отключить ресурсы и не взимать плату за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить весь проект. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

Настройка рабочего пространства

Настройка gcloud

В Cloud Shell укажите идентификатор и номер проекта. Сохраните их как переменные PROJECT_ID и PROJECT_NUMBER .

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

Включить API

gcloud services enable artifactregistry.googleapis.com

Клонировать репозиторий

git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/container-registry/container-analysis

2. Стандартные репозитории

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

Создайте стандартный репозиторий maven.

В Cloud Shell выполните следующую команду, чтобы создать репозиторий для артефактов Java:

gcloud artifacts repositories create container-dev-java-repo \
    --repository-format=maven \
    --location=us-central1 \
    --description="Java package repository for Container Dev Workshop"

Нажмите «Авторизовать», если появится запрос на авторизацию Cloud Shell.

Перейдите в Google Cloud Console — Реестр артефактов — Репозитории и обратите внимание на только что созданный репозиторий Maven с container-dev-java-repo . Если вы нажмете на него, вы увидите, что в данный момент он пуст.

gcloud artifacts repositories describe container-dev-java-repo \
    --location=us-central1

Должен вернуть ответ, подобный следующему

Encryption: Google-managed key
Repository Size: 0.000MB
createTime: '2023-03-21T19:01:45.461589Z'
description: Java package repository for Container Dev Workshop
format: MAVEN
mavenConfig: {}
mode: STANDARD_REPOSITORY
name: projects/qwiklabs-gcp-03-4304110dc461/locations/us-central1/repositories/container-dev-java-repo
updateTime: '2023-03-21T19:01:45.461589Z'

Настройка Maven для реестра артефактов

Запустите следующую команду, чтобы распечатать конфигурацию репозитория и добавить ее в проект Java:

gcloud artifacts print-settings mvn \
    --repository=container-dev-java-repo \
    --location=us-central1

Предыдущая команда возвращает XML для добавления в ваш проект pom.xml.

  • Раздел репозиториев указывает, где Maven может загружать удаленные артефакты для использования в текущем проекте.
  • В разделе DistributionManagement указывается, в какой удаленный репозиторий проект будет отправлен при развертывании.
  • В раздел расширений добавляется artifactregistry-maven-wagon, который включает уровень аутентификации и транспорта, необходимый для подключения к реестру артефактов.
  • Примечание. Расширения могут существовать в файлах pom.xml или Extensions.xml. В тех случаях, когда проект зависит от родительского проекта, доступ к этим зависимостям осуществляется до загрузки остальных записей в pom.xml. Чтобы гарантировать, что родительский элемент имеет доступ к расширению, его можно поместить в файл Extensions.xml, который загружается перед pom.xml, что делает его доступным для родительских зависимостей.

Скопируйте три раздела, затем откройте pom.xml в редакторе Cloud Shell и добавьте возвращенные настройки в конец файла, внутри закрывающего тега project .

Совет: В CloudShell выполните следующую команду в терминале, чтобы открыть редактор в текущем каталоге.

cloudshell workspace .

Пример: (названия ваших проектов в URL-адресах будут отличаться)

  ...

  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

  <repositories>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>

  <build>
    <extensions>
      <extension>
        <groupId>com.google.cloud.artifactregistry</groupId>
        <artifactId>artifactregistry-maven-wagon</artifactId>
        <version>2.2.0</version>
      </extension>
    </extensions>
  </build>

</project>

Загрузите свой пакет Java в реестр артефактов.

Настроив реестр артефактов в Maven, вы теперь можете использовать реестр артефактов для хранения файлов JAR Java для использования другими проектами в вашей организации.

Выполните следующую команду, чтобы загрузить пакет Java в реестр артефактов:

mvn deploy -DskipTests

Если вы хотите запустить эту команду еще раз, обязательно увеличьте версию в pom.xml.

Проверьте пакет Java в реестре артефактов.

Перейдите в Cloud Console — Реестр артефактов — Репозитории. Щелкните container-dev-java-repo и проверьте наличие двоичного артефакта hello-world :

147eac5168648db1.png

3. Удаленные репозитории

Удаленные репозитории предоставляют возможность кэшировать сторонние пакеты для повышения надежности и безопасности.

Создать удаленный репозиторий

Примечание. Подробную информацию об аутентификации и настройке см. в документации по продукту.

В Cloud Shell выполните следующую команду, чтобы создать удаленный репозиторий для артефактов Maven Central:

gcloud artifacts repositories create maven-central-cache \
    --project=$PROJECT_ID \
    --repository-format=maven \
    --location=us-central1 \
    --description="Remote repository for Maven Central caching" \
    --mode=remote-repository \
    --remote-repo-config-desc="Maven Central" \
    --remote-mvn-repo=MAVEN-CENTRAL

Просмотрите репозиторий в консоли

Перейдите в Cloud Console — Реестр артефактов — Репозитории. Щелкните maven-central-cache и обратите внимание, что он создан и в настоящее время пуст.

Просмотрите репо в терминале

gcloud artifacts repositories describe maven-central-cache \
    --location=us-central1

Интегрируйте репозиторий в свой проект

Запустите следующую команду, чтобы распечатать конфигурацию репозитория и добавить ее в проект Java:

gcloud artifacts print-settings mvn \
    --repository=maven-central-cache \
    --location=us-central1

Добавьте раздел репозитория в ваш pom.xml. Обязательно не копируйте внешний тег <repositories> из вывода.

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

Пример: (названия ваших проектов в URL-адресах будут отличаться)

  ...

  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

  <repositories>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>

    <repository>
      <id>central</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/maven-central-cache</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>


  </repositories>

  <build>
    <extensions>
      <extension>
        <groupId>com.google.cloud.artifactregistry</groupId>
        <artifactId>artifactregistry-maven-wagon</artifactId>
        <version>2.2.0</version>
      </extension>
    </extensions>
  </build>

</project>

Выполните следующие команды в своем терминале, чтобы создать файл extensions.xml для вашего проекта. Чтобы использовать основной механизм расширений , гарантирующий, что Maven может разрешать родительские зависимости или зависимости плагинов из реестра артефактов.

mkdir .mvn 
cat > .mvn/extensions.xml << EOF
<extensions xmlns="http://maven.apache.org/EXTENSIONS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/EXTENSIONS/1.0.0 http://maven.apache.org/xsd/core-extensions-1.0.0.xsd">
  <extension>
    <groupId>com.google.cloud.artifactregistry</groupId>
    <artifactId>artifactregistry-maven-wagon</artifactId>
    <version>2.2.0</version>
  </extension>
</extensions>
EOF

Извлечь зависимости из удаленного репозитория

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

rm -rf ~/.m2/repository 
mvn compile

Просмотрите пакеты в консоли

Перейдите в Cloud Console — Реестр артефактов — Репозитории. Щелкните maven-central-cache и проверьте, кэшированы ли там двоичные артефакты:

9deea93caa5fefd7.png

4. Виртуальные репозитории

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

Создать файл политики

cat > ./policy.json << EOF
[
  {
    "id": "private",
    "repository": "projects/${PROJECT_ID}/locations/us-central1/repositories/container-dev-java-repo",
    "priority": 100
  },
  {
    "id": "central",
    "repository": "projects/${PROJECT_ID}/locations/us-central1/repositories/maven-central-cache",
    "priority": 80
  }
]

EOF

Создайте виртуальный репозиторий

gcloud artifacts repositories create virtual-maven-repo \
    --project=${PROJECT_ID} \
    --repository-format=maven \
    --mode=virtual-repository \
    --location=us-central1 \
    --description="Virtual Maven Repo" \
    --upstream-policy-file=./policy.json

Интегрируйте репозиторий в свой проект

Запустите следующую команду, чтобы распечатать конфигурацию репозитория и добавить ее в проект Java:

gcloud artifacts print-settings mvn \
    --repository=virtual-maven-repo \
    --location=us-central1

Замените весь раздел репозиториев в вашем pom одним разделом виртуальных репозиториев из вывода.

Пример: (названия ваших проектов в URL-адресах будут отличаться)

  ...


  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

  <repositories>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/virtual-maven-repo</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>

  <build>
    <extensions>
      <extension>
        <groupId>com.google.cloud.artifactregistry</groupId>
        <artifactId>artifactregistry-maven-wagon</artifactId>
        <version>2.2.0</version>
      </extension>
    </extensions>
  </build>

</project>


Извлечь зависимости из виртуального репозитория

Поскольку виртуальный репозиторий является сквозным и не будет хранить никаких реальных пакетов, чтобы наглядно продемонстрировать процесс, вы удалите репозиторий maven-central-cache, который вы создали ранее, и создадите его заново, чтобы начать заново с пустым репозиторием.

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

gcloud artifacts repositories delete maven-central-cache \
    --project=$PROJECT_ID \
    --location=us-central1 \
    --quiet

gcloud artifacts repositories create maven-central-cache \
    --project=$PROJECT_ID \
    --repository-format=maven \
    --location=us-central1 \
    --description="Remote repository for Maven Central caching" \
    --mode=remote-repository \
    --remote-repo-config-desc="Maven Central" \
    --remote-mvn-repo=MAVEN-CENTRAL

Вы можете просмотреть пустой репозиторий в консоли. Перейдите в Cloud Console — Реестр артефактов — Хранилища.

Теперь воспользуемся виртуальным репозиторием, создав свой проект с помощью следующей команды:

rm -rf ~/.m2/repository 
mvn compile

Просмотрите пакеты в консоли

Перейдите в Cloud Console — Реестр артефактов — Репозитории. Щелкните maven-central-cache и убедитесь, что двоичные артефакты были настроены для извлечения из виртуального репозитория, но в конечном итоге были извлечены из maven-central-cache :

9deea93caa5fefd7.png

5. Поздравляем!

Поздравляем, вы завершили работу над кодом!

Что вы рассмотрели

  • Используемые стандартные репозитории для развертывания ваших частных пакетов.
  • Использовались удаленные репозитории для кэширования центральных пакетов maven.
  • Использовались виртуальные репозитории для объединения нескольких исходящих репозиториев в одной конфигурации.

Очистка

Запустите следующую команду, чтобы удалить проект

gcloud projects delete ${PROJECT_ID}

Последнее обновление: 22.03.23.