برنامه نویسی

پیاده سازی GitOps با Argocd – DEV Community

Summarize this content to 400 words in Persian Lang
هدف این پروژه نشان دادن نحوه ادغام مفاهیم GitOps با استفاده از GitHub Actions، ArgoCD و Kubernetes است.

از طریق این راهنما، می‌توانید تغییرات را به‌طور خودکار از طریق GitHub Actions و ArgoCD ایجاد کنید. در این مثال، Kubernetes و ArgoCD را از طریق Minikube اجرا خواهیم کرد.

پیش نیازها

راه اندازی خارجی

به پانل Dockerhub خود بروید و یک توکن شخصی ایجاد کنید

یک فورک از این پروژه ایجاد کنید و به صفحه تنظیمات پروژه بروید.

را کلیک کنید Secrets and variables > Actions و 3 متغیر ایجاد کنید:

DOCKER_USERNAME – نام کاربری Dockerhub شما

DOCKER_REGISTRY – docker.io

DOCKER_PASSWORD – توکن شخصی ایجاد شده در مرحله قبل

راه اندازی محلی

Docker را راه اندازی کنید
minikube را راه اندازی کنید

minikube start

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگامی که minikube آماده و اجرا شد، دو وابستگی پروژه را نصب کنید:

نصب Argocd

به پوشه بروید infra/k8s و موارد زیر را اجرا کنید:

kubectl apply -k kustomization.yaml

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نصب Skater Reloader

Stakater Reloader را می توان با استفاده از پیکربندی راه دور آن اعمال کرد. برای انجام این کار، دستور زیر را اجرا کنید:

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پیکربندی Argocd

اول از همه، شما باید به کنسول Argocd دسترسی داشته باشید. برای انجام این کار، دستور را اجرا کنید:

minikube service argocd-server -n argocd –url

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی چیزی شبیه این خواهد بود:

http://127.0.0.1:55643

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون می توانید با استفاده از لینک بالا به کنسول Argocd دسترسی پیدا کنید.

به طور پیش فرض، Argocd دارای کاربر ادمین فعال و رمز عبور پیش فرض است. برای تجسم این رمز عبور باید:

غلاف مسئول argocd-server را شناسایی کنید

kubectl get pods -n argocd

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی چیزی شبیه این خواهد بود

نام
آماده
وضعیت
شروع مجدد
سن

argocd-application-controller-0
1/1
در حال دویدن
0
125 متر

argocd-applicationset-controller-86fc5c85-bgt82
1/1
در حال دویدن
0
125 متر

argocd-dex-server-7f4689df5-p8fwx
1/1
در حال دویدن
0
125 متر

argocd-notifications-controller-59f78959c8-m2fsh
1/1
در حال دویدن
0
125 متر

argocd-redis-74cb89f466-t549k
1/1
در حال دویدن
0
125 متر

argocd-repo-server-6578ccfc67-txds5
1/1
در حال دویدن
0
125 متر

argocd-server-854c79df45-ff5zs
1/1
در حال دویدن
0
125 متر

غلاف مورد نیاز ما غلاف است argocd-server-854c79df45-ff5zs. پس از شناسایی پاد، دستور زیر را برای دریافت رمز عبور پیش فرض اجرا کنید:

kubectl exec -it argocd-server-854c79df45-ff5zs -n argocd — argocd admin initial-password

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی چیزی شبیه به این خواهد بود:

Sqfjox8ceceIosuW

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یا

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath=”{.data.password}” | base64 -d

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی چیزی شبیه به این خواهد بود:

Sqfjox8ceceIosuW%

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

فینال را نادیده بگیرید %

با توجه به آن، اکنون باید به کنسول Argocd دسترسی داشته باشید. به url ایجاد شده توسط minikube بروید و وارد شوید admin به عنوان نام کاربری و رمز عبور نمایش داده شده توسط دستور بالا.

به محض ورود، صفحه ای مانند این را مشاهده خواهید کرد

در پروژه شما، زمانی که این پروژه را از ابتدا ایجاد می کنید، خالی خواهد بود. در اسکرین شات خود، من قبلاً برنامه را ایجاد کرده ام و به همین دلیل می توانید آن را در تصویر فهرست شده مشاهده کنید.

حرکت به Settings > Repositories

را کلیک کنید Connect Repo. در این مرحله باید یک کلید ssh ایجاد کنید و Argocd را از طریق ssh به مخزن Github خود متصل کنید.

دستور زیر را اجرا کنید:

ssh-keygen -t ed25519 -C “” -f gitops-argocd -P “”

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی چیزی شبیه به این خواهد بود:

