احتمالا همه شما با سرویس های CaaS آشنایی دارید ٬ پلتفرمی که با استفاده از آن می توانیم سرویس های خود را به صورت Container هایی مستقل در محیط ابری تعریف کنیم. این روش در کنار استفاده از ابزار های CI/CD در نهایت یک زیرساخت کاملا خودکار را در اختیار ما قرار میده تا کارهای سنتی به روش متفاوت و سریع تری انجام بشه. اگر بخوام روند کلی رو براتون شرح بدم ٬ در این روش با چنین مراحلی سرو کار داریم :

  • توسعه و اعمال تغییرات روی کد پروژه
  • اجرای خودکار تست ها و بررسی های مورد نیاز پروژه توسط ابزار CI
  • ساخت Image جدید از پروژه
  • انتشار نسخه جدید روی سکوی ابری توسط ابزار CD

ابزارهای CI/CD مختلفی وجود داره که روزانه با اون ها سر و کار داریم. یکی از محبوب ترین اون ها Github Actions هست که به راحتی میشه ازش در مخازن عمومی یا حتی شخصی استفاده کرد و یک Pipeline/Workflow خودکار برای انجام امور مختلف داشته باشیم.

ساختار Github Actions

در Github Actions ما با Workflow هایی سر و کار داریم که هرکدوم شامل Action های مختلف میشه. برای هر کار یک Action مشخص نوشته شده که دقیقا همان کار را برای ما انجام میده. برای مثال اگر بخواهید برای یک پروژه پایتون CI ساده ای داشته باشید به این اکشن ها ( همون Step خودمون ) نیاز دارید :

  • Checkout project
  • Setup Python
  • Lint code
  • Run test

استقرار پروژه

همونطور که پیش تر بهش اشاره کردم ٬ شما از پروژه خودتون یک Docker Image ساخته و اون رو روی سکوی ابری ( CaaS ) مستقر میکنید. برای مثال نسخه v1.3.9 از پروژه ای به نام Test. حالا پس از یک ماه کلی تغییر توی اون اعمال کرده ٬ مشکلاتش رو حل میکنید و باقی موارد و در نهایت نسخه v1.4.0 از پروژه آماده میشه. جهت به روزرسانی Container خودتون باید چه کاری انجام بدید؟

در حالت عادی ( فارق از اینکه برای انتشار نسخه از ابزارهای CI/CD استفاده بکنید یا خیر ) باید به پنل کاربری ابرآروان خودتون رفته و در بخش سکوی ابری ٬ پروژه خودتون رو انتخاب کرده و سپس نسخه Image جدید برای App مربوطه معرفی کنید. شاید این کار جوابگوی نیاز شما باشه ولی با تعاریف ما از محیط توسعه و انتشار مدرن و اهداف اصلی خودکار سازی روند و سرعت بخشیدن به کارها از همه نظر در تناقضه.

حل مشکل

برای حل این مشکل و رسیدن به راه های بهینه/معقول تر امکان استفاده از ابزار CLI برای شما وجود داره تا با نصب و استفاده از اون بتونید راه میانبر خوبی برای روش فعلی داشته باشید. برای مثال جهت انتشار آخرین نسخه ای که در موردش صحبت کردیم اجرای چنین دستوری کفایت میکنه:

arvan paas set image deployment Test TestContainer=Org/Test:v1.4.0

بسیار خب ٬ کار ساده و سریع تر شد و دیگه نیاز نیست به پنل برید و خودتون دستی نسخه جدید رو ثبت کنید. ولی آیا تمام مشکلات حل شد؟ مسلما خیر ٬ هنوزم مواردی وجود داره:

  • این ابزار باید روی سیستم یک نفر اجرا بشه. تیم/سازمان نمیتونه یک یا چند نفر رو به طور مشخص برای این کار انتخاب کنه ( به علت دسترسی ها و مسائل امنیتی )
  • نفر مربوطه باید منتظر باشه که نسخه جدید از ابزار توسط CI بررسی و ساخته بشه و روی Registry قرار بگیره
  • همیشه امکان خطای انسانی وجود داره. فرض کنید نتیجه تست ها مشکل داشت ولی کاربر اشتباهی یک Workflow دیگه رو بررسی کرده یا اصلا حواسش نبوده و فرض رو بر موفقیت آمیز بودن اون گرفته. به روزرسانی نسخه رو انجام میده و بوم !!! به راحتی یک سرویس از دست میره

حل اساسی مشکل

