1. סקירה כללית
Artifact Registry הוא מקום מרכזי אחד שבו הארגון יכול לנהל קובצי אימג' של קונטיינרים וחבילות שפה (כמו Maven ו-npm). הוא משולב באופן מלא עם הכלים וסביבות זמן הריצה של Google Cloud, ומגיע עם תמיכה בניהול יחסי תלות מבוססי-שפה לשימוש עם כלים כמו npm ו-Maven. כך קל לשלב אותו עם כלי ה-CI/CD כדי להגדיר צינורות עיבוד נתונים אוטומטיים.
במדריך הזה נסביר על כמה מהתכונות הזמינות ב-Artifact Registry.
מה תלמדו
מהם יעדי הלמידה של שיעור ה-Lab הזה?
- יצירת מאגרים לקונטיינרים ולחבילות שפה
- ניהול קובצי אימג' של קונטיינרים באמצעות Artifact Registry
- שילוב של Artifact Registry עם Cloud Code
- הגדרת Maven לשימוש ב-Artifact Registry לצורך ניהול יחסי התלות ב-Java
2. הגדרה ודרישות
הגדרת סביבה בקצב אישי
- נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או משתמשים מחדש בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.
- שם הפרויקט הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא נעשה בה שימוש ב-Google APIs, ואפשר לעדכן אותה בכל שלב.
- Project ID חייב להיות ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי. בדרך כלל לא חשוב לכם לדעת מה היא. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (ובדרך כלל הוא מזוהה כ-
PROJECT_ID
), כך שאם הוא לא מוצא חן בעיניכם, תוכלו ליצור מחרוזת אחרת אקראית או לנסות בעצמכם ולראות אם הוא זמין. לאחר יצירת הפרויקט הוא יהיה 'קפוא'. - יש ערך שלישי, מספר פרויקט, שמשתמשים בו בממשקי API מסוימים. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
- בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים כדי שלא תחויבו אחרי סיום המדריך, פועלים לפי ההוראות ל'ניקוי' שמופיעות בסוף הקודלאב. משתמשים חדשים ב-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
קבלת קוד המקור
קוד המקור של הסדנה הזו נמצא בארגון GoogleCloudPlatform ב-GitHub. מעתיקים אותו באמצעות הפקודה הבאה, ולאחר מכן עוברים לספרייה.
git clone https://github.com/GoogleCloudPlatform/cloud-code-samples/
הקצאת התשתית שבה נעשה שימוש במעבדה הזו
בשיעור ה-Lab הזה תלמדו לפרוס קוד ב-GKE. סקריפט ההגדרה שבהמשך מכין את התשתית הזו.
gcloud container clusters create container-dev-cluster --zone=us-central1-b
3. עבודה עם קובצי אימג' של קונטיינרים
יצירת מאגר Docker ב-Artifact Registry
ב-Artifact Registry אפשר לנהל קובצי אימג' של קונטיינרים וחבילות שפה. לסוגים שונים של ארטיפקטים נדרשות מפרטים שונים. לדוגמה, הבקשות ליחסי תלות של Maven שונות מהבקשות ליחסי תלות של Node.
כדי לתמוך במפרטי ה-API השונים, ב-Artifact Registry אתם צריכים לדעת באיזה פורמט תרצו שתגובות ה-API יפעלו. כדי לעשות זאת, יוצרים מאגר ומעבירים את הדגל --repository-format
שמציין את סוג המאגר הרצוי.
כדי ליצור מאגר לקובצי אימג' של Docker, מריצים את הפקודה הבאה ב-Cloud Shell:
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 לדוגמה שמעבדת דף אינטרנט פשוט: בנוסף לקבצים שונים שלא רלוונטיים לשיעור ה-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
. אפשר לראות שהסריקה של נקודות החולשה פועלת או כבר הושלמה, ומספר נקודות החולשה שזוהו גלוי.
לוחצים על מספר נקודות החולשה ומוצגת רשימת נקודות החולשה שזוהו בתמונה, עם שם העדכון של CVE והחומרה. אפשר ללחוץ על 'הצגה' בכל אחת מנקודות החולשה שרשומה כדי לקבל פרטים נוספים:
4. שילוב עם Cloud Code
בקטע הזה נסביר איך להשתמש במאגר קובצי האימג' של Docker ב-Artifact Registry עם Cloud Code.
פריסת האפליקציה באשכול GKE מ-Cloud Code
מריצים את הפקודה הבאה מהתיקייה java-hello-world
כדי לפתוח את Cloud Shell Editor ולהוסיף את תיקיית האפליקציה לסביבת העבודה שלו:
cloudshell workspace .
עורך Cloud Shell ייפתח עם סייר הקבצים בתיקיית האפליקציה.
אם מופיעה הודעה קופצת עם בקשה להחריג מסביבת העבודה קבצים של הגדרות פרויקטים ב-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
שהוקצה לסדנה.
בהודעה שמופיעה במרשם התמונות, צריך לציין את מיקום הכתובת לפני שמחליפים את הערך של <PROJECT_ID> בערך האמיתי
us-central1-docker.pkg.dev/<PROJECT_ID>/container-dev-repo
בפעם הראשונה שמריצים את Run on Kubernetes, מוצגת ב-Cloud Code בקשה לציין את המיקום של מאגר קובצי האימג' של היעד. לאחר שמזינים את כתובת ה-URL של המאגר, היא נשמרת בקובץ .vscode/launch.json
שנוצר בתיקיית האפליקציה.
בחלונית הפלט מוצג שה-build מתחיל עבור קובץ האימג' של האפליקציה java-hello-world,
האימג' מועלה למאגר Artifact Registry שהוגדר קודם
נכנסים אל Cloud Console - Artifact Registry - Repositories לוחצים על container-dev-repo
ובודקים את קובץ האימג' java-hello-world
. שימו לב לקובץ אימג' חדש עם התג latest
בדיקת האפליקציה הפרוסה
חוזרים ל-Cloud Shell Editor: כשהפריסה תושלם, Skaffold/Cloud Code ידפיסו את כתובת ה-URL החשופה שבה השירות הועבר. לוחצים על הקישור – Open Web Preview:
בחלון הדפדפן החדש יוצג הדף של אפליקציית hello world
עדכון קוד האפליקציה
עכשיו מעדכנים את האפליקציה כדי לראות את השינוי מיושם באופן מיידי בפריסה באשכול:
פותחים את הקובץ HelloWorldController.java
בתיקייה src/main/java/cloudcode/helloworld/web
ב-Cloud Shell Editor.
משנים את הטקסט בשורה 20 מ-It's running! ל-""It's updated!"", תהליך ה-build והפריסה אמור להתחיל מיד.
בסיום הפריסה, לוחצים שוב על כתובת ה-URL שהועברה או מרעננים את חלון הדפדפן עם האפליקציה כדי לראות את השינוי שפורס:
שוב נכנסים אל Cloud Console - Artifact Registry - Repositories לוחצים על container-dev-repo
ובודקים את קובץ האימג' java-hello-world
ומתעדים את קובץ האימג' החדש.
5. עבודה עם חבילות שפה
בקטע הזה תלמדו איך להגדיר מאגר Java ב-Artifact Registry ולהעלות אליו חבילות, כדי להשתמש בהן באפליקציות שונות.
יצירת מאגר חבילות 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 Console – 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:
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 Jar לשימוש בפרויקטים אחרים בארגון.
מריצים את הפקודה הבאה כדי להעלות את חבילת ה-Java ל-Artifact Registry:
mvn deploy
בדיקת חבילת Java ב-Artifact Registry
עוברים אל Cloud Console – Artifact Registry – Repositories לוחצים על container-dev-java-repo
ובודקים שפריט המידע הבינארי hello-world
נמצא שם:
6. מעולה!
כל הכבוד, סיימת את הקודלאב!
מה נכלל
- יצירה של מאגרים לקונטיינרים ולחבילות שפה
- קובצי אימג' של קונטיינרים מנוהלים באמצעות Artifact Registry
- שילוב של Artifact Registry עם Cloud Code
- הגדרת Maven לשימוש ב-Artifact Registry לצורך ניהול יחסי התלות ב-Java
הסרת המשאבים
מריצים את הפקודה הבאה כדי למחוק את הפרויקט:
gcloud projects delete $PROJECT_ID