۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

یک خط لوله ساخت خودکار ساده برای Node.js

حتی پروژه های ساده و در مراحل اولیه از خطوط لوله ساخت خودکار بهره می برند. در اینجا یک راه آسان برای راه اندازی CI/CD با Node.js، Jenkins و Git وجود دارد.

حتی پروژه های ساده و در مراحل اولیه از خطوط لوله ساخت خودکار بهره می برند. در اینجا یک راه آسان برای راه اندازی CI/CD با Node.js، Jenkins و Git وجود دارد.

فرایندهای ساخت می توانند برای برنامه های سازمانی کاملاً پیچیده باشند، اما حتی پروژه های ساده و در مراحل اولیه نیز می توانند از خطوط لوله ساخت خودکار بهره مند شوند. این مقاله یک سیستم سریع استقرار را برای اجرای یک خط لوله ساخت خودکار، آزمایش و استقرار با Node.js، Jenkins و Git.

برای پیگیری، باید Git و Node/NPM روی سیستم خود نصب شده باشد. همچنین به یک حساب Google Cloud Platform (GCP) نیاز دارید. (Google یک حساب آزمایشی رایگان سخاوتمندانه ارائه می دهد.)

این مقاله بر روی جنبه‌های توسعه‌یافته تمرکز دارد، بنابراین به جزئیات نحوه عملکرد برنامه Node.js نمی‌پردازیم.

ما از راه‌انداز ساده موجود در اینجا برای ایجاد “Hello World” استفاده می‌کنیم. ” برنامه Node.js.

شروع به کار

ما می‌خواهیم یک خط لوله ساخت راه‌اندازی کنیم که به بررسی‌های موجود در مخزن ما پاسخ دهد، بنابراین با انشعاب پروژه شروع کنید. به https://github.com/fhinkel/nodejs-hello-world بروید مرورگر، و روی “Fork” همانطور که در تصویر ۱ مشاهده می شود کلیک کنید.

تصویر ۱. انشعاب پروژه

fork project

اکنون می توانید پروژه خود را با تایپ کردن:

در سیستم محلی خود کلون کنید

git clone https://github.com/<YOUR USERNAME>/nodejs-hello-world.git

(به جای با نام کاربری شما)

وقتی این کار تکمیل شد، یک فهرست /nodejs-hello-world جدید به سیستم فایل شما اضافه می شود.

به آن دایرکتوری بروید و npm install را تایپ کنید. نصب وابستگی ها فقط یک لحظه طول می کشد.

بعد، npm run start را تایپ کنید. اکنون برنامه باید در حال اجرا باشد، و می‌توانید به localhost:30 بروید تا «Hello World!» ساده را ببینید. پاسخ.

برنامه Node را روی GCP نصب کنید

اکنون وارد GCP شوید. در صورت نیاز، می‌توانید یک حساب رایگان اینجا ایجاد کنید. یک نمونه VM جدید در کنسول GCP با کلیک کردن روی “کنسول” در بالا سمت راست، و سپس کلیک کردن روی “-> رفتن به موتور محاسباتی” در داشبورد (یا می توانید “Compute Engine” را از منوی کشویی سمت چپ انتخاب کنید) ایجاد کنید. .

با کلیک بر روی “ایجاد نمونه” صفحه پیکربندی نمونه همانطور که در تصویر ۲ مشاهده می شود ظاهر می شود.

تصویر ۲. ایجاد یک نمونه

ایجاد vm

به نمونه نامی بدهید که به خاطر بسپارید. و توجه کنید که من N1 را به عنوان سری و Micro-1 را به عنوان نوع دستگاه انتخاب کرده ام. این نمایه دستگاه در ردیف رایگان قرار دارد (حتی پس از پایان دوره آزمایشی)، اما فقط برای استفاده‌های بسیار ساده مناسب است، نه برای برنامه‌نویس یا آزمایش در دنیای واقعی، و مطمئناً تولید نمی‌شود.

حتماً “Allow Default HTTP Traffic” را انتخاب کنید تا پلت فرم به طور خودکار پورت ۸۰ را در مسیرها باز کند.

هنگامی که دکمه “ایجاد نمونه” را فشار دهید، نمونه در لیست ماشین های مجازی شما ظاهر می شود. اکنون می توانید با کلیک بر روی دکمه “SSH” SSH را وارد VM کنید. این برای دستیابی سریع CLI به نمونه بدون برخورد با کلیدها مفید است.

پس از باز شدن پوسته، می‌توانید cat /etc/os-release را تایپ کنید تا ببینید چه سیستم‌عاملی را اجرا می‌کنید. در مورد من، دبیان باستر. حالا بیایید Git را نصب کنیم.

