میلاد رحیمی
میلاد رحیمی
خواندن ۷ دقیقه·۳ سال پیش

آموزش Deploy با استفاده از Github Actions

سرویس GitHub (گیتهاب) در چند سال اخیر امکانات جدیدی در اختیار کاربران خود فراهم کرده و در کنار آن شرایط بی نظیری برای کاربران ایرانی فراهم کرده که در این پست می‌خواهیم با استفاده از تعدادی از آنها، نحوه Deploy یک پروژه (مخزن گیتهاب) را روی سرور های خصوصی را توضیح دهیم.

در خصوص ریسک استفاده از GitHub برای کار های تجاری، لازم به ذکر است که گیتهاب محدودیت های مربوط به تحریم های آمریکا را بصورت قانونی رفع کرده و شما بعنوان یک شهروند ایرانی قادر به استفاده از تمامی امکانات رایگان و Premium گیتهاب می‌باشید.

پیش از ورود به بحث اصلی لازم به ذکر است که اگر Source پروژه شما خارج از GitHub نگهداری می‌شود، ابتدا آنرا به یک مخزن (Repository) در GitHub (عمومی یا خصوصی) منتقل کنید.

آموزش استفاده از GitHub Actions برای Deploy
آموزش استفاده از GitHub Actions برای Deploy

ساخت کلید SSH برای پروژه

در سرور مورد نظر که می‌خواهید پروژه (مخزن) روی آن Deploy شود یک جفت-کلید SSH اختصاصی برای پروژه تعریف کنید. برای تعریف آن می‌توانید دستورات زیر را وارد کنید.

cd ~/.ssh ssh-keygen -t ed25519 -C my-project@my-company.com

توجه داشته باشید که نیازی به وارد کردن یک ایمیل واقعی در دستور فوق نیست و بهتر است به همین فرمت که ذکر شده، آنرا وارد کنید. پس از اجرای دستورات بالا، باید نام کلید را وارد کنید که بهتر است نام پروژه (مخزن) باشد؛ چرا که هر کلید تنها برای یک پروژه (مخزن) قابل استفاده است.

Generating public/private ed25519 key pair. Enter file in which to save the key (/root/.ssh/id_ed25519): my-project

پس از وارد کردن نام و فشردن Enter، از شما خواسته می‌شود که یک passphrase برای کلید وارد کنید که در اینجا باید آنرا خالی بگذارید و دوبار Enter بزنید؛ چرا که passphrase برای کلید های Deploy توسط گیتهاب پشتیبانی نمی‌شود. در انتها یک جفت کلید با نام های my-project (کلید خصوصی) و my-project.pub (کلید عمومی) ساخته می‌شود. اگر کلید ها را خارج از پوشه ssh. ساخته‌اید آنها به این پوشه منتقل کنید.

محتوای کلید عمومی (my-project.pub) را به فایل authorized_keys در پوشه ssh. اضافه کنید؛ چرا که در ادامه گیتهاب با استفاده از کلید خصوصی مربوطه به سرور شما وصل خواهد شد تا دستورات Shell مربوط به Deploy پروژه را اجرا کند.

چنانچه سرور مورد نظر در یک شبکه خصوصی قرار دارد و تنها از طریق سرور پروکسی (Bastion) قابل دسترسی است، لازم است که محتوای کلید عمومی را باید به authorized_keys در پوشه ssh. سرور Bastion نیز اضافه کنید.

اگر فایل config در پوشه ssh. وجود ندارد آنرا بسازید سپس بخش زیر را به آن اضافه کنید.

Host github.com-my-project Hostname github.com IdentityFile=/root/.ssh/my-project

آدرس کلید خصوصی (IdentityFile) را در کانفیگ بالا متناسب با مسیر‌ آن در سرور تغییر دهید. کانفیگ فوق باعث می‌شود که ابزار Git برای Clone و Pull کردن پروژه مورد نظر از کلید اختصاصی پروژه که در مرحله قبل ساخته‌اید استفاده کند.

فرایند Clone کردن Repository در سرور

برای Clone کردن مخزن در سرور ابتدا باید کلید عمومی ساخته شده در مراحل قبل را به Deploy keys مخزن در گیتهاب اضافه کنید. برای این کار از سربرگ Setting مخزن در گیتهاب بر روی گزینه Deploy keys کلیک کنید و در صفحه Load شده بر روی دکمه Add deploy key کلیک کنید و کلید عمومی (my-project.pub) را به آن اضافه کنید. می‌توانید عنوانی برای کلید وارد کنید یا آنرا خالی رها کنید تا ایمیل انتهای کلید برای عنوان در نظر گرفته شود. اگر گزینه Allow write access را تیک بزنید، اجازه تغییر و Push کردن به سرور داده می‌شود و در غیراینصورت سرور تنها می‌تواند پروژه را Clone و Pull کند.

