Zabezpieczenia dostarczania oprogramowania

1. Omówienie

Artifact Registry umożliwia przechowywanie różnych typów artefaktów, tworzenie wielu repozytoriów w jednym projekcie oraz powiązanie określonego regionu lub wielu regionów z każdym repozytorium. Istnieje kilka trybów repozytorium. Każdy tryb służy do innych celów. Poniższy diagram przedstawia jeden z wielu możliwych sposobów jednoczesnego korzystania z repozytoriów w różnych trybach. Diagram przedstawia przepływ pracy w 2 projektach Google Cloud. W projekcie programistycznym programiści tworzą aplikację w Javie. W osobnym projekcie środowiska wykonawczego inna kompilacja tworzy obraz kontenera z aplikacją w celu wdrożenia w Google Kubernetes Engine.

5af5e4da3ccfdff3.png

W tym module nauczysz się wykonywać poniższe zadania.

  • Użyj standardowych repozytoriów do wdrażania pakietów prywatnych
  • Używaj zdalnych repozytoriów do buforowania centralnych pakietów Maven
  • Użyj wirtualnych repozytoriów, aby połączyć kilka repozytoriów nadrzędnych w jednej konfiguracji

Samodzielne konfigurowanie środowiska

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. To ciąg znaków, który nie jest używany przez interfejsy API Google. W każdej chwili możesz ją zmienić.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić (po jego ustawieniu nie można go zmienić). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń z programowania konieczne jest odwołanie się do identyfikatora projektu (zwykle nazywa się on PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy. Możesz też spróbować własnych sił i sprawdzić, czy jest dostępna. Potem nie będzie można go zmienić. Pozostanie ono przez czas trwania projektu.
  • Dostępna jest trzecia wartość, numer projektu, z którego korzystają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Ukończenie tego ćwiczenia z programowania nie powinno kosztować zbyt wiele. Aby wyłączyć zasoby, aby nie naliczać opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub cały projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Konfiguracja Workspace

Konfigurowanie gcloud

W Cloud Shell ustaw identyfikator i numer projektu. Zapisz je jako zmienne PROJECT_ID i PROJECT_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 prywatnych pakietów i udostępnianie ich w innych aplikacjach.

Utwórz standardowe repozytorium Maven

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

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 Google Cloud Console – Artifact Registry – Repozytoria i zwróć uwagę na nowo utworzone repozytorium Maven o nazwie container-dev-java-repo. Jeśli je klikniesz, zobaczysz, że w tej chwili jest 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 Maven dla Artifact Registry

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

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.

  • Sekcja repozytoriów określa, gdzie Maven może pobrać zdalne artefakty do wykorzystania w bieżącym projekcie.
  • Sekcja distributionManagement określa, do którego repozytorium zdalnego projekt zostanie wypchnięty po wdrożeniu.
  • Sekcja Rozszerzenia umożliwia dodanie elementu Artifact Registry-maven-wagon, który włącza warstwę uwierzytelniania i transportu niezbędną do łączenia się z Artifact Registry.
  • Uwaga: rozszerzenia mogą występować w plikach pom.xml lub extensions.xml. W sytuacjach, gdy projekt zależy od projektu nadrzędnego, dostęp do tych zależności uzyskuje się przed wczytaniem pozostałych wpisów w pliku pom.xml. Aby zapewnić, że element nadrzędny ma dostęp do rozszerzenia, możesz go umieścić w pliku extensions.xml, który zostanie wczytany przed plikiem pom.xml, co zapewni jego dostępność dla zależności nadrzędnych.

Skopiuj te 3 sekcje, a następnie otwórz plik pom.xml w edytorze Cloud Shell i dodaj zwrócone ustawienia u dołu pliku, bezpośrednio w zamykającym tagu project.

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

cloudshell workspace .

Przykład: (nazwy projektów będą inne 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 Javy do Artifact Registry

Po skonfigurowaniu Artifact Registry w Maven możesz używać Artifact Registry do przechowywania plików jar w Javie na potrzeby innych projektów w organizacji.

Uruchom to polecenie, aby przesłać pakiet Javy do Artifact Registry:

mvn deploy -DskipTests

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

Sprawdzanie pakietu Javy w Artifact Registry

Otwórz Cloud Console – Artifact Registry – Repozytoria. Kliknij container-dev-java-repo i sprawdź, czy znajduje się 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 konfigurowaniu znajdziesz w dokumentacji usługi.

W Cloud Shell uruchom to polecenie, aby utworzyć zdalne repozytorium artefaktów 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

Sprawdź repozytorium w konsoli

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

Sprawdź repozytorium w terminalu

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

Zintegruj repozytorium z projektem

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

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

Dodaj sekcję repozytorium do pliku pom.xml. Nie kopiuj zewnętrznych <repositories> tagu wyjściowego.

Zmień identyfikator nowo dodanego repozytorium na „central” aby zapewnić, że każdy wpis repozytorium ma unikalny identyfikator.

Przykład: (nazwy projektów będą inne 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>

Aby utworzyć extensions.xml dla projektu, uruchom następujące polecenia w terminalu. Aby użyć mechanizmu rozszerzeń podstawowych, który pozwoli Maven rozpoznać zależności elementów nadrzędnych i 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

Uruchom następujące polecenie, aby skompilować aplikację przy użyciu zdalnego repozytorium:

rm -rf ~/.m2/repository 
mvn compile

Przejrzyj pakiety w konsoli

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

9deea93caa5fefd7.png

4. Repozytoria wirtualne

Wirtualne repozytoria działają jak interfejs do wielu repozytoriów, do których można uzyskać dostęp w ramach jednej konfiguracji. Upraszcza to konfigurację klienta dla konsumentów artefaktów i zwiększa bezpieczeństwo przez łagodzenie ataków polegających na dezorientowaniu użytkowników w zależności.

Utwórz plik 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

Zintegruj repozytorium z projektem

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

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

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

Przykład: (nazwy projektów będą inne 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

Repozytorium wirtualne jest procesem przejściowym i nie będzie zawierać żadnych rzeczywistych pakietów, dlatego aby przedstawić dokładnie ten proces, usuń utworzone wcześniej repozytorium maven-central-cache i utwórz je ponownie, zaczynając od pustego repozytorium.

Uruchom następujące polecenia, aby odtworzyć repozytorium pamięci podręcznej

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 Cloud Console – Artifact Registry – Repozytoria.

Teraz wykonaj ćwiczenia z wirtualnym repozytorium, tworząc swój projekt za pomocą tego polecenia

rm -rf ~/.m2/repository 
mvn compile

Przejrzyj pakiety w konsoli

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

9deea93caa5fefd7.png

5. Gratulacje!

Gratulacje. Udało Ci się ukończyć ćwiczenia z programowania.

Co zostało omówione

  • Użycie standardowych repozytoriów do wdrażania pakietów prywatnych
  • Użycie zdalnych repozytoriów do buforowania centralnych pakietów Maven
  • Wykorzystanie wirtualnych repozytoriów do połą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 r.