سرویس GitHub (گیتهاب) در چند سال اخیر امکانات جدیدی در اختیار کاربران خود فراهم کرده و در کنار آن شرایط بی نظیری برای کاربران ایرانی فراهم کرده که در این پست میخواهیم با استفاده از تعدادی از آنها، نحوه Deploy یک پروژه (مخزن گیتهاب) را روی سرور های خصوصی را توضیح دهیم.
در خصوص ریسک استفاده از GitHub برای کار های تجاری، لازم به ذکر است که گیتهاب محدودیت های مربوط به تحریم های آمریکا را بصورت قانونی رفع کرده و شما بعنوان یک شهروند ایرانی قادر به استفاده از تمامی امکانات رایگان و Premium گیتهاب میباشید.
پیش از ورود به بحث اصلی لازم به ذکر است که اگر Source پروژه شما خارج از GitHub نگهداری میشود، ابتدا آنرا به یک مخزن (Repository) در GitHub (عمومی یا خصوصی) منتقل کنید.
در سرور مورد نظر که میخواهید پروژه (مخزن) روی آن 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 کردن مخزن در سرور ابتدا باید کلید عمومی ساخته شده در مراحل قبل را به 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 همانند 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 اختصاصی برای پروژه ایجاد کردیم و از کلید عمومی آن برای Clone یا Deploy کردن و از کلید خصوصی آن برای SSH Login استفاده کردیم. اما در صورتی که تمایل داشته باشید میتوانید از کلید های متفاوتی برای این دو منظور استفاده کنید. برای مثال میتوانید یک کلید خصوصی جهت دسترسی به سرور را برای همه پروژه ها ایجاد و آنرا بعنوان متغیر Secret در همه مخزن های مربوطه تعریف کنید. با این وجود، کلید Deploy را نمیتوانید به صورت اشتراکی برای دو Repository استفاده کنید و این کلیدها باید منحصر بفرد باشند.
با توجه به رفع قانونی محدودیت های GitHub برای کاربران ایرانی، میتوانید از Private Repository های گیتهاب جهت نگهداری و Deploy پروژه های تجاری استفاده کنید و هزینه های مربوط به Setup، پیکرهبندی و نگهداری Self-hosted Gitlab را متحمل نشوید. در این آموزش نیز نحوه یک دپلوی ساده (Git Pull) با استفاده از ابزار GitHub Actions شرح داده شد تا بهتر با این ابزار جذاب و بی دردسر آشنا شوید.