1. 總覽
Artifact Registry 是由 Container Registry 演進而來,可讓貴機構集中管理容器映像檔和語言套件 (例如 Maven 和 npm)。這項服務與 Google Cloud 的工具和執行階段完全整合,並支援以語言為基礎的依附元件管理功能,可搭配 npm 和 Maven 等工具使用。因此可輕鬆與持續整合/持續推送軟體更新工具整合,設定自動化管道。
本實驗室將逐步介紹 Artifact Registry 中的部分功能。
學習目標
本實驗室的學習目標為何?
- 建立容器和語言套件的存放區
- 使用 Artifact Registry 管理容器映像檔
- 將 Artifact Registry 與 Cloud Code 整合
- 設定 Maven 使用 Artifact Registry 的 Java 依附元件
2. 設定和需求
自學環境設定
- 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請務必建立帳戶。
- 「Project name」是這個專案參與者的顯示名稱。這是 Google API 不會使用的字元字串,您隨時可以更新。
- 專案 ID 在所有 Google Cloud 專案中不得重複,且無法變更 (設定後即無法變更)。Cloud 控制台會自動產生專屬字串,您通常不需要特別留意。在大多數程式碼研究室中,您需要參照專案 ID (通常會以
PROJECT_ID
表示),因此如果不喜歡這個 ID,可以產生另一個隨機 ID,也可以嘗試使用自己的 ID,看看是否可用。然後在專案建立後「凍結」。 - 第三個值是專案編號,部分 API 會使用這個值。如要進一步瞭解這三個值,請參閱說明文件。
- 接著,您需要在 Cloud 控制台中啟用帳單功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,避免產生教學課程以外的帳單費用,請按照程式碼研究室結尾的「清除」操作說明進行。Google Cloud 新使用者可享有 $300 美元的免費試用期。
設定 gcloud
在 Cloud Shell 設定專案 ID 和專案編號,將其儲存為 PROJECT_ID
和 PROJECT_NUMBER
變數。
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
啟用 Google 服務
gcloud services enable \
cloudresourcemanager.googleapis.com \
container.googleapis.com \
artifactregistry.googleapis.com \
containerregistry.googleapis.com \
containerscanning.googleapis.com
取得原始碼
本實驗室的原始碼位於 GitHub 的 GoogleCloudPlatform 組織中。請使用下列指令複製資料夾,然後變更至目錄中。
git clone https://github.com/GoogleCloudPlatform/cloud-code-samples/
佈建本研究室中使用的基礎架構
在本研究室中,您會將程式碼部署至 GKE。以下設定指令碼可協助您完成這個基礎架構的設定。
gcloud container clusters create container-dev-cluster --zone=us-central1-b
3. 使用容器映像檔
在 Artifact Registry 中建立 Docker 存放區
Artifact Registry 可用於管理容器映像檔和語言套件。不同的構件類型需要不同的規格。舉例來說,Maven 依附元件的要求與節點依附元件的要求不同。
為了支援不同的 API 規格,Artifact Registry 需要知道您希望 API 回應採用的格式。如要執行這項操作,您必須建立存放區,並傳入 --repository-format
標記,指出所需的存放區類型
在 Cloud Shell 中執行下列指令,建立 Docker 映像檔的存放區:
gcloud artifacts repositories create container-dev-repo --repository-format=docker \
--location=us-central1 --description="Docker repository for Container Dev Workshop"
如果出現 Cloud Shell 授權提示,請按一下「授權」
前往 Google Cloud 控制台 - Artifact Registry - 存放區,並注意新建立的 Docker 存放區名為 container-dev-repo
,如果您按一下,會發現目前是空的
設定 Docker 驗證以存取 Artifact Registry
連線至 Artifact Registry 時,必須提供憑證才能存取資料。您可以設定 Docker 以順暢地使用 gcloud 憑證,而無需設定個別憑證。
在 Cloud Shell 執行下列指令,將 Docker 設定為透過 Google Cloud CLI 驗證 us-central1
區域中傳送至 Artifact Registry 的要求。
gcloud auth configure-docker us-central1-docker.pkg.dev
這項指令會提示您確認是否要變更 Cloud Shell Docker 設定,請按下 Enter 鍵。
探索範例應用程式
在先前步驟中複製的 Git 存放區中,會提供範例應用程式。切換至 Java 目錄並查看應用程式程式碼。
cd cloud-code-samples/java/java-hello-world
這個資料夾包含可轉譯簡單網頁的 Java 應用程式範例:除了與本研究室無關的各種檔案外,這個資料夾還包含 src
資料夾下的原始碼,以及我們用於在本機建構容器映像檔的 Dockerfile。
建構容器映像檔
您必須先建立容器映像檔,才能將容器映像檔儲存至 Artifact Registry。
執行下列指令來建構容器映像檔,並正確標記,在下一個步驟中將映像檔推送至存放區:
docker build -t us-central1-docker.pkg.dev/$PROJECT_ID/container-dev-repo/java-hello-world:tag1 .
將容器映像檔推送至 Artifact Registry
執行下列指令,將容器映像檔推送至先前建立的存放區:
docker push us-central1-docker.pkg.dev/$PROJECT_ID/container-dev-repo/java-hello-world:tag1
在 Artifact Registry 中查看映像檔
前往 Google Cloud 控制台 - Artifact Registry - 存放區.
按一下 container-dev-repo
,確認 java-hello-world
映像檔是否存在。點選圖片,並記下標有 tag1
的圖片。您可以查看安全漏洞掃描正在執行或已完成,並查看偵測到的安全漏洞數量。
按一下安全漏洞數量,即可查看系統在映像檔中偵測到的安全漏洞清單,以及 CVE 安全性公告名稱和嚴重程度。您可以按一下每個列出的安全漏洞旁的「查看」,進一步瞭解詳細資訊:
4. 與 Cloud Code 整合
在本節中,您將瞭解如何搭配使用 Artifact Registry Docker 映像檔存放區和 Cloud Code。
透過 Cloud Code 將應用程式部署至 GKE 叢集
從 java-hello-world
資料夾執行下列指令,開啟 Cloud Shell 編輯器,並將應用程式資料夾新增至工作區:
cloudshell workspace .
Cloud Shell 編輯器隨即會在應用程式資料夾中使用 Explorer 開啟。
如果看到彈出式視窗,要求從工作區中排除 Java 專案設定檔案,請按一下 Exclude in workspace
在下列步驟中,您必須輸入 Artifact Registry 存放區位置。位置的格式如下:
us-central1-docker.pkg.dev/<PROJECT_ID>/container-dev-repo
如要查看 PROJECT_ID,請在終端機中執行下列指令
gcloud config get project
按一下 Cloud Code 狀態列 (位於左下角),然後選取 Run on Kubernetes
系統提示時,請選擇 Yes
,以便使用 kubeconfig 中的目前結構定義,該結構定義會指向為實驗室佈建的 container-dev-cluster
GKE 叢集
在映像檔登錄工具提示中輸入您找到的地址位置,並確保將 <PROJECT_ID> 替換為實際值
us-central1-docker.pkg.dev/<PROJECT_ID>/container-dev-repo
第一次執行「在 Kubernetes 上執行」時,Cloud Code 會提示您輸入目標映像檔存放區位置。提供後,存放區網址會儲存在應用程式資料夾中建立的 .vscode/launch.json
檔案中。
在輸出窗格中,您會看到應用程式映像檔的建構作業已開始 java-hello-world,
映像檔已上傳至先前設定的 Artifact Registry 存放區
前往 Cloud 控制台 - Artifact Registry - 存放區 點選 container-dev-repo
,確認 java-hello-world
映像檔,並注意標示為 latest
的新映像檔
查看已部署的應用程式
返回 Cloud Shell 編輯器:部署完成 Skaffold 後,Cloud Code 會列出服務已轉送的公開網址,請點選連結 - 開啟網頁預覽:
在新瀏覽器視窗中,您會看到「Hello World」應用程式頁面
更新應用程式程式碼
現在更新應用程式,查看在叢集部署中導入的變更:
在 Cloud Shell 編輯器的「src/main/java/cloudcode/helloworld/web
」資料夾中開啟 HelloWorldController.java
。
將第 20 列的文字從「It's running!」(運作中!) 變更為「It's updated!」(已更新!),畫面應會立即開始建構和部署程序。
在部署作業結束後,再次按一下轉送的網址,或重新整理含有應用程式的瀏覽器視窗,即可查看變更內容:
請再次前往 Cloud 控制台 - Artifact Registry - 存放區,點選進入 container-dev-repo
,然後檢查 java-hello-world
映像檔並記下新的映像檔
5. 使用語言套件
在本節中,您將瞭解如何設定 Artifact Registry Java 存放區,並上傳套件至其中,以便在不同應用程式中加以運用。
建立 Java 套件存放區
在 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 控制台 - Artifact Registry - 存放區,然後找出您新建立的名為 container-dev-java-repo
的 Maven 存放區,如果您按一下該存放區,就會發現目前為空白。
設定存放區驗證機制
使用下列指令,以您的使用者帳戶憑證更新應用程式預設憑證 (ADC) 的已知位置,讓 Artifact Registry 憑證輔助程式在連結存放區時,使用這些憑證進行驗證:
gcloud auth login --update-adc
為 Artifact Registry 設定 Maven
執行下列指令,即可列印要新增至 Java 專案的存放區設定:
gcloud artifacts print-settings mvn \
--repository=container-dev-java-repo \
--location=us-central1
在 Cloud Shell 編輯器中開啟 pom.xml,然後將傳回的設定新增至檔案中的適當區段。
更新 distributionManagement 部分
<distributionManagement>
<snapshotRepository>
<id>artifact-registry</id>
<url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
</snapshotRepository>
<repository>
<id>artifact-registry</id>
<url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
</repository>
</distributionManagement>
更新 repositories 區段
<repositories>
<repository>
<id>artifact-registry</id>
<url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
更新擴充功能
<extensions>
<extension>
<groupId>com.google.cloud.artifactregistry</groupId>
<artifactId>artifactregistry-maven-wagon</artifactId>
<version>2.1.0</version>
</extension>
</extensions>
以下是完整檔案的範例,供您參考。請務必將 <PROJECT> 換成您的專案 ID。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>hello-world</artifactId>
<packaging>jar</packaging>
<name>Cloud Code Hello World</name>
<description>Getting started with Cloud Code</description>
<version>1.0.0</version>
<distributionManagement>
<snapshotRepository>
<id>artifact-registry</id>
<url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
</snapshotRepository>
<repository>
<id>artifact-registry</id>
<url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
</repository>
</distributionManagement>
<repositories>
<repository>
<id>artifact-registry</id>
<url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
</parent>
<properties>
<java.version>1.8</java.version>
<checkstyle.config.location>./checkstyle.xml</checkstyle.config.location>
</properties>
<build>
<plugins>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.2.0</version>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.2</version>
</plugin>
</plugins>
<extensions>
<extension>
<groupId>com.google.cloud.artifactregistry</groupId>
<artifactId>artifactregistry-maven-wagon</artifactId>
<version>2.1.0</version>
</extension>
</extensions>
</build>
<!-- The Spring Cloud GCP BOM will manage spring-cloud-gcp version numbers for you. -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gcp-dependencies</artifactId>
<version>1.2.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-logging</artifactId>
</dependency>
</dependencies>
</project>
將 Java 套件上傳至 Artifact Registry
在 Maven 中設定 Artifact Registry 後,您現在可以使用 Artifact Registry 儲存 Java Jar,供貴機構的其他專案使用。
執行下列指令,將 Java 套件上傳至 Artifact Registry:
mvn deploy
在 Artifact Registry 中查看 Java 套件
前往 Cloud 控制台 - Artifact Registry - 存放區 按一下 container-dev-java-repo
,然後檢查 hello-world
二進位檔成果是否存在:
6. 恭喜!
恭喜,您已完成程式碼研究室!
涵蓋內容
- 建立容器和語言套件的存放區
- 使用 Artifact Registry 管理容器映像檔
- 將 Artifact Registry 與 Cloud Code 整合
- 設定 Maven 使用 Artifact Registry 的 Java 依附元件
清除所用資源
執行下列指令即可刪除專案
gcloud projects delete $PROJECT_ID