การจัดการการขึ้นต่อกันด้วย Artifact Registry

1. ภาพรวม

Artifact Registry เป็นที่เดียวที่องค์กรของคุณใช้จัดการอิมเมจคอนเทนเนอร์และแพ็กเกจภาษา (เช่น Maven และ npm) ได้ ซึ่งเป็นวิวัฒนาการของ Container Registry โดยผสานรวมกับเครื่องมือและรันไทม์ของ Google Cloud อย่างเต็มรูปแบบ และมาพร้อมกับการรองรับการจัดการทรัพยากร Dependency ตามภาษาเพื่อใช้กับเครื่องมือต่างๆ เช่น npm และ Maven ซึ่งทำให้ผสานรวมกับเครื่องมือ CI/CD เพื่อตั้งค่าไปป์ไลน์อัตโนมัติได้ง่าย

แล็บนี้จะแนะนำฟีเจอร์บางอย่างที่มีใน Artifact Registry

สิ่งที่คุณจะได้เรียนรู้

วัตถุประสงค์การเรียนรู้ของแล็บนี้คืออะไร

  • สร้างที่เก็บสำหรับคอนเทนเนอร์และแพ็กเกจภาษา
  • จัดการอิมเมจคอนเทนเนอร์ด้วย Artifact Registry
  • กำหนดค่า Maven ให้ใช้ Artifact Registry สำหรับทรัพยากร Dependency ของ Java

2. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง

  1. ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณก็สร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณจะลองใช้ชื่อของคุณเองเพื่อดูว่าพร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

ตั้งค่า 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)')

เปิดใช้บริการของ Google

gcloud services enable \
  cloudresourcemanager.googleapis.com \
  container.googleapis.com \
  artifactregistry.googleapis.com \
  containerregistry.googleapis.com \
  containerscanning.googleapis.com

รับซอร์สโค้ด

ซอร์สโค้ดสำหรับแล็บนี้อยู่ในองค์กร GoogleCloudPlatform บน GitHub โคลนด้วยคำสั่งด้านล่าง แล้วเปลี่ยนเป็นไดเรกทอรี

git clone https://github.com/GoogleCloudPlatform/cloud-code-samples/

3. การทำงานกับอิมเมจคอนเทนเนอร์

สร้างที่เก็บ Docker ใน Artifact Registry

Artifact Registry รองรับการจัดการอิมเมจคอนเทนเนอร์และแพ็กเกจภาษา อาร์ติแฟกต์แต่ละประเภทต้องมีข้อกำหนดที่แตกต่างกัน เช่น คำขอสำหรับทรัพยากร Dependency ของ Maven จะแตกต่างจากคำขอสำหรับทรัพยากร Dependency ของ Node

Artifact Registry ต้องทราบว่าคุณต้องการให้การตอบกลับจาก API เป็นไปตามรูปแบบใดเพื่อรองรับข้อกำหนดเฉพาะของ 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 Console - Artifact Registry - ที่เก็บ แล้วสังเกตที่เก็บ Docker ที่สร้างขึ้นใหม่ชื่อ container-dev-repo หากคลิกที่ที่เก็บดังกล่าว คุณจะเห็นว่าที่เก็บนั้นว่างเปล่าในขณะนี้

กำหนดค่าการตรวจสอบสิทธิ์ Docker ไปยัง Artifact Registry

เมื่อเชื่อมต่อกับ Artifact Registry คุณจะต้องระบุข้อมูลเข้าสู่ระบบเพื่อมอบสิทธิ์เข้าถึง คุณสามารถกำหนดค่า Docker ให้ใช้ข้อมูลเข้าสู่ระบบ gcloud ได้อย่างราบรื่นแทนที่จะตั้งค่าข้อมูลเข้าสู่ระบบแยกต่างหาก

จาก Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้เพื่อกำหนดค่า Docker ให้ใช้ Google Cloud CLI เพื่อตรวจสอบสิทธิ์คำขอไปยัง Artifact Registry ในภูมิภาค us-central1

gcloud auth configure-docker us-central1-docker.pkg.dev

คำสั่งจะแจ้งให้ยืนยันการเปลี่ยนการกำหนดค่า Docker ของ Cloud Shell ให้กด 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

ไปที่ Cloud Console - Artifact Registry - Repositories ของ Google. คลิกเข้าไปที่ container-dev-repo แล้วตรวจสอบว่ามีอิมเมจ java-hello-world อยู่ คลิกรูปภาพและจดบันทึกรูปภาพที่ติดแท็ก tag1 คุณจะเห็นว่าการสแกนช่องโหว่กำลังทำงานหรือเสร็จสมบูรณ์แล้ว และจะเห็นจำนวนช่องโหว่ที่ตรวจพบ

9cb46d3689b3ed2.png

