1. סקירה כללית
במסגרת ההתפתחות של Container Registry, Artifact Registry הוא מקום מרכזי לניהול קובצי אימג' של קונטיינרים וחבילות שפה (כמו Maven ו-npm). הוא משתלב בצורה מלאה בכלים ובזמני הריצה של Google Cloud, והוא כולל תמיכה בניהול יחסי תלות מבוסס-שפה לשימוש בכלים כמו npm ו-Maven. כך אפשר לשלב אותו בקלות עם כלי ה-CI/CD כדי להגדיר צינורות עיבוד נתונים אוטומטיים.
בשיעור ה-Lab הזה תלמדו על כמה תכונות שזמינות ב-Artifact Registry.
מה תלמדו
מה מטרת הלמידה בשיעור ה-Lab הזה?
- יצירת מאגרים לקונטיינרים ולחבילות שפות
- ניהול תמונות קונטיינרים באמצעות Artifact Registry
- שילוב Artifact Registry עם Cloud Code
- הגדרת Maven לשימוש ב-Artifact Registry של יחסי תלות של Java
2. הגדרה ודרישות
הגדרת סביבה בקצב אישי
- נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. אם אין לכם עדיין חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.
- Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא נעשה בה שימוש ב-Google APIs, ואפשר לעדכן אותה בכל שלב.
- Project ID חייב להיות ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (ובדרך כלל הוא מזוהה כ-
PROJECT_ID
), כך שאם הוא לא מוצא חן בעיניכם, תוכלו ליצור פרויקט אקראי אחר או לנסות בעצמכם ולבדוק אם הוא זמין. ואז המכשיר 'קפוא' לאחר יצירת הפרויקט. - יש ערך שלישי, Project Number, שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
- בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולא לצבור חיובים מעבר למדריך הזה, פועלים לפי ההנחיות למחיקת המשאבים. בסוף ה-Codelab. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.
הגדרת 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/
הקצאת התשתית שבה נעשה שימוש בשיעור ה-Lab הזה
בשיעור ה-Lab הזה תפרסו קוד ל-GKE. סקריפט ההגדרה שבהמשך מכין את התשתית הזו עבורכם.
gcloud container clusters create container-dev-cluster --zone=us-central1-b
3. עבודה עם קובצי אימג' של קונטיינרים
יצירת מאגר Docker במרשם של Artifact
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 – מאגרים ורואים את המאגר החדש של 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 לדוגמה שמעבדת דף אינטרנט פשוט: בנוסף לקבצים שונים שלא רלוונטיים לשיעור ה-Lab הספציפי הזה, היא מכילה את קוד המקור בתיקייה src
וקובץ Docker שבו נשתמש כדי לפתח קובץ אימג' בקונטיינר באופן מקומי.
יצירת קובץ האימג' של הקונטיינר
כדי לאחסן תמונות של קונטיינרים ב-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
. ניתן לראות שסריקת נקודות החולשה פועלת או שכבר הושלמה, ומספר נקודות החולשה שזוהו גלוי.
ניתן ללחוץ על מספר נקודות החולשה כדי להציג את רשימת נקודות החולשה שזוהו בתמונה. רשימת נקודות החולשה שזוהו בתמונה עם מידע נוסף על כך. ניתן ללחוץ על VIEW בכל נקודת חולשה כדי לקבל פרטים נוספים:
4. שילוב באמצעות Cloud Code
בקטע הזה נסביר איך להשתמש במאגר התמונות של Docker ב-Artifact Registry עם Cloud Code.
פריסת האפליקציה לאשכול GKE מ-Cloud Code
כדי לפתוח את Cloud Shell Editor ולהוסיף את תיקיית האפליקציה לסביבת העבודה שלו, מריצים את הפקודה הבאה מהתיקייה java-hello-world
:
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 שמפנה לאשכול GKE container-dev-cluster
שהוקצה לשיעור ה-Lab
בהודעה שמופיעה במרשם התמונות, צריך לציין את מיקום הכתובת לפני שמוודאים שמחליפים את <PROJECT_ID> לפי הערך האמיתי
us-central1-docker.pkg.dev/<PROJECT_ID>/container-dev-repo
כשמפעילים את 'הרצה ב-Kubernetes' בפעם הראשונה, מופיעה בקשה מ-Cloud Code למיקום היעד של מאגר התמונות. כתובת ה-URL של המאגר תאוחסן בקובץ .vscode/launch.json
שנוצר בתיקיית האפליקציות.
בחלונית הפלט רואים שה-build מתחיל עבור קובץ האימג' של האפליקציה java-hello-world,
. התמונה הועלתה למאגר Artifact Registry שהוגדר קודם
נכנסים אל Cloud Console – Artifact Registry – מאגרים לוחצים על container-dev-repo
ובודקים שהתמונה java-hello-world
ומופיעה בתמונה חדשה עם תיוג latest
בדיקת האפליקציה הפרוסה
חוזרים אל Cloud Shell Editor: בסיום הפריסה, Skaffold/Cloud Code ידפיס את כתובת ה-URL החשופה שאליה הועבר השירות, לוחצים על הקישור – פתיחת תצוגה מקדימה באינטרנט:
בחלון הדפדפן החדש תראו את הדף של אפליקציית hello World.
עדכון קוד האפליקציה
עכשיו מעדכנים את האפליקציה כדי שהשינוי מיושם באופן מיידי בפריסה באשכול:
פותחים את הקובץ HelloWorldController.java
בתיקייה src/main/java/cloudcode/helloworld/web
ב-Cloud Shell Editor.
משנים את הטקסט בשורה 20 מ"הוא פועל!" ל-"It's updated!", תהליך ה-build והפריסה אמור להתחיל מיד.
בסוף הפריסה, לוחצים שוב על כתובת ה-URL שמועברת או מרעננים את חלון הדפדפן עם האפליקציה כדי לראות את השינוי נפרס:
שוב, נכנסים אל מסוף Cloud – Artifact Registry – מאגרים, לוחצים על container-dev-repo
ובודקים שהתמונה java-hello-world
מופיעה ומופיעה תמונה חדשה
5. עבודה עם חבילות שפה
בחלק הזה נסביר איך מגדירים מאגר של Artifact Registry Java ומעלים אליו חבילות, ומשתמשים בהן באפליקציות שונות.
יצירת מאגר של חבילות Java
כדי ליצור מאגר ארטיפקטים של Java, מריצים את הפקודה הבאה ב-Cloud Shell:
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 – מאגרים, ומחפשים את המאגר החדש ב-Maven שנקרא container-dev-java-repo
. אם תלחצו עליו הוא יהיה ריק כרגע.
הגדרת אימות ב-Artifact Repository
אפשר להשתמש בפקודה הבאה כדי לעדכן את המיקום הידוע של Application Default Credentials (ADC) עם פרטי הכניסה של חשבון המשתמש שלכם, כדי שכלי העזר ל-Artifact Registry יוכל לבצע אימות באמצעותם כשמתחברים למאגרים:
gcloud auth login --update-adc
הגדרת Maven ל-Artifact Registry
מריצים את הפקודה הבאה כדי להדפיס את תצורת המאגר כדי להוסיף אותה לפרויקט Java:
gcloud artifacts print-settings mvn \
--repository=container-dev-java-repo \
--location=us-central1
פותחים את הקובץ pom.xml ב-Cloud Shell Editor ומוסיפים את ההגדרות שהוחזרו לקטעים המתאימים בקובץ:
מעדכנים את הקטע 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 לשימוש בפרויקטים אחרים בארגון.
מריצים את הפקודה הבאה כדי להעלות את חבילת ה-Java ל-Artifact Registry:
mvn deploy
בדיקה של חבילת Java ב-Artifact Registry
עוברים אל מסוף Cloud – Artifact Registry – מאגרים לוחצים על container-dev-java-repo
ובודקים שהארטיפקט הבינארי hello-world
נמצא שם:
6. מעולה!
כל הכבוד, סיימת את ה-Codelab!
מה נכלל
- מאגרים שנוצרו עבור קונטיינרים וחבילות שפה
- קובצי אימג' של קונטיינרים מנוהלים באמצעות Artifact Registry
- Artifact Registry משולב עם Cloud Code
- הגדרת ב-Maven לשימוש ב-Artifact Registry של יחסי תלות של Java
הסרת המשאבים
מריצים את הפקודה הבאה כדי למחוק את הפרויקט.
gcloud projects delete $PROJECT_ID