ניהול תלות באמצעות Artifact Registry

1. סקירה כללית

‫Artifact Registry הוא מקום מרכזי שבו הארגון יכול לנהל קובצי אימג' של קונטיינרים וחבילות שפה (כמו Maven ו-npm). הוא מהווה התפתחות של Container Registry. הוא משולב באופן מלא עם כלי זמן הריצה של Google Cloud, ויש בו תמיכה בניהול תלות מבוסס-שפה לשימוש עם כלים כמו npm ו-Maven. כך קל לשלב אותו עם כלי CI/CD כדי להגדיר פייפליינים אוטומטיים.

בשיעור ה-Lab הזה נסביר על חלק מהתכונות שזמינות ב-Artifact Registry.

מה תלמדו

מהם יעדי הלמידה של שיעור Lab הזה?

  • יצירת מאגרים לקונטיינרים ולחבילות שפה
  • ניהול תמונות של קונטיינרים באמצעות Artifact Registry
  • הגדרת Maven לשימוש ב-Artifact Registry ליחסי תלות ב-Java

2. הגדרה ודרישות

הגדרת סביבה בקצב אישי

  1. נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.

b35bf95b8bf3d5d8.pnga99b7ace416376c4.pngbd84a6d3004737c5.png

  • שם הפרויקט הוא השם המוצג למשתתפים בפרויקט. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. אפשר לעדכן את המיקום הזה בכל שלב.
  • מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו אחרי שהוא מוגדר. מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית, ובדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל הוא מזוהה כ-PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא תישאר כזו למשך הפרויקט.
  • לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. מידע נוסף על שלושת הערכים האלה מופיע במאמרי העזרה.
  1. בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API של Cloud. העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי לא תהיה עלות בכלל. כדי להשבית את המשאבים ולא לחייב אתכם אחרי שתסיימו את המדריך הזה, תוכלו למחוק את המשאבים שיצרתם או למחוק את כל הפרויקט. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

הגדרת 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

קבלת קוד המקור

קוד המקור של שיעור ה-Lab הזה נמצא בארגון GoogleCloudPlatform ב-GitHub. משכפלים אותו באמצעות הפקודה שלמטה ואז עוברים לספרייה.

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

3. עבודה עם תמונות קונטיינרים

יצירת מאגר Docker ב-Artifact Registry

ב-Artifact Registry אפשר לנהל קובצי אימג' של קונטיינרים וחבילות שפה. סוגים שונים של ארטיפקטים דורשים מפרטים שונים. לדוגמה, הבקשות לתלות ב-Maven שונות מהבקשות לתלות ב-Node.

כדי לתמוך במפרטי 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, לוחצים על Authorize (אישור).

עוברים אל מסוף Google Cloud – Artifact Registry – Repositories ורואים את מאגר 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

נכנסים אל Google Cloud Console - Artifact Registry - Repositories. לוחצים על 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, לוחצים על Authorize (אישור).

עוברים אל מסוף Google Cloud – Artifact Registry – Repositories (מאגרים) ורואים את מאגר Maven החדש שנוצר בשם container-dev-java-repo. אם לוחצים עליו, אפשר לראות שהוא ריק כרגע.

הגדרת אימות ל-Artifact Repository

כדי לעדכן את המיקום המוכר של Application Default Credentials ‏ (ADC) בפרטי הכניסה של חשבון המשתמש, כך שעוזר פרטי הכניסה של Artifact Registry יוכל לבצע אימות באמצעותם כשמתחברים למאגרי מידע, מריצים את הפקודה הבאה:

gcloud auth login --update-adc

הגדרת Maven ל-Artifact Registry

מריצים את הפקודה הבאה מהתיקייה java-hello-world כדי לפתוח את Cloud Shell Editor ולהוסיף את תיקיית האפליקציה לסביבת העבודה:

cloudshell workspace .

כדי להפעיל קובצי Cookie של צד שלישי, לוחצים על 'האתר פועל עכשיו?' ואז על 'אישור קובצי Cookie'.

אחרי שהדפדפן ייטען מחדש, פותחים את Cloud Shell ומריצים שוב את הפקודה שלמעלה כדי לטעון את תיקיית האפליקציה.

62328383ea59b30c.pnga9d756bf08575b0d.png

פותחים את הקובץ pom.xml ב-Cloud Shell Editor ולוחצים על Open 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

 <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 - Repositories. לוחצים על container-dev-java-repo ומוודאים שפריט המידע הבינארי hello-world נמצא שם:

e348d976ac1ac107.png

5. מעולה!

כל הכבוד, סיימתם את ה-Codelab!

מה נכלל

  • יצירת מאגרים לקונטיינרים ולחבילות שפה
  • תמונות קונטיינרים מנוהלות באמצעות Artifact Registry
  • הגדרת Maven לשימוש ב-Artifact Registry ליחסי תלות ב-Java

הסרת המשאבים

מריצים את הפקודה הבאה כדי למחוק את הפרויקט

gcloud projects delete $PROJECT_ID