ابتدا، sudo apt update را اجرا کنید و اجازه دهید APT به آخرین به روز رسانی شود. در مرحله بعد، sudo apt install git را تایپ کنید و با انتخاب بله، درخواست را بپذیرید. Git اکنون نصب شده است.

اکنون می‌توانید برنامه را با git clone https://github.com//nodejs-hello-world شبیه‌سازی کنید، همانطور که در سیستم محلی خود انجام دادید.

cd را وارد فهرست راهنمای برنامه جدید کنید. اکنون Node/NPM را با sudo apt install nodejs npm نصب کنید.

اکنون می‌توانید برنامه را با npm install و سپس npm run start اجرا کنید. سپس می‌توانید با برداشتن IP خارجی آن از لیست ماشین‌های مجازی و رفتن به آن در مرورگر، به برنامه ضربه بزنید. در مورد من، این http://34.134.201.13/:80 است. مطمئن شوید که به HTTP دسترسی دارید نه HTTPS.

اجرای برنامه‌های Node به‌طور مستقیم در تولید توصیه نمی شود. بنابراین فایل package.json را طوری تغییر دهید که شامل اسکریپت زیر باشد:

"start": "pm2 start index.js --watch"

اکنون بسته PM2 را به صورت سراسری با sudo npm install pm2 نصب کنید. پس از تکمیل، می‌توانید برنامه را با sudo npm run start اجرا کنید و PM2 وظیفه ساختن برنامه را بر عهده خواهد گرفت. می‌توانید برنامه‌های در حال اجرا را با sudo pm2 list فهرست کنید و برنامه را با sudo pm2 stop index متوقف کنید.

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

جنکینز را روی GCP نصب کنید

اکنون یک سرور درست مانند کاری که با سرور برنامه انجام دادید ایجاد کنید. در مورد من، نام آن را idg-ops می گذارم. همانطور که قبلاً انجام دادید، SSH را وارد نمونه جدید کنید.

دستورالعمل‌های کامل برای نصب Jenkins در Debian Buster اینجا است. . نسخه سریع این است که جاوا را نصب کنید، wget را نصب کنید، کلید بسته Jenkins را نصب کنید، مخزن Jenkins را به Debian اضافه کنید و با به‌روزرسانی مجدد APT پایان دهید. این پنج مرحله عبارتند از: 

sudo apt install default-jdk
sudo apt install wget
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt update

Git را روی سرور جنکینز نصب کنید

همچنین باید Git و Node/NPM را روی نمونه جنکینز نصب کنید:

sudo apt install git 
sudo apt install nodejs npm

به‌طور پیش‌فرض، جنکینز روی ۸۰۸۰ اجرا می‌شود، بنابراین اجازه دهید آن پورت را در قوانین فایروال GCP باز کنیم. به “VPC Network -> Firewall” در منوی سمت چپ کنسول GCP بروید. روی «ایجاد قانون فایروال» کلیک کنید.

نام قانون را «جنکینز» بگذارید و پیش‌فرض‌ها از جمله «برچسب‌های هدف مشخص» را رها کنید. “jenkins” (همگی با حروف کوچک) را به عنوان تنها تگ هدف اضافه کنید. در “محدوده IP منبع” ۰.۰.۰.۰/۰ را برای اجازه دادن به همه مشتریان قرار دهید. در نهایت، برای «Specified Protocols and Ports» «TCP» را انتخاب کنید و آن را روی ۰.۰.۰.۰/۸۰۸۰ تنظیم کنید.

لیست نمونه‌های VM را دوباره باز کنید (منوی سمت چپ: “Compute Engine -> VM Instances”) و نمونه Jenkins را که قبلا ایجاد کرده‌اید انتخاب کنید. اکنون فقط باید تگ جنکینز را اضافه کنید. روی “ویرایش” کلیک کنید و در قسمت برچسب ها “jenkins” را اضافه کنید.

اکنون اگر به آدرس IP نمونه Jenkins خود در ۸۰۸۰ بروید، همانطور که در تصویر ۳ مشاهده می‌شود با صفحه فرود جنکینز مواجه خواهید شد.

تصویر ۳. صفحه فرود جنکینز

jenkins landing

همانطور که صفحه به شما می گوید، برای به دست آوردن رمز عبور مدیریت باید گزارش ها را پیدا کنید. (این تضمین می کند که شما فردی هستید که به سیستمی که سرور روی آن اجرا می شود دسترسی دارید.) در سرور جنکینز، /var/ را باز کنید و رمز عبوری را که در آنجا می بینید، مانند فهرست ۱ بگیرید.

فهرست ۱. رمز عبور جنکینز در ورود

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.

Please use the following password to proceed to installation:

YOUR PASSWORD HERE

This may also be found at: /var/lib/jenkins/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