ما که داریم یک کاری رو انجام میدیم ٬ چرا درست انجامش ندیم؟ راه حل درست برای مشکلات مطرح شده اینه که کل روند تست ٬ بررسی ٬ ساخت و انتشار به طور خودکار انجام بشه. اینجا است که باید از جاده خاکی خارج بشیم و به راه درست و اصلی برگردیم یعنی استفاده منطقی از روند CI/CD. ما وقتی با استفاده از ابزار CI نسخه جدید از پروژه رو ساخته و روی Registry آپلود میکنیم ٬ چرا همونجا هم به روزرسانی پروژه رو انجام ندیم؟ اینجا است که باید از Action مناسب استفاده کنید.

ArvanCloud PaaS Action

کاری که این Action برای شما انجام میده دقیقا معادل اجرا کردن دستور ذکر شده در مرحله قبل روی یک سیستم خواهد بود. با این تفاوت که مدیریت این سیستم و اجرای دستور به فرد خاصی سپرده نمیشه ٬ نگران دسترسی ها نیستید ٬ خطای انسانی وجود نداره و در نهایت مطمئن هستید که روند استقرار در لحظه انجام میشه. برای این کار کافیه Step زیر رو به Workflow خودتون اضافه کنید:

- name: Deploy new version
  uses: hatamiarash7/ar-paas-action@v1.0.0
  with:
    auth: ${{ secrets.API_TOKEN }}
    app: Test
    container: TestContainer
    image: Org/Test:v1.4.0

نتیجه اجرا به این صورت خواهد بود:

> Run hatamiarash7ar-paas-action@v1.0.0
  with:
    auth: ***
    app: Test
    container: TestContainer
    image: Org/Test:v1.4.0
    version: 1.3.3

* * * * * * * * * * * * * * * * * * * * *
*                                       *
*   Welcome to ArvanCloud PaaS Action   *
*                                       *
* * * * * * * * * * * * * * * * * * * * *

-----> Get data
-----> Create directory
-----> Download ArvanCloud CLI tool version: 1.3.3
-----> Login
Select arvan region:
  [1] ir-thr-ba1
Region Number[1]: 1
Enter arvan API token: Valid Authorization credentials. Logged in successfully!
-----> Deploy
deployment.extensions/Test image updated

تنظیمات

جهت استفاده از این Action تنظیمات لازم در اختیار شما قرار داده شده ٬ توجه داشته باشید که تنظیمات هر Action به عنوان ورودی به آن داده میشه:

توضیح پیشفرض نوع نام
توکن اعتبارسنجی حساب کاربری شما در ابرآروان ( راهنما ) String auth
نام پروژه شما در پروژه سکوی ابری default String namespace
نام برنامه شما در پروژه سکوی ابری String app
نام کانتینر شما در اپلیکیشن مورد نظر String container
ایمیج جدید جهت استقرار String image
نسخه ابزار CLI 1.3.3 String version

در صورتی که namespace خاصی را مشخص نکنید ٬ پروژه پیشفرض شما انتخاب خواهد شد. در حالت عادی اکثر کاربران تنها یک پروژه در سکوی ابری ابرآروان دارند و نیازی به تنظیم این گزینه نیست.

نمونه Workflow

در ادامه یک نمونه Workflow ساده و کامل از CI/CD نهایی مشاهده می کنید:

name: Publish

on:
  push:
    tags: ["v*.*.*"]

env:
  IMAGE_NAME: org/test

jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
      id-token: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: "16.x"
          registry-url: "https://registry.npmjs.org"

      - name: Build UI
        working-directory: ./ui
        run: |
          npm install
          npm run build

      - name: Get version
        run: echo "APP_VERSION=${GITHUB_REF##*/}" >> $GITHUB_ENV

      - name: Build image
        run: docker build -t ${{ env.IMAGE_NAME }}:${{ env.APP_VERSION }} .

      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Push to Dockerhub
        run: docker push ${{ env.IMAGE_NAME }}:${{ env.APP_VERSION }}

      - name: Publish to ArvanCloud PaaS
        uses: hatamiarash7/ar-paas-action@v1.0.0
        with:
          auth: ${{ secrets.R1C_API }}
          namespace: myproject
          app: test
          container: test-container
          image: ${{ env.IMAGE_NAME }}:${{ env.APP_VERSION }}

مشارکت

این اکشن به صورت متن باز بوده و همه میتوانند در توسعه آن مشارکت کنند. اگر مشکلی در استفاده از این اکشن داشتید یا ایده ای برای بهبود آن دارید میتوانید از طریق یک Issue آن را در میان بگذارید.

GitHub - hatamiarash7/ar-paas-action: ArvanCloud PaaS Action
ArvanCloud PaaS Action. Contribute to hatamiarash7/ar-paas-action development by creating an account on GitHub.