Zabezpieczanie dostaw oprogramowania

1. Przegląd

Artifact Registry umożliwia przechowywanie różnych typów artefaktów, tworzenie wielu repozytoriów w jednym projekcie i przypisywanie do każdego repozytorium określonego regionu lub wielu regionów. Istnieje kilka trybów repozytorium. Każdy tryb służy do innego celu. Ten diagram pokazuje jeden z wielu możliwych sposobów używania repozytoriów w różnych trybach. Diagram przedstawia przepływ pracy w 2 projektach Google Cloud. W projekcie deweloperskim programiści tworzą aplikację w Javie. W osobnym projekcie środowiska wykonawczego inna kompilacja tworzy obraz kontenera z aplikacją do wdrożenia w Google Kubernetes Engine.

5af5e4da3ccfdff3.png

Z tego modułu nauczysz się:

  • Używanie standardowych repozytoriów do wdrażania pakietów prywatnych
  • Używanie zdalnych repozytoriów do buforowania pakietów z Maven Central
  • Używanie repozytoriów wirtualnych do łączenia wielu repozytoriów nadrzędnych w jednej konfiguracji

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Możesz ją zaktualizować w dowolnym momencie.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się nim przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle jest on oznaczony jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i będzie obowiązywać przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje też trzecia wartość, czyli numer projektu, z której korzystają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Ukończenie tego laboratorium nie powinno wiązać się z dużymi kosztami, a nawet z żadnymi. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub cały projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Konfiguracja Workspace

Konfigurowanie gcloud

W Cloud Shell ustaw identyfikator projektu i numer projektu. Zapisz je jako zmienne PROJECT_IDPROJECT_NUMBER.

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

Włącz interfejsy API

gcloud services enable artifactregistry.googleapis.com

Kopiowanie repozytorium

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

2. Standardowe repozytoria

Standardowe repozytoria umożliwiają przechowywanie pakietów prywatnych i udostępnianie ich w innych aplikacjach.

Tworzenie standardowego repozytorium Maven

Aby utworzyć repozytorium artefaktów Javy, uruchom w Cloud Shell to polecenie:

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

Jeśli pojawi się prośba o autoryzację Cloud Shell, kliknij Autoryzuj.

Otwórz konsolę Google Cloud – Artifact Registry – Repozytoria i zwróć uwagę na nowo utworzone repozytorium Maven o nazwie container-dev-java-repo. Jeśli je klikniesz, zobaczysz, że jest ono obecnie puste.

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

Powinna zwrócić odpowiedź podobną do tej:

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'

Konfigurowanie Mavena na potrzeby Artifact Registry

Uruchom to polecenie, aby wyświetlić konfigurację repozytorium do dodania do projektu w Javie:

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

Poprzednie polecenie zwraca kod XML, który należy dodać do pliku pom.xml projektu.

  • Sekcja repositories określa, skąd Maven może pobierać zdalne artefakty do użycia w bieżącym projekcie.
  • Sekcja distributionManagement określa, do którego zdalnego repozytorium projekt będzie przesyłany po wdrożeniu.
  • Sekcja extensions dodaje artifactregistry-maven-wagon, który umożliwia uwierzytelnianie i warstwę transportową potrzebną do połączenia z Artifact Registry.
  • Uwaga: rozszerzenia mogą znajdować się w plikach pom.xml lub extensions.xml. W przypadku, gdy projekt zależy od projektu nadrzędnego, zależności te są dostępne przed załadowaniem pozostałych wpisów w pliku pom.xml. Aby zapewnić rodzicowi dostęp do rozszerzenia, można je umieścić w pliku extensions.xml, który jest wczytywany przed plikiem pom.xml, dzięki czemu jest dostępny dla zależności rodzica.

Skopiuj 3 sekcje, a potem otwórz plik pom.xml w edytorze Cloud Shell i dodaj zwrócone ustawienia na końcu pliku, tuż przed zamykającym tagiem project.

Wskazówka: w Cloud Shell uruchom w terminalu to polecenie, aby otworzyć edytor w bieżącym katalogu.

cloudshell workspace .

Przykład: (nazwy projektów w Twoich adresach URL będą inne)

  ...

  <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>

Przesyłanie pakietu Java do Artifact Registry

Po skonfigurowaniu Artifact Registry w Maven możesz używać Artifact Registry do przechowywania plików JAR w języku Java, które będą wykorzystywane przez inne projekty w Twojej organizacji.

Aby przesłać pakiet Java do Artifact Registry, uruchom to polecenie:

mvn deploy -DskipTests

Jeśli chcesz ponownie uruchomić to polecenie, zwiększ wersję w pliku pom.xml.

Sprawdzanie pakietu Java w Artifact Registry