Generating public/private ed25519 key pair.
Your identification has been saved in gitops-argocd
Your public key has been saved in gitops-argocd.pub
The key fingerprint is:
SHA256:7FXbnyKfvckbD1eMhXvTDfyPqaS23sVCa0WGlBsK7UY
The key’s randomart image is:
+–[ED25519 256]–+
| . .. |
| . E.oo . |
| + .oo* .|
| . +..= Bo|
| S.. o =.B|
| . . . + ==|
| . .=.*o+|
| .=o+=o+|
| o+.oo *+|
+—-[SHA256]—–+

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کلید را با پسوند pub. کپی کنید

cat gitops-argocd.pub

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به مخزن Github خود بروید و روی آن کلیک کنید Settings > Deploy keys > Add deploy key

آن را نامگذاری کنید و کلید کپی شده را جایگذاری کنید.

حالا به کنسول Argocd برگردید و روی آن کلیک کنید Connect Repo. کلیدی را که تولید کرده اید قرار دهید و روی آن کلیک کنید Connect.

مخزن فهرست شده را خواهید دید. مطمئن شوید که می توانید وضعیت را ببینید Successful

روی 3 نقطه کلیک کنید تا منو باز شود و سپس Create Application

شما به صفحه داشبورد هدایت می شوید که در آنجا می توانید برنامه را ایجاد کنید.

برای قسمت Project باید پیش فرض را انتخاب کنید.

تا قسمت Source به پایین اسکرول کنید

فیلدها را به صورت زیر پر کنید:

Revision: شاخه ای که می خواهید همگام سازی کنید، در این مثال ما main را همگام سازی می کنیم
Path: محل پوشه ای که Argocd می تواند مانیفست های kubernetes را پیدا کند. در این پروژه به infra/k8s

برای بخش مقصد، فیلدها را با مقادیر زیر پر کنید:

URL مخزن: در جعبه ترکیبی انتخاب کنید
فضای نام: Defautl

به بخش آخر بروید و مطمئن شوید که دایرکتوری را انتخاب کرده اید.

در قسمت exclude اضافه کنید kustomization.yaml. این برای جلوگیری از Argocd برای بازسازی خود است.

پس از اتمام، روی Create در بالای modal کلیک کنید و voilà، برنامه شما تقریباً تمام شده است.

روی App Details کلیک کنید، تا «SYNC POLICY» بروید و در AUTOMATED روی SYNC کلیک کنید. این برای نظارت Argocd بر مخزن / شاخه / مسیر کافی است.

در نهایت، برنامه شما به شکل زیر خواهد بود:

اگر نمی توانید این را ببینید، فقط روی دکمه SYNC در بالای صفحه کلیک کنید و Argocd با مخزن شما همگام سازی می شود.

همانطور که در مرحله قبل همگام سازی خودکار را فعال کرده اید، Argocd هر 3 دقیقه یک بار مخزن را تماشا می کند. فقط با زدن دکمه App Details و غیرفعال کردن آن در بخش POLICY SYNC می‌توانید آن را غیرفعال کنید.

هر بار که می خواهید برنامه خود را همگام کنید، فقط روی SYNC کلیک کنید و Argocd مانیفست های شما را در داخل kubernetes به روز می کند.

چگونه آن را تست کنیم؟

سه راه برای اجرای این پروژه وجود دارد:

انجام هر گونه تغییر در پوشه src
ایجاد یک تگ جدید
تغییر kubernetes در infra/k8s آشکار می شود

انجام هر گونه تغییر در پوشه src

این ساده ترین راه برای آزمایش آن است. فقط کافیست هر تغییری را در پوشه src انجام دهید و آن را انجام دهید. یک PR باز کنید و تغییرات را در شاخه اصلی ادغام کنید. این خط لوله را راه اندازی می کند و تصویر داکر جدید را ایجاد می کند. تصویر را به رجیستری کانتینر هدایت می کند، در این مثال ما از docker.io استفاده می کنیم.

خط لوله تصویر را به رجیستری docker منتقل می کند و فایل infra/k8s/deployment.yaml و شاخه اصلی را با نام تصویر جدید به روز می کند.

Argocd تغییر را تشخیص داده و استقرار kubernetes را با تصویر جدید به روز می کند. نام تگ تصویر همیشه خواهد بود latest

ایجاد یک تگ جدید

این دومین راه برای تست آن است. فقط یک تگ جدید ایجاد کنید و آن را فشار دهید. این فرآیند همان جریان قبلی را دنبال می کند، با این حال، تصویر برچسب را به عنوان نام تگ خود می گیرد.

