استقرار در CaaS ابرآروان با استفاده از Github Actions
در این پست به بررسی انتشار نسخه و استقرار خودکار روی کانتینتر ابری ابرآروان با استفاده از GitHub Actions می پردازیم.
احتمالا همه شما با سرویس های 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 آن را در میان بگذارید.