خط لوله چند شاخه ای جنکینز در GKE

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

28b45298e1e82748.png تأیید کنید

پس از ایجاد خوشه‌ها، می‌توانیم تأیید کنیم که آنها با 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

28b45298e1e82748.png تأیید کنید

تأیید کنید که 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

28b45298e1e82748.png تأیید کنید

بیایید غلاف ها را بررسی کنیم:

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 کلیک کنید 7ddf5a65fd556dd6.png و "پیش نمایش در پورت 8080" را انتخاب کنید

1d614c831a621cff.png

ما باید یک صفحه ورود برای جنکینز ببینیم که در آن می‌توانیم admin برای نام کاربری و رمز عبور بازگردانده شده در مرحله قبل وارد کنیم:

9cba23e856cbc84f.png

وقتی روی Sign in کلیک می کنیم باید به صفحه اصلی جنکینز هدایت شویم.

9261f3e914829137.png

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 را در دیسک محلی خود دانلود کنید:

c40378e72013b843.png

مسیر فایل /tmp/kaniko-secret.json را وارد کرده و روی Download کلیک کنید.

برگردید به صفحه جنکینز، در سمت چپ، روی Credentials و سپس System کلیک کنید.

6c140f7e6bb82f8.png

3b874912cdc8019b.png

در قسمتی از صفحه با عنوان سیستم، روی اعتبار جهانی و سپس افزودن اعتبارنامه در سمت چپ کلیک کنید:

4350c0e68561119b.png

3d3526551cdae8b.png

در منوی کشویی Kind، حساب سرویس Google را از کلید خصوصی انتخاب کنید. 'kaniko-role' را به عنوان نام وارد کنید، سپس کلید JSON خود را که در مراحل قبل ایجاد شده بود آپلود کنید و روی OK کلیک کنید.

b0502213408e730e.png

متغیرهای محیطی

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

  • 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 مطابقت داشته باشد

برای افزودن این موارد، به مدیریت جنکینز بروید:

d54f279190a07878.png

سپس سیستم را پیکربندی کنید:

ce79d218b2799640.png

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

81aa222a2b17b2cc.png

برای اعمال تغییرات روی دکمه ذخیره در پایین صفحه کلیک کنید.

7. یک خط لوله راه اندازی کنید

در جنکینز روی "مورد جدید" کلیک کنید:

8d1270ce4d7b6a8a.png

"jenkins-integration-sample" را برای نام وارد کنید و "Multibranch Pipeline" را به عنوان نوع پروژه انتخاب کنید و روی OK کلیک کنید:

eb071ecfbb4d775b.png

ما به صفحه پیکربندی خط لوله هدایت می شویم. در زیر شاخه منابع https://github.com/GoogleCloudPlatform/jenkins-integration-samples.git را به عنوان مخزن پروژه وارد کنید. در قسمت Build Configuration 'gke/Jenkinsfile' را به عنوان مسیر اسکریپت وارد کنید.

5135bd6b0374508c.png

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

وقتی ساخت‌ها به پایان رسید، دو مورد را در صفحه بارهای کاری Kubernetes به نام‌های jenkins-integration-samples-gke پیدا خواهید کرد که هر کدام با خوشه تولید یا آزمایش مطابقت دارند. وضعیت OK خواهد بود:

bdec6b1753d1ba07.png

با استفاده از دستور 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" را انتخاب کنید.

1b19b5b56f1bae7.png

e80e995e71763bb2.png

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 ارسال می‌کند.