تغییر kubernetes در infra/k8s آشکار می شود

این سومین راه تست آن است. فقط کافی است هر تغییری را در پوشه infra/k8s اعمال کنید و آن را به مخزن فشار دهید. در این صورت، Github Actions راه اندازی نمی شود و Argocd هر چیزی را که تغییر داده اید به روز می کند.

به عنوان مثال، فرض کنید مقداری را در configmap تغییر داده اید. Argocd این را شناسایی می کند و فقط کانفیگ مپ را به روز می کند، زیرا این تنها مانیفست به روز شده است.

چگونه اپلیکیشن را تجسم کنیم؟

این پروژه دارای یک برنامه NodeJs است که صفحه index.html ساده را نشان می دهد. در کانفیگ مپ، یک متغیر COLOR وجود دارد. این متغیر به index.html منعکس می شود

COLOR روی عنوان “GitOps – ArgoCD” و “Check my Github” تاثیر می گذارد.

Minikube برای دسترسی به سرویس از دستگاه محلی شما نیاز به ارائه پورت و آدرس اینترنتی دارد. برای انجام این کار، دستور را اجرا کنید:

minikube service argocd-server -n argocd –url

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی چیزی شبیه این خواهد بود:

http://127.0.0.1:55643

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این URL را در مرورگر خود باز کنید و برنامه را بررسی کنید. برای مشاهده عملکرد تمام جریان، سعی کنید رنگ را در configmap تغییر دهید و تغییرات را به شاخه اصلی فشار دهید. یک لحظه صبر کنید تا Argocd تغییرات را مجدداً شناسایی کند و شروع به ایجاد تغییرات کند. با دسترسی به کنسول Argocd می توانید این عملیات را دنبال کنید.

هنگامی که به روز رسانی انجام شد، فقط صفحه برنامه اکسپرس را رفرش کنید و تمام. اگر رنگ معتبری را وارد کرده باشید و این راهنما را به درستی دنبال کنید، تغییرات را مشاهده خواهید کرد.

می توانید پروژه کامل را اینجا ببینید

هدف این پروژه نشان دادن نحوه ادغام مفاهیم GitOps با استفاده از GitHub Actions، ArgoCD و Kubernetes است.

از طریق این راهنما، می‌توانید تغییرات را به‌طور خودکار از طریق GitHub Actions و ArgoCD ایجاد کنید. در این مثال، Kubernetes و ArgoCD را از طریق Minikube اجرا خواهیم کرد.

پیش نیازها

راه اندازی خارجی

به پانل Dockerhub خود بروید و یک توکن شخصی ایجاد کنید

توضیحات تصویر

یک فورک از این پروژه ایجاد کنید و به صفحه تنظیمات پروژه بروید.

توضیحات تصویر

را کلیک کنید Secrets and variables > Actions و 3 متغیر ایجاد کنید:

  • DOCKER_USERNAME – نام کاربری Dockerhub شما
  • DOCKER_REGISTRY – docker.io
  • DOCKER_PASSWORD – توکن شخصی ایجاد شده در مرحله قبل

توضیحات تصویر

راه اندازی محلی

  • Docker را راه اندازی کنید
  • minikube را راه اندازی کنید
minikube start
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگامی که minikube آماده و اجرا شد، دو وابستگی پروژه را نصب کنید:

نصب Argocd

به پوشه بروید infra/k8s و موارد زیر را اجرا کنید:

kubectl apply -k kustomization.yaml
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نصب Skater Reloader

Stakater Reloader را می توان با استفاده از پیکربندی راه دور آن اعمال کرد. برای انجام این کار، دستور زیر را اجرا کنید:

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پیکربندی Argocd

اول از همه، شما باید به کنسول Argocd دسترسی داشته باشید. برای انجام این کار، دستور را اجرا کنید:

minikube service argocd-server -n argocd --url
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی چیزی شبیه این خواهد بود:

http://127.0.0.1:55643
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون می توانید با استفاده از لینک بالا به کنسول Argocd دسترسی پیدا کنید.

به طور پیش فرض، Argocd دارای کاربر ادمین فعال و رمز عبور پیش فرض است. برای تجسم این رمز عبور باید:

  • غلاف مسئول argocd-server را شناسایی کنید
kubectl get pods -n argocd
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی چیزی شبیه این خواهد بود

