نظرة متعمّقة على Artifact Registry

1. نظرة عامة

بصفتها الإصدار المتطوّر من "مستودع الحِزم"، يشكّل مستودع العناصر مكانًا واحدًا لمؤسستك لإدارة صور الحِزم وحِزم اللغات (مثل Maven وnpm). وهي تتكامل بشكل كامل مع أدوات وبيئات تشغيل Google Cloud وتتيح إدارة التبعية استنادًا إلى اللغة لاستخدامها مع أدوات مثل npm وMaven. ويسهّل ذلك دمجها مع أدوات التطوير المتكامل/النشر المبرمَج لإعداد مسارات مبرمَجة.

يتضمّن هذا التمرين المعملي بعض الميزات المتوفّرة في Artifact Registry.

ما ستتعرّف عليه

ما هي أهداف التعلّم لهذا الدرس التطبيقي؟

  • إنشاء مستودعات للحاويات وحِزم اللغات
  • إدارة صور الحاويات باستخدام Artifact Registry
  • دمج Artifact Registry مع Cloud Code
  • ضبط Maven لاستخدام Artifact Registry لاعتمادات Java

2. الإعداد والمتطلبات

إعداد البيئة حسب وتيرة الطالب واحتياجاته

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها واجهات برمجة تطبيقات Google، ويمكنك تعديلها في أي وقت.
  • يجب أن يكون معرّف المشروع فريدًا في جميع مشاريع Google Cloud وأن يكون ثابتًا (لا يمكن تغييره بعد ضبطه). تُنشئ أداة Cloud Console سلسلة فريدة تلقائيًا، ولا يهمّك عادةً معرفة قيمتها. في معظم ورشات عمل الرموز البرمجية، ستحتاج إلى الإشارة إلى رقم تعريف المشروع (ويُعرَف عادةً باسم PROJECT_ID)، لذا إذا لم يعجبك، يمكنك إنشاء رقم آخر عشوائي أو تجربة رقمك الخاص لمعرفة ما إذا كان متاحًا. وبعد إنشاء المشروع، يتم "تجميد" النموذج.
  • هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات عن كلّ من هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات 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

الحصول على رمز المصدر

يمكن العثور على الرمز المصدر لهذه التجربة الاختبارية في مؤسسة GoogleCloudPlatform على GitHub. يمكنك استنساخها باستخدام الأمر أدناه ثم الانتقال إلى الدليل.

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

إعداد البنية الأساسية المستخدَمة في هذا الدرس العملي

في هذا التمرين، سيتم نشر الرمز إلى "خدمات Google لتنسيق Kubernetes". يعمل النص البرمجي للإعداد أدناه على إعداد هذه البنية الأساسية من أجلك.

gcloud container clusters create container-dev-cluster --zone=us-central1-b

3- العمل مع صور الحاويات

إنشاء مستودع Docker على Artifact Registry

يتيح Artifact Registry إدارة صور الحاويات وحِزم اللغات. تتطلّب أنواع العناصر المختلفة مواصفات مختلفة. على سبيل المثال، تختلف طلبات مكوّنات Maven عن طلبات مكوّنات Node.

لتتوافق مع مواصفات واجهة برمجة التطبيقات المختلفة، يجب أن يعرف Artifact Registry التنسيق الذي تريد أن تتّبعه الردود من واجهة برمجة التطبيقات. لإجراء ذلك، عليك إنشاء مستودع وإدخال العلامة --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 - سجلّ العناصر - المستودعات، ولاحظ مستودع 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 - المستودعات. انقر على container-dev-repo وتأكَّد من أنّ الصورة java-hello-world متوفّرة. انقر على الصورة ولاحظ الصورة التي تم وضع علامة tag1 عليها. يمكنك معرفة ما إذا كان "فحص الثغرات الأمنية" قيد التشغيل أو مكتملاً وأن عدد الثغرات المكتشَفة ظاهر.

9cb46d3689b3ed2.png

انقر على عدد الثغرات الأمنية وستظهر لك قائمة الثغرات الأمنية التي تم رصدها في الصورة، مع اسم نشرة CVE وشدتها. يمكنك النقر على "عرض" في كل ثغرة أمنية مُدرَجة للحصول على مزيد من التفاصيل:

2b17e9d26d9dd7ea.png

4. الدمج مع رمز السحابة الإلكترونية

في هذا القسم، ستتعرّف على كيفية استخدام مستودع صور Docker في Artifact Registry مع Cloud Code.

نشر التطبيق في مجموعة GKE من رمز Cloud

