مستندات فنی

دسترسی به تمامی مستندات محصولات ابر آروان

راه‌اندازی پایپلاین ‏CI/CD‏ برای فروشگاه آنلاین روی سرویس پلتفرم ابری آروان

۸ دقیقه
۲۴ بهمن ۹۸

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

در این مقاله سعی شده تمامی مراحلی که برای راه‌اندازی یک سرویس آنلاین مانند یک فروشگاه اینترنتی نیاز است شرح داده شود. به بیان بهتر، هدف این مقاله، آموزش استفاده از پلتفرم ابری آروان برای ایجاد برنامه‌های کاربردی، مانند فروشگاه آنلاین است که نیاز به یک پایگاه داده و یک pipeline جهت build شدن و ساختن container نهایی دارند.

برای این پروژه از clone فروشگاه متن‌باز opencart استفاده شده است تا با قرار دادن کدهای آن روی یک مخزن کد خصوصی، کل پروسه CI/CD آموزش داده شود. این فروشگاه به زبان php است و نیاز به یک پایگاه داده‌ی MySQL دارد.

به‌طور کلی در این مقاله موارد زیر پوشش داده می‌شود:

  • شیوه‌ی ساخت gitlab در پلتفرم ابری آروان
  • ایجاد Dockerfile برای یک پروژه نمونه‌ی php
  • شیوه‌ی ساخت Docker Registry در پلتفرم ابری آروان
  • شیوه‌ی ساخت MySQL در پلتفرم ابری آروان
  • چگونگی Build یک Dockerfile با استفاده از امکانات پلتفرم ابری آروان
  • شیوه‌ی ایجاد یک Deployment
  • چگونگی اتصال gitlab به build و deployment برای ساخت یک فرآیند کامل CI/CD

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

 

پیش‌نیازها

تنها پیش نیاز این سیستم، داشتن حساب‌ کاربری ابر آروان، دسترسی به پلتفرم ابری و هم‌چنین object storage ابر آروان است.

نخست به سایت ابر آروان به نشانی arvancloud.com بروید و یک حساب کاربری بسازید یا در صورت داشتن حساب کاربری، وارد حساب کاربری خود شوید. سپس به بخش پروفایل بروید، در سربرگ API KEYS برای خود یک API KEY جدید بسازید و آن را در جایی ذخیره کنید.

برای انجام مراحل این مقاله نیاز است که از command line ابر آروان استفاده کنید. پس از دانلود command line (در صورت نیاز آن را در PATH خود قرار دهید) با کمک دستور زیر login کنید:

arvan login

سپس API KEY که از سایت دریافت کردید در اینجا کپی کنید.

 

اجزای مورد نیاز

جهت ایجاد فروشگاه آنلاین روی پلتفرم ابری آروان اجزایی نیاز است که در ادامه ایجاد، ساختار و شیوه‌ی کار با هر یک شرح داده می‌شود.

معماری سیستم از دید پلتفرم ابری آروان به شکل زیر است که صرفن به جهت درک بهتر آورده شده است. در ادامه شیوه‌ی ایجاد هر یک از این اجزا بیان خواهد شد.

براساس تصویر بالا، در این سیستم از سه کاتالوگ آماده در پلتفرم ابری آروان استفاده شده است. هم‌چنین، در ادامه از فرآیند build استفاده می‌شود تا نقش pipeline CI/CD را ایفا کند. در انتها پس از ساخت docker image، از آن در deployment فروشگاه آنلاین استفاده می‌شود.

در این مقاله از catalogهای gitlab، mysql و docker registry موجود روی پلتفرم ابری آروان استفاده شده است.

 

ایجاد gitlab

اولین زیرساخت مورد نیاز برای توسعه‌ی هر نرم‌افزاری وجود یک مخزن مدیریت کد (source code management) است. برای پیاده‌سازی این ابزار در این بخش، با استفاده از کاتالوگ پنل پلتفرم ابری آروان، یک gitlab برای پروژه‌ی خود ایجاد کنید.

در پنل پلتفرم ابری از بخش catalog، گزینه‌ی gitlab را انتخاب کنید. می‌توانید تنظیمات را به‌شکل پیش‌فرض رها کنید و صرفن فیلدهای GitLab Root User Password و Gitlab instance hostname را مقداردهی کنید.

 

ایجاد Dockerfile و ارسال کد به gitlab

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

از github کد opencart را روی کامپیوتر خود clone کنید:

git clone https://github.com/opencart/opencart

این پروژه به‌شکل پیش‌فرض شامل Dockerfile نیست. پس برای قرار دادن آن روی پلتفرم ابری آروان، یک Dockerfile ایجاد کنید.

کدهای زیر را در پوشه اصلی پروژه در فایلی به نام Dockerfile ذخیره کنید.