پس از بازگشت به مرورگر و وارد کردن رمز عبور، می‌توانید پیکربندی جنکینز را آغاز کنید. برای اهداف این مقاله، فقط می‌توانید «نصب پلاگین‌های پیشنهادی» را انتخاب کنید. در یک موقعیت واقعی، شما برای چیدن گیلاس دقیقاً همان چیزی را که نیاز دارید، وقت بگذارید.

وقتی جنکینز اجرای نصب‌های پیش‌فرض خود را به پایان رساند، از شما می‌خواهد یک کاربر سرپرست ایجاد کنید – ادامه دهید و این کار را انجام دهید. در نهایت، جنکینز از شما URL مطلق نصب را می‌خواهد، و می‌توانید با IP و پورتی که شناسایی کرده است، آن را همانطور که هست بگذارید.

روی “کار جدید” کلیک کنید و نامی برای آن بگذارید (من از “nodejs” استفاده کردم). سپس روی «پروژه آزاد» و «OK» کلیک کنید.

وب هوک GitHub را به جنکینز پیکربندی کنید

جنکینز را برای لحظه ای کنار بگذارید و به حساب GitHub خود بروید، به پروژه nodejs-hello-world بروید و روی برگه “تنظیمات” کلیک کنید. در منوی سمت چپ، “webhooks” را انتخاب کنید. در صفحه جزئیات وب هوک، روی «افزودن وب هوک» کلیک کنید. یک وب هوک به GitHub اجازه می دهد تا در هنگام رخ دادن رویدادها به یک URL پست کند.

برای URL webhook، از URL برای نصب Jenkins خود و سپس /github-webhook استفاده کنید. در مورد من، آن URL http://35.223.18.153:8080/github-webhook است. “نوع محتوا” را روی “application/json” تنظیم کنید.

انواع رویدادهای زیادی وجود دارد که می‌توانید از آنها برای اصلاح اینکه دقیقاً چه چیزی باعث اجرای وبکهوک می‌شود، در زیر «اجازه دهید انتخاب کنم» استفاده کنید، اما در حال حاضر فقط از «Pushes» استفاده می‌کنیم و چیزها را همانطور که هستند رها می‌کنیم. ادامه دهید و روی «افزودن وب هوک» کلیک کنید.