شغِّل الأمر التالي من مجلد java-hello-world لفتح "محرر Cloud Shell" وإضافة مجلد التطبيق إلى مساحة العمل:

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

انقر على شريط الحالة الخاص برمز السحابة الإلكترونية (في أسفل يمين الصفحة) ثم اختَر Run on Kubernetes.

e6e2b06467228e18.png

عندما يُطلب منك ذلك، اختَر Yes لاستخدام السياق الحالي في kubeconfig الذي يشير إلى مجموعة container-dev-cluster GKE التي تم توفيرها للتجربة.

في طلب تسجيل الصور، أدخِل الموقع الجغرافي للعنوان الذي حدّدته قبل التأكّد من استبدال <PROJECT_ID> بالقيمة الفعلية.

us-central1-docker.pkg.dev/<PROJECT_ID>/container-dev-repo

عند تنفيذ "التشغيل على Kubernetes" للمرة الأولى، سيطلب منك Cloud Code تحديد موقع مستودع الصور المستهدَف. بعد تقديم عنوان URL للمستودع، يتم تخزينه في الملف .vscode/launch.json الذي يتم إنشاؤه في مجلد التطبيق.

في جزء النتائج، ستلاحظ أنّ عملية الإنشاء تبدأ لصورة التطبيق java-hello-world,. تم تحميل الصورة إلى مستودع Artifact Registry الذي تم ضبطه سابقًا.

انتقِل إلى Cloud Console - Artifact Registry - Repositories (وحدة تحكّم Cloud Console - سجلّ العناصر - المستودعات). انقر على container-dev-repo وتأكَّد من أنّ صورة java-hello-world متوفّرة، ولاحظ صورة جديدة تم وضع علامة عليها latest.

مراجعة التطبيق المنشور

الرجوع إلى محرِّر Cloud Shell: عند اكتمال النشر، سيطبع Skaffold/Cloud Code عنوان URL الذي تمت إعادة توجيه الخدمة إليه، وانقر على الرابط - Open Web Preview:

33257a43826b88ff.png

في نافذة المتصفّح الجديدة، ستظهر لك صفحة تطبيق "مرحبًا بك".

d3e49693b0383a5d.png

تعديل رمز التطبيق

عدِّل التطبيق الآن للاطّلاع على التغيير الذي تم تنفيذه على الفور في عملية النشر على المجموعة:

افتح مجلد HelloWorldController.java في src/main/java/cloudcode/helloworld/web في محرِّر Cloud Shell.

غيِّر النص في الصف 20 من "جارٍ التنفيذ" إلى "تم التحديث"، ومن المفترض أن تبدأ عملية الإنشاء والنشر على الفور.

في نهاية عملية النشر، انقر مرة أخرى على عنوان URL المُعاد توجيهه أو أعِد تحميل نافذة المتصفّح التي تتضمّن التطبيق للاطّلاع على التغيير الذي تم نشره:

41787b1da54ff137.png

انتقِل مرة أخرى إلى Cloud Console - سجلّ العناصر - المستودعات. انقر على container-dev-repo وتأكَّد من أنّ صورة java-hello-world متوفّرة، وسجِّل الصورة الجديدة.

5- العمل مع حِزم اللغات

في هذا القسم، ستتعرّف على كيفية إعداد مستودع 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 - سجلّ العناصر - المستودعات، ولاحظ مستودع Maven الذي تم إنشاؤه حديثًا باسم container-dev-java-repo. إذا نقرت عليه، ستلاحظ أنّه فارغ في الوقت الحالي.

إعداد المصادقة في "مستودع العناصر"

استخدِم الأمر التالي لتعديل الموقع المعروف لـ "بيانات اعتماد التطبيق التلقائية" (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 وأضف الإعدادات المعروضة إلى الأقسام المناسبة في الملف.

تعديل القسم 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 - المستودعات انقر على container-dev-java-repo وتأكَّد من توفّر العنصر الثنائي لنظام التشغيل hello-world:

e348d976ac1ac107.png

6- تهانينا!

تهانينا، لقد أكملت دورة codelab.

المحتوى الذي سبق لك تغطيته

  • تم إنشاء مستودعات للحاويات وحِزم اللغات
  • صور الحاويات المُدارة باستخدام Artifact Registry
  • خدمة Artifact Registry المدمجة مع رمز Cloud
  • تم إعداد Maven لاستخدام Artifact Registry لتبعيات Java.

تنظيف

نفِّذ الأمر التالي لحذف المشروع.

gcloud projects delete $PROJECT_ID