การจัดหาซอฟต์แวร์อย่างปลอดภัย

1. ภาพรวม

อาร์ติแฟกต์รีจิสทรีช่วยให้คุณจัดเก็บอาร์ติแฟกต์ประเภทต่างๆ สร้างที่เก็บข้อมูลหลายแห่งในโปรเจ็กต์เดียว และเชื่อมโยงภูมิภาคที่เฉพาะเจาะจงหรือหลายภูมิภาคกับที่เก็บข้อมูลแต่ละแห่งได้ โหมดที่เก็บข้อมูลมีหลายโหมด โดยแต่ละโหมดมีจุดประสงค์การใช้งานแตกต่างกัน แผนภาพต่อไปนี้แสดงวิธีใช้ที่เป็นไปได้เพียงวิธีหนึ่งในการใช้ที่เก็บข้อมูลในโหมดต่างๆ ร่วมกัน แผนภาพแสดงเวิร์กโฟลว์ในโปรเจ็กต์ Google Cloud 2 รายการ นักพัฒนาซอฟต์แวร์จะสร้างแอปพลิเคชัน Java ในโปรเจ็กต์การพัฒนา ในโปรเจ็กต์รันไทม์แยกต่างหาก บิลด์อื่นจะสร้างอิมเมจคอนเทนเนอร์ที่มีแอปพลิเคชันสำหรับการทำให้ใช้งานได้ใน Google Kubernetes Engine

5af5e4da3ccfdff3.png

ในบทแนะนำนี้ คุณจะได้เรียนรู้วิธีทํางานต่อไปนี้

  • ใช้ที่เก็บข้อมูลมาตรฐานเพื่อทำให้แพ็กเกจส่วนตัวใช้งานได้
  • ใช้ที่เก็บระยะไกลเพื่อแคชแพ็กเกจ Maven Central
  • ใช้ที่เก็บข้อมูลเสมือนเพื่อรวมที่เก็บข้อมูลต้นทางหลายแห่งในการกําหนดค่าเดียว

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

การตั้งค่า Workspace

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

เปิดใช้ API

gcloud services enable artifactregistry.googleapis.com

โคลนที่เก็บ

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

2. ที่เก็บมาตรฐาน

ที่เก็บข้อมูลมาตรฐานเป็นวิธีจัดเก็บแพ็กเกจส่วนตัวและแชร์กับแอปพลิเคชันอื่นๆ

สร้างที่เก็บ Maven มาตรฐาน

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

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

ควรแสดงผลลัพธ์ที่คล้ายกับตัวอย่างต่อไปนี้

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'

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

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

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

คำสั่งก่อนหน้าจะแสดงผล XML เพื่อเพิ่มลงใน pom.xml ของโปรเจ็กต์

  • ส่วน repositories จะระบุตำแหน่งที่ Maven อาจดาวน์โหลดอาร์ติแฟกต์ระยะไกลเพื่อใช้ในโปรเจ็กต์ปัจจุบัน
  • ส่วน distributionManagement จะระบุที่เก็บระยะไกลที่โปรเจ็กต์จะพุชเมื่อมีการนำไปใช้งาน
  • ส่วน extensions จะเพิ่ม artifactregistry-maven-wagon ซึ่งเปิดใช้ชั้นการตรวจสอบสิทธิ์และชั้นนำส่งที่จําเป็นสําหรับการเชื่อมต่อกับ Artifact Registry
  • หมายเหตุ: ส่วนขยายอาจอยู่ใน pom.xml หรือ extensions.xml ในกรณีที่โปรเจ็กต์ใช้โปรเจ็กต์หลัก ระบบจะเข้าถึงทรัพยากรเหล่านั้นก่อนที่จะโหลดรายการอื่นๆ ใน pom.xml คุณสามารถวางส่วนขยายไว้ในไฟล์ extensions.xml ซึ่งจะโหลดก่อน pom.xml เพื่อให้ส่วนขยายพร้อมใช้งานสำหรับข้อกำหนดของส่วนกลางได้ เพื่อให้มั่นใจว่าส่วนกลางจะมีสิทธิ์เข้าถึงส่วนขยาย

คัดลอก 3 ส่วน แล้วเปิด pom.xml ในเครื่องมือแก้ไข Cloud Shell และเพิ่มการตั้งค่าที่แสดงผลไว้ที่ด้านล่างของไฟล์ภายในแท็ก project ที่ปิด

เคล็ดลับ: ใน Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลเพื่อเปิดเครื่องมือแก้ไขในไดเรกทอรีปัจจุบัน

cloudshell workspace .

