Zabezpieczanie dostaw oprogramowania

1. Omówienie

Umożliwia ona przechowywanie różnych typów artefaktów, tworzenie wielu repozytoriów w ramach jednego projektu oraz łączenie każdego repozytorium z konkretnym regionem lub wieloma regionami. Istnieje kilka trybów repozytorium. Każdy tryb służy do innego celu. Na diagramie poniżej przedstawiono jeden z wielu możliwych sposobów łącznego używania repozytoriów w różnych trybach. Diagram przedstawia przepływ pracy w 2 projektach Google Cloud. W projekcie programistycznym deweloperzy tworzą aplikację w Javie. W osobnym projekcie środowiska uruchomieniowego inna kompilacja tworzy obraz kontenera z aplikacją, który ma zostać wdrożony w Google Kubernetes Engine.

5af5e4da3ccfdff3.png

Z tego modułu dowiesz się, jak wykonać te czynności.

  • Wdrażanie prywatnych pakietów za pomocą standardowych repozytoriów
  • Używanie repozytoriów zdalnych do buforowania pakietów Maven Central
  • Korzystanie z repozytoriów wirtualnych do łączenia wielu repozytoriów nadrzędnych w jednej konfiguracji

Konfigurowanie środowiska we własnym tempie

  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órego nie używają interfejsy API Google. Możesz ją zaktualizować w dowolnym momencie.
  • Identyfikator projektu jest niepowtarzalny w ramach wszystkich projektów Google Cloud i nie można go zmienić (po ustawieniu). Cloud Console automatycznie generuje unikalny ciąg znaków. Zwykle nie ma znaczenia, jaki to ciąg. W większości laboratoriów z kodem musisz odwoływać się do identyfikatora projektu (zazwyczaj jest to PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować inny losowy. Możesz też spróbować użyć własnego adresu i sprawdzić, czy jest on dostępny. Po tym kroku nie można go zmienić. Pozostanie ona niezmieniona przez cały czas trwania projektu.
  • Informacyjnie: istnieje jeszcze 3 wartość, numer projektu, którego używają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć rozliczenia w konsoli Cloud, aby korzystać z zasobów i interfejsów API Cloud. Przejście przez ten Codelab nie powinno wiązać się z wielkimi kosztami, jeśli w ogóle będą jakieś. Aby wyłączyć zasoby, aby nie generować opłat po zakończeniu 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 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

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

Tworzenie standardowego repozytorium Maven

Aby utworzyć repozytorium dla artefaktów Java, 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ę monit o autoryzację Cloud Shell, kliknij Autoryzuj.

Otwórz konsolę Google Cloud – Rejestr artefaktów – Repozytoria i zwróć uwagę na nowo utworzone repozytorium Maven o nazwie container-dev-java-repo. Jeśli klikniesz je, 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 w Artifact Registry

Aby wydrukować konfigurację repozytorium, którą chcesz dodać do projektu w Javie, uruchom to polecenie:

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

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

  • W sekcji repozytoria określa się, gdzie Maven może pobierać artefakty zdalne na potrzeby bieżącego projektu.
  • Sekcja distributionManagement określa, do którego repozytorium zdalnego projekt będzie przesyłać dane podczas wdrażania.
  • Sekcja extensions dodaje artifactregistry-maven-wagon, który umożliwia warstwę uwierzytelniania i transportu potrzebną do połączenia z Artifact Registry.
  • Uwaga: rozszerzenia mogą znajdować się w pliku pom.xml lub extensions.xml. W przypadku, gdy projekt jest zależny od projektu nadrzędnego, dostęp do tych zależności jest uzyskiwany przed załadowaniem pozostałych wpisów w pliku pom.xml. Aby mieć pewność, że element nadrzędny ma dostęp do rozszerzenia, możesz umieścić je w pliku extensions.xml, który jest wczytywany przed plikiem pom.xml, dzięki czemu staje się ono dostępne dla elementów nadrzędnych.

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

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

cloudshell workspace .

Przykład: (nazwy projektów będą się różnić w adresach 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>

Przesyłanie pakietu Java do Artifact Registry

Po skonfigurowaniu repozytorium Artifact Registry w Maven możesz używać tego repozytorium do przechowywania plików JAR w języku Java, aby były dostępne dla innych projektów w Twojej organizacji.

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

mvn deploy -DskipTests

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

Sprawdzanie pakietu Javy w Artifact Registry

Otwórz Cloud Console – Artifact Registry – Repositories (Konsola Cloud – Artifact Registry – Repozytoria). Kliknij container-dev-java-repo i sprawdź, czy znajduje się tam binarny element hello-world:

147eac5168648db1.png

3. Repozytoria zdalne

Repozytoria zdalne 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 konfigurowaniu znajdziesz w dokumentacji usługi.

Aby utworzyć zdalne repozytorium dla 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

Kliknij Cloud Console – Artifact Registry – Repositories (Cloud Console – Artifact Registry – Repozytoria). Kliknij maven-central-cache i zauważ, że repozytorium zostało utworzone i jest obecnie puste.

Sprawdzanie repozytorium w terminalu

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

Integracja repozytorium z projektem

Aby wydrukować konfigurację repozytorium, którą chcesz dodać do projektu w Javie, uruchom to polecenie:

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 wyjścia.

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

Przykład: (nazwy projektów będą się różnić w adresach 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>

Uruchom w terminalu te polecenia, aby utworzyć extensions.xml dla projektu. Aby użyć mechanizmu rozszerzeń podstawowych, który zapewnia, że Maven może rozwiązywać zależności nadrzędne lub zależność wtyczki 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 Cloud Console – Artifact Registry – Repositories (Konsola Google Cloud – Artifact Registry – Repozytoria). Kliknij maven-central-cache i sprawdź, czy zapisane w nich artefakty binarne są w pamięci podręcznej:

9deea93caa5fefd7.png

4. Wirtualne repozytoria

Wirtualne repozytoria działają jako interfejs dla wielu repozytoriów, do których można uzyskać dostęp 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 wprowadzaniu zamieszania w zależnościach.

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

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

Integracja repozytorium z projektem

Aby wydrukować konfigurację repozytorium, którą chcesz dodać do projektu w Javie, uruchom to polecenie:

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

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

Przykład: (nazwy projektów będą się różnić w adresach 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>


Pobieranie zależności z wirtualnego repozytorium

Ponieważ repozytorium wirtualne jest repozytorium przelotnym i nie będzie przechowywać żadnych rzeczywistych pakietów, aby wyraźnie zademonstrować proces, usuń utworzone wcześniej repozytorium maven-central-cache i utwórz je ponownie, aby rozpocząć 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

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

Teraz użyj repozytorium wirtualnego, kompilując projekt za pomocą tego polecenia:

rm -rf ~/.m2/repository 
mvn compile

Sprawdzanie pakietów w konsoli

Otwórz Cloud Console – Artifact Registry – Repositories (Konsola Cloud – Artifact Registry – Repozytoria). Kliknij maven-central-cache i sprawdź, czy binarne artefakty zostały skonfigurowane do pobrania z repozytorium wirtualnego, ale zostały ostatecznie pobrane z repozytorium maven-central-cache:

9deea93caa5fefd7.png

5. Gratulacje!

Gratulacje! Masz ukończoną tę lekcję.

Omówione zagadnienia

  • Używanie standardowych repozytoriów do wdrażania prywatnych pakietów
  • Używanie repozytoriów zdalnych do buforowania pakietów Maven Central
  • Używanie wirtualnych repozytoriów 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.23