คลิกจำนวนช่องโหว่ แล้วคุณจะเห็นรายการช่องโหว่ที่ตรวจพบในอิมเมจ พร้อมชื่อกระดานข่าว CVE และความรุนแรง โดยคุณสามารถคลิกดูในช่องโหว่แต่ละรายการเพื่อดูรายละเอียดเพิ่มเติมได้

c2a961e6218d5a45.png

4. การทำงานกับแพ็กเกจภาษา

ในส่วนนี้ คุณจะได้ดูวิธีตั้งค่าที่เก็บ Java ของ Artifact Registry และอัปโหลดแพ็กเกจไปยังที่เก็บดังกล่าว รวมถึงวิธีใช้ประโยชน์จากแพ็กเกจในแอปพลิเคชันต่างๆ

สร้างที่เก็บแพ็กเกจ 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 Console - Artifact Registry - ที่เก็บ แล้วสังเกตที่เก็บ Maven ที่สร้างขึ้นใหม่ชื่อ container-dev-java-repo หากคลิกที่เก็บดังกล่าว คุณจะเห็นว่าที่เก็บนั้นว่างเปล่าในขณะนี้

ตั้งค่าการตรวจสอบสิทธิ์ไปยังที่เก็บ Artifact

ใช้คำสั่งต่อไปนี้เพื่ออัปเดตตำแหน่งที่รู้จักกันดีสำหรับข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชัน (ADC) ด้วยข้อมูลเข้าสู่ระบบบัญชีผู้ใช้ เพื่อให้โปรแกรมช่วยเหลือด้านข้อมูลเข้าสู่ระบบของ Artifact Registry สามารถตรวจสอบสิทธิ์โดยใช้ข้อมูลดังกล่าวเมื่อเชื่อมต่อกับที่เก็บ

gcloud auth login --update-adc

กำหนดค่า Maven สำหรับ Artifact Registry

เรียกใช้คำสั่งต่อไปนี้จากโฟลเดอร์ java-hello-world เพื่อเปิด Cloud Shell Editor และเพิ่มโฟลเดอร์แอปพลิเคชันลงในพื้นที่ทำงาน

cloudshell workspace .

เปิดใช้คุกกี้ของบุคคลที่สามโดยคลิก "เว็บไซต์ใช้งานได้แล้วใช่ไหม" แล้วคลิก "อนุญาตคุกกี้"

หลังจากเบราว์เซอร์โหลดซ้ำแล้ว ให้เปิด Cloud Shell แล้วเรียกใช้คำสั่งด้านบนอีกครั้งเพื่อโหลดโฟลเดอร์แอปพลิเคชัน

62328383ea59b30c.png

a9d756bf08575b0d.png

เปิด pom.xml ใน Cloud Shell Editor แล้วคลิก "เปิดตัวแก้ไข"

95d98e831787b2ff.png

เปิดเทอร์มินัลจาก Cloud Shell Editor แล้วเรียกใช้คำสั่งต่อไปนี้เพื่อพิมพ์การกำหนดค่าที่เก็บที่จะเพิ่มลงในโปรเจ็กต์ Java

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

และเพิ่มการตั้งค่าที่ส่งคืนไปยังส่วนที่เหมาะสมในไฟล์ pom.xml

มุมมอง Cloud Editor พร้อมเทอร์มินัลในตัว

33c3bfa412b7babd.png

อัปเดตส่วน 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>
   <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> ด้วยรหัสโปรเจ็กต์

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

เมื่อกำหนดค่า Artifact Registry ใน Maven แล้ว คุณจะใช้ Artifact Registry เพื่อจัดเก็บ Java JAR สำหรับโปรเจ็กต์อื่นๆ ในองค์กรได้

เรียกใช้คำสั่งต่อไปนี้เพื่ออัปโหลดแพ็กเกจ Java ไปยัง Artifact Registry

mvn deploy

ตรวจสอบแพ็กเกจ Java ใน Artifact Registry

ไปที่ Cloud Console - Artifact Registry - ที่เก็บ คลิก container-dev-java-repo แล้วตรวจสอบว่ามีอาร์ติแฟกต์ไบนารี hello-world อยู่

e348d976ac1ac107.png

5. ยินดีด้วย

ยินดีด้วย คุณทำ Codelab เสร็จแล้ว

สิ่งที่คุณได้พูดถึงไปแล้ว

  • ที่เก็บที่สร้างขึ้นสำหรับคอนเทนเนอร์และแพ็กเกจภาษา
  • จัดการอิมเมจคอนเทนเนอร์ด้วย Artifact Registry
  • กำหนดค่า Maven ให้ใช้ Artifact Registry สำหรับทรัพยากร Dependency ของ Java

ล้างข้อมูล

เรียกใช้คำสั่งต่อไปนี้เพื่อลบโปรเจ็กต์

gcloud projects delete $PROJECT_ID