ตัวอย่าง: (ชื่อโปรเจ็กต์ของคุณจะต่างออกไปใน 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>

อัปโหลดแพ็กเกจ Java ไปยัง Artifact Registry

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

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

mvn deploy -DskipTests

หากต้องการเรียกใช้คําสั่งนี้อีกครั้ง โปรดเพิ่มเวอร์ชันใน pom.xml

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

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

147eac5168648db1.png

3. ที่เก็บระยะไกล

ที่เก็บระยะไกลช่วยให้แคชแพ็กเกจของบุคคลที่สามได้เพื่อเพิ่มความน่าเชื่อถือและความปลอดภัย

สร้างที่เก็บระยะไกล

หมายเหตุ: ดูรายละเอียดเกี่ยวกับการตรวจสอบสิทธิ์และการกำหนดค่าได้ในเอกสารประกอบสำหรับผลิตภัณฑ์

จาก Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างที่เก็บระยะไกลสำหรับอาร์ติแฟกต์ 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

ตรวจสอบที่เก็บในคอนโซล

ไปที่ Cloud Console - Artifact Registry - Repositories คลิก maven-central-cache และสังเกตว่าระบบได้สร้างที่เก็บดังกล่าวแล้วและยังไม่มีข้อมูล

ตรวจสอบที่เก็บในเทอร์มินัล

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

ผสานรวมที่เก็บลงในโปรเจ็กต์

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

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

เพิ่มส่วนพื้นที่เก็บข้อมูลลงใน pom.xml โปรดอย่าคัดลอกแท็ก <repositories> ด้านนอกจากเอาต์พุต

เปลี่ยนรหัสของที่เก็บข้อมูลที่เพิ่มใหม่เป็น "central" เพื่อให้แน่ใจว่ารายการที่เก็บข้อมูลแต่ละรายการมีรหัสที่ไม่ซ้ำกัน

ตัวอย่าง: (ชื่อโปรเจ็กต์ของคุณจะต่างออกไปใน 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>

เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลเพื่อสร้าง extensions.xml สำหรับโปรเจ็กต์ หากต้องการใช้กลไกส่วนขยายหลักเพื่อให้ Maven แก้ปัญหาการพึ่งพาของพร็อพเพอร์ตี้หลักหรือปลั๊กอินจากที่เก็บอาร์ติแฟกต์ได้

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

ดึงข้อมูล Dependency จากที่เก็บระยะไกล

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

rm -rf ~/.m2/repository 
mvn compile

ตรวจสอบแพ็กเกจในคอนโซล

ไปที่ Cloud Console - Artifact Registry - Repositories คลิก maven-central-cache แล้วตรวจสอบว่าอาร์ติแฟกต์ไบนารีที่แคชไว้มีดังนี้

9deea93caa5fefd7.png

4. ที่เก็บเสมือน

ที่เก็บข้อมูลเสมือนทำหน้าที่เป็นอินเทอร์เฟซสำหรับการเข้าถึงที่เก็บข้อมูลหลายแห่งผ่านการกําหนดค่าครั้งเดียว ซึ่งจะลดความซับซ้อนในการกําหนดค่าไคลเอ็นต์สําหรับผู้ใช้อาร์ติแฟกต์และเพิ่มความปลอดภัยด้วยการลดการโจมตีแบบความสับสนเกี่ยวกับ Dependency

สร้างไฟล์นโยบาย

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

สร้างที่เก็บเสมือน

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

ผสานรวมที่เก็บลงในโปรเจ็กต์

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

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

แทนที่ส่วนพื้นที่เก็บข้อมูลทั้งหมดใน pom ด้วยส่วนพื้นที่เก็บข้อมูลเสมือน 1 ส่วนจากเอาต์พุต

ตัวอย่าง: (ชื่อโปรเจ็กต์ของคุณจะต่างออกไปใน 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>


ดึงข้อมูล Dependency จากที่เก็บเสมือน

เนื่องจากที่เก็บข้อมูลเสมือนเป็นการส่งผ่านและจะไม่จัดเก็บแพ็กเกจจริงใดๆ เราจึงจะลบที่เก็บข้อมูล maven-central-cache ที่สร้างไว้ก่อนหน้านี้และสร้างใหม่เพื่อเริ่มต้นอีกครั้งด้วยที่เก็บข้อมูลว่าง

เรียกใช้คําสั่งต่อไปนี้เพื่อสร้างที่เก็บแคชอีกครั้ง

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

คุณสามารถตรวจสอบที่เก็บเปล่าได้ในคอนโซล ไปที่ Cloud Console - Artifact Registry - Repositories

ตอนนี้ให้ทดสอบที่เก็บข้อมูลเสมือนโดยสร้างโปรเจ็กต์ด้วยคำสั่งต่อไปนี้

rm -rf ~/.m2/repository 
mvn compile

ตรวจสอบแพ็กเกจในคอนโซล

ไปที่ Cloud Console - Artifact Registry - Repositories คลิก maven-central-cache แล้วตรวจสอบว่ามีการกําหนดค่าอาร์ติแฟกต์ไบนารีให้ดึงมาจากที่เก็บข้อมูลเสมือน แต่ดึงมาจาก maven-central-cache ในท้ายที่สุด

9deea93caa5fefd7.png

5. ยินดีด้วย

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

สิ่งที่คุณครอบคลุม

  • ใช้ที่เก็บข้อมูลมาตรฐานเพื่อทำให้แพ็กเกจส่วนตัวใช้งานได้
  • ใช้ที่เก็บระยะไกลเพื่อแคชแพ็กเกจ Maven Central
  • ใช้ที่เก็บข้อมูลเสมือนเพื่อรวมที่เก็บข้อมูลต้นทางหลายแห่งในการกําหนดค่าเดียว

ล้างข้อมูล

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

gcloud projects delete ${PROJECT_ID}

อัปเดตล่าสุด: 22/3/23