اکنون به جنکینز برگردید. در صورت نیاز دوباره وارد شوید و پروژه ای را که قبلا ایجاد کرده اید انتخاب کنید. روی “پیکربندی” در سمت چپ کلیک کنید. به بخش «مدیریت کد منبع» بروید و «Git» را انتخاب کنید. اکنون URL را به مخزن Git خود در قسمت URL قرار دهید. (در مورد من https://github.com/MTyson/nodejs-hello-world.)

جنکینز در مورد URL های Git حساس است

Jenkins از نشانی اینترنتی که در پیکربندی Git پروژه قرار داده‌اید استفاده می‌کند تا با فشار وب هوک از GitHub مطابقت داشته باشد.

دقت کنید موارد مطابقت دارند. اگر گزارش‌هایی را در سرور جنکینز مشاهده می‌کنید که فشار را تأیید می‌کنند اما شروع ساخت را نمی‌بینید، URL را دوباره بررسی کنید. (ورودی گزارش Jenkins چیزی شبیه به “۲۰۲۱-۰۵-۲۲ ۱۹:۳۴:۲۶.۵۱۵+۰۰۰۰ [id=18] INFO o.j.p.g.w.s.DefaultPushGHEventSubscriber#onEvent: دریافت PushEvent برای https://github.com/MTs-ythub.com/j جهان از ۱۴۰.۸۲.۱۱۵.۱۵۴ ⇒ http://35.223.18.153:8080/github-webhook/.”)

ادغام را آزمایش کنید

اکنون می توانید به پروژه در سیستم محلی خود بروید و ادغام را آزمایش کنید. index.js را باز کنید و “Hello World!” را تغییر دهید. پیام به “سلام!”

اکنون تغییر را با git add index.js اضافه کنید، آن را با git commit -m "hook test" انجام دهید و با به مخزن فشار دهید. git push origin master.

می‌توانید با رفتن به «GitHub Hook Log» در سمت چپ، تأیید کنید که webhook در حال اجرا است، جایی که باید ورودی مشابه تصویر ۴ را ببینید.

تصویر ۴. اجرای موفقیت آمیز ساخت قلاب Git

jenkins git push

همچنین خواهید دید که اگر به داشبورد برگردید، پروژه اکنون یک ساخت موفق اخیر را نشان می دهد. (اگر ساخت ناموفق بود، مطمئن شوید که Git را روی سرور جنکینز نصب کرده اید.)

در یک سیستم تولید، هر بار که یک commit به master/main می‌رسد، آزمایش‌هایی را علیه پروژه اجرا می‌کنید. می توانید این کار را با رفتن به پیکربندی پروژه و کلیک بر روی “افزودن مرحله ساخت” و ایجاد یک فرمان پوسته ای که npm install و سپس npm run test را اجرا می کند، انجام دهید، یا می توانید برای نیازهای دقیق تر، اسکریپت های پوسته ایجاد کنید.

اگر اسکریپت آزمایشی package.json را برای دادن کد خروج ۰ تغییر دهید (خروجی ۱ را به خروج ۰ تغییر دهید) سپس می توانید گذراندن تست ها را شبیه سازی کنید.

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

به پوسته SSH سرور جنکینز برگردید. اکنون یک رمز عبور برای کاربر “jenkins” تنظیم کنید که هنگام نصب Jenkins برای شما ایجاد شد: sudo passwd jenkins. به آن کاربر بروید: su jenkins.

اکنون کلیدی برای کاربر ایجاد کنید که از آن برای احراز هویت در برابر سرور prod استفاده می کند: ssh-keygen -t rsa. می‌توانید پیش‌فرض‌ها را بپذیرید، توجه داشته باشید که در یک موقعیت واقعی از یک عبارت عبور استفاده می‌کنید.

هنوز در سرور جنکینز هستید، دستور را وارد کنید:

ssh-copy-id NODE_SERVER_USER@NODE_SERVER_IP 

(در مورد من، این ssh-copy-id matthewcarltyson@34.134.201.13 است.)

ابزار ssh-copy-id کلید عمومی را در سرور Node.js کپی می کند.

وقتی این کار کامل شد، باید بتوانید مستقیماً از دستگاه جنکینز به دستگاه Node SSH کنید: 

ssh NODE_SERVER_USER@NODE_SERVER_IP

(در مورد من، ssh matthewcarltyson@34.134.201.13.)

این بدان معناست که کاربر جنکینز در سرور جنکینز اکنون می‌تواند بدون رمز عبور سرور تولید Node را SSH کند.

به عنوان آخرین مرحله، یک مرحله ساخت اسکریپت پوسته ایجاد می کنیم که بعد از مرحله ساخت آزمایشی فعال می شود. در صورت موفقیت آمیز بودن تست ها، این مرحله با SSH-ing در سرور Node اجرا می شود، آخرین مورد را از Git می کشد و سرور را مجدداً راه اندازی می کند، همانطور که در لیست ۲ مشاهده می شود.

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

ssh matthewcarltyson@34.134.201.13 <<EOF
 cd ~/nodejs-hello-world
 git pull
 npm install
 pm2 restart all
 exit
EOF

فهرست ۲ عالی کار می کند، به جز یک مشکل رایج که بعداً آن را حل خواهیم کرد: کاربر جنکینز از کاربر عادی (در مورد من matthewcarltyson) برای SSH به سرور Node استفاده می کند و برنامه را مجدداً راه اندازی می کند. این خوب است، زیرا نمی خواهید برنامه را به صورت روت اجرا کنید (امنیت بد). اما در لینوکس نمی توانید به عنوان یک کاربر معمولی به پورت ۸۰ گوش دهید. بنابراین موارد زیر را انجام دهید:

  1. توقف سرور در حال اجرا: فهرست حذف sudo pm2
  2. سرور را به عنوان یک کاربر معمولی راه اندازی کنید: pm2 start index.js
  3. به کنسول GCP بروید و یک تگ شبکه VPC به نام “nodejs” را به نمونه Node.js VM اضافه کنید.
  4. در کنسول GCP، یک قانون فایروال شبکه ایجاد کنید که به TCP:80 اجازه می دهد تا تگ “nodejs” را داشته باشد.
  5. در خط فرمان سرور Node.js، درخواست‌های تغییر مسیر از ۸۰ به ۸۰۸۰: sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT< /li>
  6. index.js را برای گوش دادن به پورت ۸۰۸۰ به جای پورت ۸۰ در دستگاه محلی خود تغییر دهید و آن را بررسی کنید.

اکنون وقتی تغییرات پروژه را بررسی می‌کنید، جنکینز به‌طور خودکار آزمایشی را می‌سازد و اجرا می‌کند، نمونه تولید را به‌روزرسانی می‌کند و در حین گوش دادن به ۸۰، مجدداً راه‌اندازی می‌کند.

Viva CI/CD

خط لوله ساخت برنامه Node.js ما بسیاری از عناصر کلیدی خط لوله CI/CD را توسعه می دهد. این تنها رویکرد نیست. بهترین رویکرد بر اساس خواسته های پروژه تعیین می شود.

به‌ویژه، آنچه در این مقاله «تولید» می‌نامیم، در یک سیستم در مقیاس بزرگ‌تر، واقعاً «تست» یا «qa» است. تنها پس از تایید انسانی، ساخت به تولید ارتقا می‌یابد.

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

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

منابع