نام آماده وضعیت شروع مجدد سن
argocd-application-controller-0 1/1 در حال دویدن 0 125 متر
argocd-applicationset-controller-86fc5c85-bgt82 1/1 در حال دویدن 0 125 متر
argocd-dex-server-7f4689df5-p8fwx 1/1 در حال دویدن 0 125 متر
argocd-notifications-controller-59f78959c8-m2fsh 1/1 در حال دویدن 0 125 متر
argocd-redis-74cb89f466-t549k 1/1 در حال دویدن 0 125 متر
argocd-repo-server-6578ccfc67-txds5 1/1 در حال دویدن 0 125 متر
argocd-server-854c79df45-ff5zs 1/1 در حال دویدن 0 125 متر

غلاف مورد نیاز ما غلاف است argocd-server-854c79df45-ff5zs. پس از شناسایی پاد، دستور زیر را برای دریافت رمز عبور پیش فرض اجرا کنید:

kubectl exec -it argocd-server-854c79df45-ff5zs -n argocd -- argocd admin initial-password
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی چیزی شبیه به این خواهد بود:

Sqfjox8ceceIosuW
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یا

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی چیزی شبیه به این خواهد بود:

Sqfjox8ceceIosuW%
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

فینال را نادیده بگیرید %

با توجه به آن، اکنون باید به کنسول Argocd دسترسی داشته باشید. به url ایجاد شده توسط minikube بروید و وارد شوید admin به عنوان نام کاربری و رمز عبور نمایش داده شده توسط دستور بالا.

توضیحات تصویر

به محض ورود، صفحه ای مانند این را مشاهده خواهید کرد

توضیحات تصویر

در پروژه شما، زمانی که این پروژه را از ابتدا ایجاد می کنید، خالی خواهد بود. در اسکرین شات خود، من قبلاً برنامه را ایجاد کرده ام و به همین دلیل می توانید آن را در تصویر فهرست شده مشاهده کنید.

حرکت به Settings > Repositories

توضیحات تصویر

را کلیک کنید Connect Repo. در این مرحله باید یک کلید ssh ایجاد کنید و Argocd را از طریق ssh به مخزن Github خود متصل کنید.

دستور زیر را اجرا کنید:

ssh-keygen -t ed25519 -C "" -f gitops-argocd -P ""
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی چیزی شبیه به این خواهد بود:

Generating public/private ed25519 key pair.
Your identification has been saved in gitops-argocd
Your public key has been saved in gitops-argocd.pub
The key fingerprint is:
SHA256:7FXbnyKfvckbD1eMhXvTDfyPqaS23sVCa0WGlBsK7UY 
The key's randomart image is:
+--[ED25519 256]--+
|         .  ..   |
|        . E.oo . |
|         + .oo* .|
|       .  +..= Bo|
|        S.. o =.B|
|       . . . + ==|
|        .  .=.*o+|
|          .=o+=o+|
|         o+.oo *+|
+----[SHA256]-----+
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کلید را با پسوند pub. کپی کنید

cat gitops-argocd.pub
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به مخزن Github خود بروید و روی آن کلیک کنید Settings > Deploy keys > Add deploy key

توضیحات تصویر

آن را نامگذاری کنید و کلید کپی شده را جایگذاری کنید.

حالا به کنسول Argocd برگردید و روی آن کلیک کنید Connect Repo. کلیدی را که تولید کرده اید قرار دهید و روی آن کلیک کنید Connect.

توضیحات تصویر

مخزن فهرست شده را خواهید دید. مطمئن شوید که می توانید وضعیت را ببینید Successful

توضیحات تصویر

روی 3 نقطه کلیک کنید تا منو باز شود و سپس Create Application

توضیحات تصویر

شما به صفحه داشبورد هدایت می شوید که در آنجا می توانید برنامه را ایجاد کنید.

توضیحات تصویر

برای قسمت Project باید پیش فرض را انتخاب کنید.

تا قسمت Source به پایین اسکرول کنید

توضیحات تصویر

فیلدها را به صورت زیر پر کنید:

  • Revision: شاخه ای که می خواهید همگام سازی کنید، در این مثال ما main را همگام سازی می کنیم
  • Path: محل پوشه ای که Argocd می تواند مانیفست های kubernetes را پیدا کند. در این پروژه به infra/k8s

برای بخش مقصد، فیلدها را با مقادیر زیر پر کنید:

  • URL مخزن: در جعبه ترکیبی انتخاب کنید
  • فضای نام: Defautl

توضیحات تصویر

به بخش آخر بروید و مطمئن شوید که دایرکتوری را انتخاب کرده اید.

در قسمت exclude اضافه کنید kustomization.yaml. این برای جلوگیری از Argocd برای بازسازی خود است.