اکنون می‌توانید در سرور خود با دستور زیر مخزن را Clone کنید.

git clone git@github.com-my-project:company/my-project.git

توجه کنید که پس از کپی کردن آدرس مخزن از گیتهاب، باید هاست github.com را با
github.com-my-project (مطابق با محتوای فایل config که در مراحل قبل شرح داده شد) جایگزین کنید تا طبق کافیگ SSH از کلید اختصاصی پروژه برای Clone و Pull (Deploy) استفاده شود.

راه اندازی GitHub Actions

ابزار GitHub Actions همانند CI/CD در Gitlab برای ساخت Pipeline های CI/CD استفاده می‌شود. با ساخت فایل Action که در ادامه شرح داده می‌شود، می‌توانید مخزن پروژه را به یک فرایند Deploy خودکار مجهز کنید تا با هر Push روی Branch اصلی (master)، بصورت خودکار پروژه روی سرور Deploy شود.

پیش از ساخت فایل Action ابتدا محتوای کلید خصوصی را که در مراحل قبل ایجاد کردید را به عنوان متغیر Secret در مخزن تعریف کنید. برای اینکار در سربرگ Setting مخزن، بر روی گزینه Actions از منوی Secrets کلیک کنید. در صفحه باز شده متغیری به نام SSH_PRIVATE_KEY و با محتوای کلید خصوصی (my-project) تعریف کنید. مطمئن شوید که در انتهای کلید یک خط خالی وجود داشته باشد.

اکنون می‌توانید فایل Action را در مسیر زیر در دایرکتوری پروژه ایجاد کنید:

.github/workflows/cd.yml

چنانچه پوشه های github. و workflows وجود ندارند آنها را بسازید و سپس فایل cd.yml را با محتوای زیر در آن مسیر ایجاد کنید.

name: CD on: push: branches: [ master ] jobs: build: runs-on: ubuntu-latest steps: - name: Deploy uses: appleboy/ssh-action@master with: host: 10.11.12.13 port: 22 username: root key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd /path/to/my-project git reset --hard HEAD^ git pull

مطابق با host (ip) سرور و فرایند Deploy پروژه، فایل بالا را ویرایش کنید.

چنانچه سرور مورد نظر در یک شبکه خصوصی قرار دارد و تنها از طریق سرور پروکسی (Bastion) قابل دسترسی است، به جای محتوای بالا برای cd.yml از محتوای زیر استفاده کنید:

name: CD on: push: branches: [ master ] jobs: build: runs-on: ubuntu-latest steps: - name: Deploy uses: appleboy/ssh-action@master with: host: 192.168.0.2 port: 22 username: root key: ${{ secrets.SSH_PRIVATE_KEY }} proxy_host: 10.11.12.13 proxy_port: 22 proxy_username: bastion proxy_key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd /path/to/my-project git reset --hard HEAD^ git pull

فایل cd.yml بالا مشابه فایل قبلی است با این تفاوت که اطلاعات سرور پروکسی (Bastion) به آن اضافه شده است.

در انتها تغییرات پروژه که شامل ایجاد فایل Action پروژه می‌باشد را Commit و Push کنید. پس از Push شدن تغییرات روی برنچ master، گیتهاب Action ایجاد شده را بصورت خودکار اجرا می‌کند. نتایج اجرای Actions را در سربرگ Actions در صفحه مخزن پروژه می‌توانید مشاهده کنید.

کلید های Deploy و SSH Login

در فرایند Deploy شرح داده شده، یک جفت-کلید SSH اختصاصی برای پروژه ایجاد کردیم و از کلید عمومی آن برای Clone یا Deploy کردن و از کلید خصوصی آن برای SSH Login استفاده کردیم. اما در صورتی که تمایل داشته باشید می‌توانید از کلید های متفاوتی برای این دو منظور استفاده کنید. برای مثال می‌توانید یک کلید خصوصی جهت دسترسی به سرور را برای همه پروژه ها ایجاد و آنرا بعنوان متغیر Secret در همه مخزن های مربوطه تعریف کنید. با این وجود، کلید Deploy را نمی‌توانید به صورت اشتراکی برای دو Repository استفاده کنید و این کلیدها باید منحصر بفرد باشند.

سخن پایانی

با توجه به رفع قانونی محدودیت های GitHub برای کاربران ایرانی، می‌توانید از Private Repository های گیتهاب جهت نگهداری و Deploy پروژه های تجاری استفاده کنید و هزینه های مربوط به Setup، پیکره‌بندی و نگهداری Self-hosted Gitlab را متحمل نشوید. در این آموزش نیز نحوه یک دپلوی ساده (Git Pull) با استفاده از ابزار GitHub Actions شرح داده شد تا بهتر با این ابزار جذاب و بی دردسر آشنا شوید.

githubactionsگیتهابdeployci cd
مهندس نرم افزار @ اسنپ
شاید از این پست‌ها خوشتان بیاید