1. بررسی اجمالی
جنکینز یکی از محبوب ترین راه حل های ادغام پیوسته موجود است. برای خودکارسازی بخشهای ضروری غیرانسانی فرآیند توسعه نرمافزار استفاده میشود. با استقرار Jenkins در Kubenetes در Google Cloud و استفاده از افزونه GKE، میتوانیم بهسرعت و بهطور خودکار مجریهای ساخت را در صورت نیاز مقیاسبندی کنیم. در ترکیب با Cloud Storage، ما قادر به ساخت و آزمایش یک برنامه با حداقل تلاش هستیم.
کاری که خواهی کرد
- جنکینز را در یک خوشه Kubernetes مستقر کنید
- استقرار و پیکربندی پلاگین Jenkins GKE برای فعال کردن Jenkins برای ایجاد و از بین بردن pod ها به عنوان گره های اجرایی
- یک نمونه برنامه SpringBoot را بسازید و آزمایش کنید
- یک کانتینر در Google Container Registry بسازید و منتشر کنید
- برنامه نمونه را در محیط مرحلهبندی و تولید GKE مستقر کنید
آنچه شما نیاز دارید
- پروژه Google Cloud با تنظیم صورتحساب. اگر ندارید باید یکی بسازید .
2. راه اندازی
این کد لبه می تواند به طور کامل در پلتفرم Google Cloud بدون هیچ گونه نصب یا پیکربندی محلی اجرا شود.
پوسته ابری
در سراسر این کد، ما منابع و خدمات مختلف ابری را با استفاده از خط فرمان از طریق Cloud Shell ارائه و مدیریت خواهیم کرد.
API ها را فعال کنید
در اینجا APIهایی هستند که باید در پروژه خود فعال کنیم:
- Compute Engine API - ماشین های مجازی را ایجاد و اجرا می کند
- Kubernetes Engine API - برنامه های کاربردی مبتنی بر کانتینر را می سازد و مدیریت می کند
- Cloud Build API - پلت فرم پیوسته ادغام و تحویل مداوم Google Cloud
- API مدیریت خدمات - به تولیدکنندگان سرویس اجازه می دهد خدمات را در پلتفرم Google Cloud منتشر کنند
- Cloud Resource Manager API - ایجاد، خواندن و بهروزرسانی متادیتا برای محفظههای منابع Google Cloud
API های مورد نیاز را با دستور gcloud زیر فعال کنید:
gcloud services enable compute.googleapis.com \ container.googleapis.com \ cloudbuild.googleapis.com \ servicemanagement.googleapis.com \ cloudresourcemanager.googleapis.com \ --project ${GOOGLE_CLOUD_PROJECT}
یک سطل GCS ایجاد کنید
برای آپلود کار آزمایشی خود به یک سطل GCS نیاز داریم. بیایید یک سطل با استفاده از ID پروژه خود در نام ایجاد کنیم تا از منحصر به فرد بودن اطمینان حاصل کنیم:
gsutil mb gs://${GOOGLE_CLOUD_PROJECT}-jenkins-test-bucket/
3. ایجاد خوشه های Kubernetes
Cluster را ایجاد کنید
در مرحله بعد، ما یک خوشه GKE ایجاد خواهیم کرد که میزبان سیستم Jenkins ما خواهد بود، از جمله غلاف هایی که به عنوان گره های کارگر ارسال می شوند. دامنه اضافی نشان داده شده توسط پرچم --scopes
به جنکینز امکان دسترسی به مخازن منبع ابری و رجیستری کانتینر را می دهد. در Cloud Console موارد زیر را اجرا کنید:
gcloud container clusters create jenkins-cd \ --machine-type n1-standard-2 --num-nodes 1 \ --zone us-east1-d \ --scopes "https://www.googleapis.com/auth/source.read_write,cloud-platform" \ --cluster-version latest
بیایید همچنین 2 خوشه را برای میزبانی ساختهای مرحلهبندی و تولید برنامه نمونه خود مستقر کنیم:
gcloud container clusters create staging \ --machine-type n1-standard-2 --num-nodes 1 \ --zone us-east1-d \ --cluster-version latest
gcloud container clusters create prod \ --machine-type n1-standard-2 --num-nodes 2 \ --zone us-east1-d \ --cluster-version latest
تأیید کنید
پس از ایجاد خوشهها، میتوانیم تأیید کنیم که آنها با gcloud container clusters list
در حال اجرا هستند.
خروجی باید در ستون STATUS
RUNNING
باشد:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS jenkins-cd us-east1-d 1.15.9-gke.9 34.74.77.124 n1-standard-2 1.15.9-gke.9 2 RUNNING prod us-east1-d 1.15.9-gke.9 35.229.98.12 n1-standard-2 1.15.9-gke.9 2 RUNNING staging us-east1-d 1.15.9-gke.9 34.73.92.228 n1-standard-2 1.15.9-gke.9 2 RUNNING
4. جنکینز را با هلم مستقر کنید
Helm را نصب کنید
ما از Helm، یک مدیر بسته برنامه برای Kubernetes، برای نصب Jenkins در کلاستر خود استفاده خواهیم کرد. برای شروع، پروژهای را دانلود کنید که شامل مانیفستهای Kubernetes است که برای استقرار Jenkins استفاده میکنیم:
git clone https://github.com/GoogleCloudPlatform/continuous-deployment-on-kubernetes.git ~/continuous-deployment-on-kubernetes
دایرکتوری کاری فعلی خود را به دایرکتوری پروژه تغییر دهید:
cd ~/continuous-deployment-on-kubernetes/
برای اعطای مجوزهای نقش مدیر کلاستر، یک پیوند نقش خوشه ایجاد کنید:
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=$(gcloud config get-value account)
با دریافت اعتبارنامه به خوشه جنکینز خود متصل شوید:
gcloud container clusters get-credentials jenkins-cd --zone us-east1-d --project ${GOOGLE_CLOUD_PROJECT}
و باینری Helm را در Cloud Console خود دانلود کنید:
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.14.1-linux-amd64.tar.gz
فایل را از حالت فشرده خارج کنید و فایل فرمان موجود را در فهرست کاری فعلی خود کپی کنید:
tar zxfv helm-v2.14.1-linux-amd64.tar.gz && \ cp linux-amd64/helm .
Tiller سمت سرور Helm است که روی خوشه Kubernetes اجرا می شود. بیایید یک حساب سرویس به نام tiller
ایجاد کنیم:
kubectl create serviceaccount tiller \ --namespace kube-system
و آن را به نقش cluster-admin
cluster متصل کنید تا بتواند تغییراتی ایجاد کند:
kubectl create clusterrolebinding tiller-admin-binding \ --clusterrole=cluster-admin \ --serviceaccount=kube-system:tiller
اکنون می توانیم Helm را مقداردهی اولیه کنیم و مخزن را به روز کنیم:
./helm init --service-account=tiller && \ ./helm repo update
تأیید کنید
تأیید کنید که Helm با ./helm version
مناسب است - این باید شماره نسخه مشتری و سرور را برگرداند:
Client: &version.Version{SemVer:"v2.14.1", GitCommit:"5270352a09c7e8b6e8c9593002a73535276507c0", GitTreeState:"clean"} Server: &version.Version{SemVer:"v2.14.1", GitCommit:"5270352a09c7e8b6e8c9593002a73535276507c0", GitTreeState:"clean"}
جنکینز را نصب کنید
اکنون که Helm روی خوشه ما نصب شده است، ما برای نصب جنکینز آماده هستیم:
./helm install stable/jenkins -n cd \ -f jenkins/values.yaml \ --version 1.2.2 --wait
تأیید کنید
بیایید غلاف ها را بررسی کنیم:
kubectl get pods
خروجی باید غلاف جنکینز ما را با وضعیت RUNNING نشان دهد:
NAME READY STATUS RESTARTS AGE cd-jenkins-7c786475dd-vbhg4 1/1 Running 0 1m
تأیید کنید که سرویس جنکینز به درستی ایجاد شده است:
kubectl get svc
خروجی باید چیزی شبیه به این باشد:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cd-jenkins ClusterIP 10.35.241.170 <none> 8080/TCP 2m27s cd-jenkins-agent ClusterIP 10.35.250.57 <none> 50000/TCP 2m27s kubernetes ClusterIP 10.35.240.1 <none> 443/TCP 75m
نصب جنکینز از افزونه Kubernetes برای ایجاد عوامل سازنده استفاده خواهد کرد. آنها به طور خودکار توسط استاد جنکینز در صورت نیاز راه اندازی می شوند. هنگامی که کار آنها انجام شد، آنها به طور خودکار خاتمه می یابند و منابع آنها دوباره به مجموعه منابع خوشه اضافه می شود.
به جنکینز متصل شوید
جنکینز در کلاستر ما در حال اجرا است، اما برای دسترسی به رابط کاربری، بیایید انتقال پورت را از Cloud Shell تنظیم کنیم:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/component=jenkins-master" -l "app.kubernetes.io/instance=cd" -o jsonpath="{.items[0].metadata.name}") && kubectl port-forward $POD_NAME 8080:8080 >> /dev/null &
در حین نصب یک رمز عبور مدیریت ایجاد شد. بیایید آن را بازیابی کنیم:
printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
در بالای Cloud Shell، روی نماد Web Preview کلیک کنید و "پیش نمایش در پورت 8080" را انتخاب کنید
ما باید یک صفحه ورود برای جنکینز ببینیم که در آن میتوانیم admin
برای نام کاربری و رمز عبور بازگردانده شده در مرحله قبل وارد کنیم:
وقتی روی Sign in کلیک می کنیم باید به صفحه اصلی جنکینز هدایت شویم.
5. پلاگین GKE را نصب و پیکربندی کنید
افزونه Google Kubernetes Engine به ما امکان می دهد تا استقرارهای ساخته شده در Jenkins را در کلاسترهای Kubernetes خود که در GKE اجرا می شوند منتشر کنیم. تنظیماتی وجود دارد که باید با مجوزهای IAM در پروژه شما انجام شود. ما آن پیکربندی را با استفاده از Terraform اجرا خواهیم کرد.
ابتدا پروژه پلاگین GKE را دانلود کنید:
git clone https://github.com/jenkinsci/google-kubernetes-engine-plugin.git ~/google-kubernetes-engine-plugin
پیکربندی خودکار مجوزهای IAM
دایرکتوری کاری فعلی خود را به دایرکتوری rbac پروژه GKE که قبلاً شبیه سازی کردیم تغییر دهید:
cd ~/google-kubernetes-engine-plugin/docs/rbac/
gcp-sa-setup.tf
یک فایل پیکربندی Terraform است که یک نقش سفارشی GCP IAM با مجوزهای محدود به همراه یک حساب سرویس GCP برای اعطای آن نقش ایجاد می کند. فایل به مقادیری برای متغیرهای نام حساب پروژه، منطقه و سرویس نیاز دارد. ما آن مقادیر را ابتدا با اعلان متغیرهای محیطی زیر ارائه می کنیم:
export TF_VAR_project=${GOOGLE_CLOUD_PROJECT} export TF_VAR_region=us-east1-d export TF_VAR_sa_name=kaniko-role
Terraform را راهاندازی کنید، یک طرح ایجاد کنید و آن را اعمال کنید:
terraform init terraform plan -out /tmp/tf.plan terraform apply /tmp/tf.plan && rm /tmp/tf.plan
حساب سرویس برای ذخیره در سطل فضای ذخیرهسازی ابری ما به مجوزهای سرپرست فضای ذخیرهسازی نیاز دارد:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member serviceAccount:kaniko-role@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com \ --role 'roles/storage.admin'
همچنین برای مراحل استقرار خط لوله ما به مجوزهای کانتینر نیاز دارد:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} --member \ serviceAccount:kaniko-role@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com --role 'roles/container.developer'
اکنون میتوانیم از Helm برای تنظیم مجوزهای کلاستر برای پلاگین GKE با استفاده از توسعهدهنده ربات gke استفاده کنیم. دایرکتوری کاری خود را به دایرکتوری فرمان پروژه GKE تغییر دهید:
cd ~/google-kubernetes-engine-plugin/docs/helm/
و با استفاده از نمودار Helm ارائه شده نصب کنید:
export TARGET_NAMESPACE=kube-system && \ envsubst < gke-robot-deployer/values.yaml | helm install ./gke-robot-deployer --name gke-robot-deployer -f -
6. جنکینز را پیکربندی کنید
کلیدهای حساب خدمات
برای اینکه حساب سرویس به درستی کار کند، باید یک فایل کلید خصوصی تولید کنیم و آن را به عنوان راز Kubernetes اضافه کنیم. ابتدا فایل را با دستور gcloud زیر تولید کنید:
gcloud iam service-accounts keys create /tmp/kaniko-secret.json --iam-account kaniko-role@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
ما یک کلید مخفی در فروشگاه مخفی kubernetes با آن فایل ایجاد می کنیم:
kubectl create secret generic jenkins-int-samples-kaniko-secret --from-file=/tmp/kaniko-secret.json
با دسترسی به آیتم Download File از منوی 3 نقطه ای Cloud Shell، فایل json را در دیسک محلی خود دانلود کنید:
مسیر فایل /tmp/kaniko-secret.json
را وارد کرده و روی Download کلیک کنید.
برگردید به صفحه جنکینز، در سمت چپ، روی Credentials و سپس System کلیک کنید.
در قسمتی از صفحه با عنوان سیستم، روی اعتبار جهانی و سپس افزودن اعتبارنامه در سمت چپ کلیک کنید:
در منوی کشویی Kind، حساب سرویس Google را از کلید خصوصی انتخاب کنید. 'kaniko-role' را به عنوان نام وارد کنید، سپس کلید JSON خود را که در مراحل قبل ایجاد شده بود آپلود کنید و روی OK کلیک کنید.
متغیرهای محیطی
برخی از متغیرهای محیطی وجود دارد که قبل از ایجاد خط لوله چند شاخه، باید جنکینز را تعریف کنیم. آنها عبارتند از:
- JENK_INT_IT_ZONE - منطقه خوشه Kubernetes. در مورد ما
us-east1-d
- JENK_INT_IT_PROJECT_ID - به شناسه پروژه GCP اشاره دارد که میزبان این نمونه از Jenkins است.
- JENK_INT_IT_STAGING - نام خوشه "صحنه سازی" ما، برای اهداف نمایشی
staging
است - JENK_INT_IT_PROD - نام خوشه "prod" ما. برای اهداف نمایشی، آن را
prod
- JENK_INT_IT_BUCKET - سطل Google Cloud Storage ایجاد شده در مرحله قبلی
- JENK_INT_IT_CRED_ID - به اعتبارنامه هایی اشاره دارد که با استفاده از json در مرحله قبل ایجاد شده اند. مقدار باید با نامی که به آن داده ایم،
kaniko-role
مطابقت داشته باشد
برای افزودن این موارد، به مدیریت جنکینز بروید:
سپس سیستم را پیکربندی کنید:
بخشی به نام خصوصیات جهانی وجود خواهد داشت و وقتی کادر متغیرهای محیطی را تیک می زنیم، یک دکمه افزودن دریافت می کنیم تا متغیرهای بالا را به عنوان جفت مقادیر کلیدی اضافه کنیم:
برای اعمال تغییرات روی دکمه ذخیره در پایین صفحه کلیک کنید.
7. یک خط لوله راه اندازی کنید
در جنکینز روی "مورد جدید" کلیک کنید:
"jenkins-integration-sample" را برای نام وارد کنید و "Multibranch Pipeline" را به عنوان نوع پروژه انتخاب کنید و روی OK کلیک کنید:
ما به صفحه پیکربندی خط لوله هدایت می شویم. در زیر شاخه منابع https://github.com/GoogleCloudPlatform/jenkins-integration-samples.git را به عنوان مخزن پروژه وارد کنید. در قسمت Build Configuration 'gke/Jenkinsfile' را به عنوان مسیر اسکریپت وارد کنید.
برای اعمال این تنظیمات روی ذخیره کلیک کنید. پس از ذخیره، جنکینز اسکن مخزن و ساخت بعدی را برای هر شاخه آغاز می کند. همانطور که پیشرفت می کند، با پیشرفت بیلدها در صفحه بارهای کاری Kubernetes، پادهایی ایجاد، اجرا و از بین می روند.
وقتی ساختها به پایان رسید، دو مورد را در صفحه بارهای کاری Kubernetes به نامهای jenkins-integration-samples-gke پیدا خواهید کرد که هر کدام با خوشه تولید یا آزمایش مطابقت دارند. وضعیت OK خواهد بود:
با استفاده از دستور gcloud زیر می بینیم که یک تصویر ظرف را در Google Container Registry مربوط به خط لوله خود آپلود کرده ایم:
gcloud container images list
برای مشاهده حجم کاری در مرورگر خود، اعتبارنامه خوشه تولیدی را دریافت کنید:
gcloud container clusters get-credentials prod --zone us-east1-d --project ${GOOGLE_CLOUD_PROJECT}
و موارد زیر را اجرا کنید تا یک پورت به جلو از پورت 8081 پوسته خود به پورت 8080 بار کاری خود را تنظیم کنید:
export POD_NAME=$(kubectl get pods -o jsonpath="{.items[0].metadata.name}") && kubectl port-forward $POD_NAME 8081:8080 >> /dev/null &
در بالای Cloud Shell، روی نماد Web Preview کلیک کنید و "Preview on port 8081" را انتخاب کنید.
8. پاکسازی
ما نحوه استقرار یک خط لوله جنکینز و نمونه چند شاخه ای را در Kubernetes بررسی کرده ایم. اکنون زمان آن است که پروژه خود را از هر گونه منابعی که ایجاد کرده ایم پاکسازی کنیم.
پروژه را حذف کنید
اگر ترجیح می دهید، می توانید کل پروژه را حذف کنید. در کنسول GCP، به صفحه Cloud Resource Manager بروید:
در لیست پروژه، پروژه ای را که در آن کار می کردیم انتخاب کنید و روی حذف کلیک کنید. از شما خواسته می شود شناسه پروژه را تایپ کنید. آن را وارد کرده و Shut Down را بزنید.
همچنین، میتوانید کل پروژه را مستقیماً از Cloud Shell با gcloud حذف کنید:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
اگر ترجیح می دهید اجزای مختلف قابل پرداخت را یکی یکی حذف کنید، به بخش بعدی بروید.
خوشه Kubernetes
کل خوشه Kubernetes را با gcloud حذف کنید:
gcloud container clusters delete jenkins-cd --zone=us-east1-d
سطل های ذخیره سازی
همه فایل های آپلود شده را حذف کنید و سطل ما را با gsutil حذف کنید:
gsutil rm -r gs://${GOOGLE_CLOUD_PROJECT}-jenkins-test-bucket
تصاویر رجیستری کانتینر Google
تصاویر Google Container Registry را با استفاده از خلاصههای تصویر حذف میکنیم. ابتدا خلاصه ها را با دستور زیر بازیابی کنید:
gcloud container images list-tags gcr.io/${GOOGLE_CLOUD_PROJECT}/jenkins-integration-samples-gke --format="value(digest)"
سپس برای هر خلاصه برگشتی:
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/jenkins-integration-samples-gke@sha256:<DIGEST>
9. تبریک می گویم!
وو هو! شما آن را انجام دادید. شما یاد گرفته اید که چگونه Jenkins را در GKE مستقر کنید و کارها را به خوشه های Kubernetes ارسال کنید.
آنچه را پوشش داده ایم
- ما یک خوشه Kubernetes را مستقر کردیم و از Helm برای نصب Jenkins استفاده کردیم
- ما افزونه GKE را نصب و پیکربندی کردیم تا جنکینز را قادر سازد که مصنوعات ساخت را در خوشه های Kubernetes مستقر کند.
- ما جنکینز را برای راهاندازی خط لوله چندشاخهای پیکربندی کردیم که کار را به خوشههای GKE ارسال میکند.