FROM php:7.2-apache
RUN a2enmod rewrite
RUN set -xe \
    && apt-get update \
    && apt-get install -y libpng-dev libjpeg-dev libmcrypt-dev \
    && rm -rf /var/lib/apt/lists/* \
    && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
    && docker-php-ext-install gd mbstring mysqli zip \
    && pecl install mcrypt-1.0.1 \
    && docker-php-ext-enable mcrypt
COPY site-data/ /var/www/html/
WORKDIR /var/www/html/
RUN set -xe \
    && chown -R www-data:www-data /var/www/

چون کد نوشته شده در مثال ما به زبان php است، لازم است از image مناسب استفاده کنید و در اینجا از image php:7.2-apache استفاده شده است که شامل وب سرور هم می‌شود. سپس برخی ابزارها و کتابخانه‌های مورد نیاز برای اجرای کد خود را به آن اضافه کنید. با دستور COPY محتوای فروشگاه آنلاین که کد آن را نوشتید، به پوشه‌ی /var/www درون کانتینر منتقل کنید. این پوشه، پوشه‌ی اصلی apache است و محتوای موجود در آن را serve می‌کند. در انتها permissionها و owner پوشه‌ها را به مقدار درست تغییر دهید تا apache درون کانتینر بتواند این محتوا را serve کند.

فایل اضافه شده را commit کنید:

git add Dockerfile
git commit -m "Dockerfile Added"

حال تمامی کد و تغییر جدید را به gitlabی که در مرحله‌ی قبل ساختید، push کنید. ابتدا در gitlab خود یک repository جدید بسازید. با فرض این‌که repository جدید نام onlineShop داشته باشد و دامنه‌ی gitlabی که ایجاد کردید https://gitlab-example-project.apps.ir-thr-at1.arvan.run باشد (با نام پروژه example)، کد را با دستورات زیر می‌توانید به gitlab جدید ارسال کنید:

git remote remove origin
git remote add origin https://gitlab-example-project.apps.ir-thr-at1.arvan.run/example/onlineShop.git
git push -u origin master

 

ایجاد MySQL

فروشگاه متن باز opencart از پایگاه داده‌ی mysql برای ذخیره‌سازی داده‌های خود استفاده می‌کند.  برای پیاده‌سازی این ابزار در این بخش، با استفاده از کاتالوگ پنل پلتفرم ابری آروان یک پایگاه داده‌ی MySQL برای پروژه‌ی خود ایجاد کنید. در پنل پلتفرم ابری از بخش catalog یک mysql + phpmyadmin بسازید.

ایجاد buildConfig

build، فرآیند تبدیل ورودی، مانند یک کد نوشته شده ( در این مثال کد نوشته شده به زبان php برای فروشگاه آنلاین)، به یک عنصر خروجی، مانند container image (در این مثال image نهایی ساخته شده برای استفاده در deployment)، است که با کمک buildConfig تعریف می‌شود.

فایل زیر شامل تمام تنظیمات مربوط به buildConfig برای فروشگاه آنلاین است. خطوط زیر را کپی و در فایلی به نام shop-buildConfig.yaml ذخیره کنید.

kind: "BuildConfig"
apiVersion: "v1"
metadata:
  name: "shop-build" 
spec:
  runPolicy: "Serial" 
  triggers: 
    -
      type: "GitLab"
      gitlab:
        secretReference:
           name: "webhooksecret"
    - type: ConfigChange
  source: 
    git:
      uri: "https://gitlab-example-project.apps.ir-thr-at1.arvan.run/example/onlineShop.git"
    sourceSecret:
      name: gitsecret
  strategy: 
    dockerStrategy:
      forcePull: true 
  output:
    to:
      kind: "DockerImage"
      name: "myreg-example-project.apps.ir-thr-at1.arvan.run/online-shop:latest"
    pushSecret:
      name: "registrysecret"      
  resources:
    limits:
      cpu: 1500m
      ephemeral-storage: 1G
      memory: 600M
    requests:
      cpu: 1500m
      ephemeral-storage: 1G
      memory: 600M

نکته: دندانه گذاری (indentation) در فایل‌های yaml مهم است و کوچ‌کترین جابه‌جایی می‌تواند سبب برگرداندن خطا و یا تنظیمات ناخواسته شود.

  • spec.runPolicy: این فیلد مشخص می‌کند فرآیندهای build به چه شکل اجرا شوند. این مقدار برابر serial قرار داده می‌شود تا پیش از اتمام یک build، فرآیند build بعدی اجرا نشود.
  • spec.triggers: این فیلد مشخص‌کننده‌ی آن است که فرآیند در چه صورتی اجرا شود. در این نمونه، فرآیند build در صورت push شدن کد در repository مربوطه، به آدرس https://gitlab-example-project.apps.ir-thr-at1.arvan.run/example/onlineShop.git که به‌وسیله‌ی فیلد spec.source مشخص شده است، اجرا می‌شود. برای انجام این عمل، باید در gitlab یک webhook تعریف کرد. این webhook نیازمند یک secret است که به‌وسیله‌ی فیلد spec.triggers.gitlab.secretRefrence.name مشخص و در ادامه شیوه‌ی ساخت آن شرح داده می‌شود.
  • spec.source: مشخص‌کننده‌ی آدرس repository کد است.
  • spec.output.to.name: مشخص‌کننده‌ی نام image container نهایی است که در انتهای فرآیند build ساخته می‌شود. این نام مشخص می‌کند که image تولید شده باید به چه registery ارسال شود. توجه داشته باشید که دامنه‌ی قرار گرفته در این بخش باید برابر دامنه‌ی docker registry ساخته شده در بخش قبل باشد.
  • spec.output.pushSecret: در اینجا باید یک secret، که اطلاعات مربوط به اتصال به docker registry را شامل می‌شود، قرار داد. توضیحات مربوط به این secret در ادامه آمده است.
  • spec.resources: چون فرآیند build، خود به‌وسیله‌ی یک pod اجرا می‌شود، لازم است منابع مورد نیاز این pod مشخص شوند. توجه کنید که این pod به‌شکل موقت اجرا و در پایان فرآیند حذف و به وضعیت completed (در صورت اجرای موفق) وارد می‌شود و دیگر منابعی، تا اجرای مجدد فرآیند، مصرف نمی‌کند.

 

ایجاد secretها

secret یکی از اجزای اصلی است که برای ذخیره‌سازی داده‌هایی مانند password استفاده می‌شود. در این سیستم، همان‌طور که بالاتر نیز بیان شد، از سه نوع secret استفاده می‌شود:

  • یک secret برای استفاده در webhook
  • دیگری برای ذخیره‌سازی اطلاعات اتصال به docker registry شخصی
  • secret سوم برای دسترسی فرآیند build به repository شخصی موجود روی gitlab شخصی شما.

 

ساخت secret مربوط به webhook

برای ساخت secret مربوط به webhook برای gitlab شخصی خود، دستور زیر را در ترمینال وارد کنید.

arvan paas create secret generic webhooksecret --from-literal=WebHookSecretKey=<secret value>

در این‌جا مقدار <secret value> را برابر با هر آن‌چه که می‌خواهید قرار دهید (در این‌جا ما این مقدار را برای نمونه معادل secretvalue1 قرار می‌دهیم). این مقدار در ادامه، در webhook که در gitlab تنظیم می‌شود، مورد استفاده قرار می‌گیرد.

 

ساخت secret مربوط به دسترسی build به gitlab شخصی

با توجه به آن‌که کد شما در یک repository شخصی وجود دارد، لازم است دسترسی‌های لازم به فرآیند build برای دریافت کد شما و آغاز فرآیند build داده شود. در این راستا کافیست دستورات زیر را وارد کنید.

arvan paas create secret generic gitsecret --from-literal=username= --from-literal=password= --type=kubernetes.io/basic-auth
arvan paas secrets link builder gitsecret

ساخت secret مربوط به docker registry

برای ساخت secret مربوط به اطلاعات اتصال به docker registry شخصی خود، دستور زیر را در ترمینال وارد کنید.

arvan paas create secret docker-registry registrysecret --docker-server=<your-registry-server> --docker-‎username=<your-name> --docker-password=<your-password> --docker-email=<your-email>‎

ایجاد deployment

deployment یکی از اجزای اصلی است که وظیفه‌ی مدیریت podها را برعهده دارد. فایل زیر شامل تمام تنظیمات مربوط به deployment برای فروشگاه آنلاین است. خطوط زیر را کپی و در فایلی به نام shop-deployment.yaml ذخیره کنید.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: online-shop
  name: online-shop
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  selector:
    matchLabels:
      app: online-shop
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: online-shop
    spec:
      containers:
      - image: myreg-example-project.apps.ir-thr-at1.arvan.run/online-shop:latest
        imagePullPolicy: Always
        name: online-shop
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          limits:
            cpu: "2"
            ephemeral-storage: 5G
            memory: 2G
          requests:
            cpu: "2"
            ephemeral-storage: 5G
            memory: 2G
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      imagePullSecrets:
      - name: registrysecret
      restartPolicy: Always
      schedulerName: default-scheduler
      terminationGracePeriodSeconds: 30‎

نکته: indentation در فایل‌های yaml مهم است و کوچک‌ترین جابه‌جایی می‌تواند سبب برگرداندن خطا یا تنظیمات ناخواسته شود.

  • spec.template.spec.image: برای این فیلد نام کامل imageای را که در فایل buildConfig به عنوان spec.output.to.name  اختصاص دادید، قرار دهید.
  • spec.template.spec.imagePullSecret: مشخص‌کننده‌ی نام secretای است که برای اتصال به docker registry ایجاد شده است.

 

ایجاد service

فایل زیر شامل تمام تنظیمات مربوط به service برای deployment فروشگاه آنلاین است. خطوط زیر را کپی و در فایلی به نام shop-service.yaml ذخیره کنید.

apiVersion: v1
kind: Service
metadata:
  name: online-shop-service
  labels:
    app: online-shop
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: online-shop
  type: ClusterIP
 </pre/>

نکته: توجه کنید که indentation در فایل‌های yaml مهم است و کوچک‌ترین جابه‌جایی می‌تواند سبب برگرداندن خطا یا تنظیمات ناخواسته شود.

ایجاد route

فایل زیر شامل تمام تنظیمات مربوط به route برای deployment فروشگاه آنلاین است. خطوط زیر را کپی و در فایلی به نام shop-route.yaml ذخیره کنید.

kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: online-shop
  labels:
    app: online-shop-route
  annotations:
spec:
  host: online-shop-example-project.apps.ir-thr-at1.arvan.run
  port:
    targetPort: http
  tls:
    insecureEdgeTerminationPolicy: Allow
    termination: edge
  to:
    kind: Service
    name: online-shop-service
    weight: 100
  wildcardPolicy: None
  

تمامی فایل‌های مورد نیاز برای ساخت یک فروشگاه آنلاین روی پلتفرم ابری آروان تعریف شده‌اند. ساختار نهایی فایل‌های مورد نیاز به شکل زیر است.

چون در deployment این فروشگاه برای آدرس image از container ساخته شده به‌وسیله‌ی فرآیند build استفاده شده است، لازم است نخست دستورات زیر را اعمال کنید تا buildConfig به پلتفرم آروان ارایه شود.

arvan paas apply -f shop-buildConfig.yaml

 حال دستور زیر را در ترمینال وارد کنید تا url مربوط به webhook برای Gitlab را به‌دست آورید.

arvan paas describe bc shop-build

در خروجی، بخش webhook GitLab، آدرس webhook مانند زیر است.

Webhook GitLab:
 URL: https://napi.arvancloud.com/paas/v1/regions/ir-thr-at1/o/apis/build.openshift.io/v1/namespaces/example-project/buildconfigs/shop-build/webhooks//gitlab

حال باید URL را کپی کنید‌ (مقدار <secret> را با مقدار رمز تعیین شده در قسمت‌های پیش (در اینجا secretvalue1) جایگزین کنید) و طبق توضیحات زیر، آن را به پروژه‌ در gitlab شخصی خود اضافه کنید.

اضافه کردن webhook به gitlab

ابتدا در gitlab خود login کنید. پروژه‌ی خود را بسازید. از منوی سمت چپ پروژه به settings > integrations بروید. در این‌جا url webhook را که از بخش قبل بدست آوردید، کپی کنید و تیک مربوط به push را فعال و سپس ذخیره کنید.

حال می‌توانید کد فروشگاه آنلاین را پس از تغییرات دل‌خواه، در gitlab ساخته شده‌ی خود push کنید. به این ترتیب فرآیند build باید شروع به کار کند.

با دستور زیر از وضعیت انجام build آگاه می‌شوید. پس از پایان موفق فرآیند، image container ساخته شده در docker registry شخصی شما وجود خواهد داشت.

arvan paas describe bc shop-build

حال با دستورات زیر سایر اجزا را در پلتفرم ابری آروان ایجاد کنید.

arvan paas apply -f shop-deployment.yaml
arvan paas apply -f shop-service.yaml
arvan paas apply -f shop-route.yaml

پس از چند لحظه تمامی اجزا ساخته شده و از طریق url مشخص شده به آدرس http://online-shop-example-project.apps.ir-thr-at1.arvan.run می‌توانید صفحه‌ی نصب فروشگاه آنلاین خود را مشاهده کنید.

پس از اتمام مراحل نصب می‌توانید محتوای  فایل‌های فروشگاه آنلاین را با استفاده از دستور زیر، از درون کانتینر به پوشه‌ای در سیستم خود منتقل کنید و سپس کدها را در gitlab شخصی خود push کنید.  از این پس، با تغییرات دل‌خواه خود با کمک فرآیند CI/CD پلتفرم ابری آروان، فروشگاه آنلاین خود را بسازید.

arvan paas cp :/var/www/html /path/to/save/files

نام pod مربوطه را با دستور زیر می‌توانید دریافت کنید.

arvan paas get pod