Otwórz konsolę Cloud – Artifact Registry – Repozytoria. Kliknij container-dev-java-repo i sprawdź, czy jest tam artefakt binarny hello-world:

147eac5168648db1.png

3. Zdalne repozytoria

Zdalne repozytoria umożliwiają buforowanie pakietów innych firm w celu zwiększenia niezawodności i bezpieczeństwa.

Tworzenie repozytorium zdalnego

Uwaga: szczegółowe informacje o uwierzytelnianiu i konfiguracji znajdziesz w dokumentacji produktu.

Aby utworzyć zdalne repozytorium artefaktów Maven Central, uruchom w Cloud Shell to polecenie:

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

Sprawdzanie repozytorium w konsoli

Otwórz konsolę Cloud – Artifact Registry – Repozytoria. Kliknij maven-central-cache. Zobaczysz, że repozytorium zostało utworzone i jest obecnie puste.

Sprawdź repozytorium w terminalu

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

Integrowanie repozytorium z projektem

Uruchom to polecenie, aby wyświetlić konfigurację repozytorium do dodania do projektu w Javie:

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

Dodaj sekcję repozytorium do pliku pom.xml. Nie kopiuj zewnętrznego tagu <repositories> z danych wyjściowych.

Zmień identyfikator nowo dodanego repozytorium na „central”, aby każdy wpis w repozytorium miał unikalny identyfikator.

Przykład: (nazwy projektów w Twoich adresach URL będą inne)

  ...

  <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>

Uruchom w terminalu te polecenia, aby utworzyć extensions.xml dla projektu. Aby użyć mechanizmu rozszerzeń podstawowych, upewnij się, że Maven może rozwiązywać zależności nadrzędne lub zależności wtyczek z Artifact Registry.

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

Pobieranie zależności ze zdalnego repozytorium

Aby skompilować aplikację za pomocą repozytorium zdalnego, uruchom to polecenie:

rm -rf ~/.m2/repository 
mvn compile

Sprawdzanie pakietów w konsoli

Otwórz konsolę Cloud – Artifact Registry – Repozytoria. Kliknij maven-central-cache i sprawdź, czy znajdują się tam binarne artefakty w pamięci podręcznej:

9deea93caa5fefd7.png

4. Wirtualne repozytoria

Wirtualne repozytoria działają jako interfejs umożliwiający dostęp do wielu repozytoriów za pomocą jednej konfiguracji. Upraszcza to konfigurację klienta dla użytkowników Twoich artefaktów i zwiększa bezpieczeństwo, ponieważ ogranicza ataki polegające na myleniu zależności.

Tworzenie pliku zasad

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

Tworzenie repozytorium wirtualnego

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

Integrowanie repozytorium z projektem

Uruchom to polecenie, aby wyświetlić konfigurację repozytorium do dodania do projektu w Javie:

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

Zastąp całą sekcję repozytoriów w pliku pom sekcją repozytoriów wirtualnych z danych wyjściowych.

Przykład: (nazwy projektów w Twoich adresach URL będą inne)

  ...


  <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>


Pobieranie zależności z repozytorium wirtualnego

Repozytorium wirtualne jest tylko pośrednikiem i nie przechowuje żadnych rzeczywistych pakietów. Aby wyraźnie zademonstrować ten proces, usuń utworzone wcześniej repozytorium maven-central-cache i utwórz je ponownie, aby zacząć od pustego repozytorium.

Aby ponownie utworzyć repozytorium pamięci podręcznej, uruchom te polecenia:

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

Puste repozytorium możesz sprawdzić w konsoli. Otwórz konsolę Cloud – Artifact Registry – Repozytoria.

Teraz przetestuj wirtualne repozytorium, kompilując projekt za pomocą tego polecenia:

rm -rf ~/.m2/repository 
mvn compile

Sprawdzanie pakietów w konsoli

Otwórz konsolę Cloud – Artifact Registry – Repozytoria. Kliknij maven-central-cache i sprawdź, czy artefakty binarne zostały skonfigurowane tak, aby pobierać dane z repozytorium wirtualnego, ale ostatecznie zostały pobrane z maven-central-cache:

9deea93caa5fefd7.png

5. Gratulacje!

Gratulacje! Codelab został ukończony.

Omówione zagadnienia

  • Używanie standardowych repozytoriów do wdrażania pakietów prywatnych
  • Używanie repozytoriów zdalnych do buforowania pakietów z Maven Central
  • Używanie repozytoriów wirtualnych do łączenia wielu repozytoriów nadrzędnych w jednej konfiguracji

Czyszczenie

Aby usunąć projekt, uruchom to polecenie:

gcloud projects delete ${PROJECT_ID}

Ostatnia aktualizacja: 22.03.2023