پس از اتمام، روی Create در بالای modal کلیک کنید و voilà، برنامه شما تقریباً تمام شده است.

روی App Details کلیک کنید، تا «SYNC POLICY» بروید و در AUTOMATED روی SYNC کلیک کنید. این برای نظارت Argocd بر مخزن / شاخه / مسیر کافی است.

در نهایت، برنامه شما به شکل زیر خواهد بود:

توضیحات تصویر

اگر نمی توانید این را ببینید، فقط روی دکمه SYNC در بالای صفحه کلیک کنید و Argocd با مخزن شما همگام سازی می شود.

همانطور که در مرحله قبل همگام سازی خودکار را فعال کرده اید، Argocd هر 3 دقیقه یک بار مخزن را تماشا می کند. فقط با زدن دکمه App Details و غیرفعال کردن آن در بخش POLICY SYNC می‌توانید آن را غیرفعال کنید.

هر بار که می خواهید برنامه خود را همگام کنید، فقط روی SYNC کلیک کنید و Argocd مانیفست های شما را در داخل kubernetes به روز می کند.

چگونه آن را تست کنیم؟

سه راه برای اجرای این پروژه وجود دارد:

  • انجام هر گونه تغییر در پوشه src
  • ایجاد یک تگ جدید
  • تغییر kubernetes در infra/k8s آشکار می شود

انجام هر گونه تغییر در پوشه src

این ساده ترین راه برای آزمایش آن است. فقط کافیست هر تغییری را در پوشه src انجام دهید و آن را انجام دهید. یک PR باز کنید و تغییرات را در شاخه اصلی ادغام کنید. این خط لوله را راه اندازی می کند و تصویر داکر جدید را ایجاد می کند. تصویر را به رجیستری کانتینر هدایت می کند، در این مثال ما از docker.io استفاده می کنیم.

خط لوله تصویر را به رجیستری docker منتقل می کند و فایل infra/k8s/deployment.yaml و شاخه اصلی را با نام تصویر جدید به روز می کند.

Argocd تغییر را تشخیص داده و استقرار kubernetes را با تصویر جدید به روز می کند. نام تگ تصویر همیشه خواهد بود latest

ایجاد یک تگ جدید

این دومین راه برای تست آن است. فقط یک تگ جدید ایجاد کنید و آن را فشار دهید. این فرآیند همان جریان قبلی را دنبال می کند، با این حال، تصویر برچسب را به عنوان نام تگ خود می گیرد.

تغییر kubernetes در infra/k8s آشکار می شود

این سومین راه تست آن است. فقط کافی است هر تغییری را در پوشه infra/k8s اعمال کنید و آن را به مخزن فشار دهید. در این صورت، Github Actions راه اندازی نمی شود و Argocd هر چیزی را که تغییر داده اید به روز می کند.

به عنوان مثال، فرض کنید مقداری را در configmap تغییر داده اید. Argocd این را شناسایی می کند و فقط کانفیگ مپ را به روز می کند، زیرا این تنها مانیفست به روز شده است.

چگونه اپلیکیشن را تجسم کنیم؟

این پروژه دارای یک برنامه NodeJs است که صفحه index.html ساده را نشان می دهد. در کانفیگ مپ، یک متغیر COLOR وجود دارد. این متغیر به index.html منعکس می شود

توضیحات تصویر

COLOR روی عنوان “GitOps – ArgoCD” و “Check my Github” تاثیر می گذارد.

Minikube برای دسترسی به سرویس از دستگاه محلی شما نیاز به ارائه پورت و آدرس اینترنتی دارد. برای انجام این کار، دستور را اجرا کنید:

minikube service argocd-server -n argocd --url
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی چیزی شبیه این خواهد بود:

http://127.0.0.1:55643
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این URL را در مرورگر خود باز کنید و برنامه را بررسی کنید. برای مشاهده عملکرد تمام جریان، سعی کنید رنگ را در configmap تغییر دهید و تغییرات را به شاخه اصلی فشار دهید. یک لحظه صبر کنید تا Argocd تغییرات را مجدداً شناسایی کند و شروع به ایجاد تغییرات کند. با دسترسی به کنسول Argocd می توانید این عملیات را دنبال کنید.

هنگامی که به روز رسانی انجام شد، فقط صفحه برنامه اکسپرس را رفرش کنید و تمام. اگر رنگ معتبری را وارد کرده باشید و این راهنما را به درستی دنبال کنید، تغییرات را مشاهده خواهید کرد.

می توانید پروژه کامل را اینجا ببینید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا