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

1. Обзор

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

5af5e4da3ccfdff3.png

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

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

Настройка среды для самостоятельного обучения

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы можете изменить её в любое время.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор проекта (обычно он обозначается как PROJECT_ID ). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он останется неизменным на протяжении всего проекта.
  • К вашему сведению, существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
  1. Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить весь проект. Новые пользователи 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 — Реестр артефактов — Репозитории и обратите внимание на свой недавно созданный репозиторий 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-пакет в реестр артефактов.

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

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

mvn deploy -DskipTests

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

Проверьте наличие пакета Java в реестре артефактов.

Перейдите в Cloud Console - Artifact Registry - Repositorys. Щелкните по 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 - Artifact Registry - Repositorys. Щелкните по 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

Добавьте раздел `repository` в ваш файл `pom.xml`. Убедитесь, что вы не копируете внешний тег `<repositories>` из выходного файла.

Измените идентификатор (ID) нового добавленного репозитория на "central", чтобы каждая запись в репозитории имела уникальный идентификатор.

Пример: (названия ваших проектов в 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 - Artifact Registry - Repositorys. Щелкните по 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

Замените весь раздел repositories в вашем pom-файле на единственный раздел virtual 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/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 - Artifact Registry - Repositorys.

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

rm -rf ~/.m2/repository 
mvn compile

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

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

9deea93caa5fefd7.png

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

Поздравляем, вы завершили практическое занятие!

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

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

Уборка

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

gcloud projects delete ${PROJECT_ID}

Последнее обновление: 22.03.2023