بلاگ/راه‌اندازی Jenkins برای CI/CD خودمیزبان روی سرور مجازی و اختصاصی
به‌روز شده

راه‌اندازی Jenkins برای CI/CD خودمیزبان روی سرور مجازی و اختصاصی

1405/08/110 بازدید
راه‌اندازی Jenkins برای CI/CD خودمیزبان روی سرور مجازی و اختصاصی

راه‌اندازی Jenkins برای CI/CD خودمیزبان روی سرور مجازی و اختصاصی

اگر هر بار دستی کد را build و deploy می‌کنید، دیر یا زود یک جا اشتباه از قلم می‌افتد. Jenkins همین کار را خودکار می‌کند: هر push به ریپازیتوری، یک pipeline را اجرا می‌کند که کد را تست، build و روی سرور مستقر می‌کند. در این مقاله نصب Jenkins را از صفر روی یک سرور مجازی یا اختصاصی خودتان، بدون وابستگی به CI ابری، مرحله به مرحله می‌بینیم.

نصب و راه‌اندازی Jenkins روی سرور مجازی و اختصاصی

Jenkins چیست و چرا خودتان آن را میزبانی کنید؟

Jenkins یک ابزار متن‌باز برای CI/CD است؛ یعنی هر بار که کدی تغییر می‌کند، به‌صورت خودکار آن را build، تست و در صورت نیاز روی سرور مقصد منتشر می‌کند. جایگزین‌های ابری مثل GitHub Actions یا GitLab CI هم همین کار را می‌کنند، اما دقیقه‌های اجرا و منابع build آن‌ها معمولا محدود یا هزینه‌بر است.

با Jenkins روی سرور مجازی یا اختصاصی خودتان، منابع CPU و RAM را خودتان کنترل می‌کنید، داده‌های build روی زیرساخت شما می‌ماند و برای تیم‌هایی که چند پروژه موازی build می‌کنند، هزینهٔ ثابت سرور معمولا از پلن‌های pay-per-minute ابری به‌صرفه‌تر در می‌آید.

پیش‌نیازهای سرور قبل از نصب

قبل از شروع، به این موارد نیاز دارید:

  • یک سرور با اوبونتو 22.04 یا 24.04 (یا دبیان 12) و دسترسی root یا sudo
  • حداقل 2 گیگابایت RAM برای Jenkins به‌تنهایی؛ اگر چند job موازی اجرا می‌شود، 4 گیگابایت راحت‌تر است
  • حداقل 20 گیگابایت فضای دیسک برای workspace هر job، artifact‌ها و لاگ‌ها
  • دسترسی SSH و اجازهٔ باز کردن پورت 8080 در فایروال

برای تیم‌های کوچک با یک یا دو job همزمان، یک سرور مجازی کفایت می‌کند. وقتی تعداد pipeline‌ها بالا می‌رود یا build شامل compile سنگین و تست‌های integration طولانی می‌شود، منابع اختصاصی و دیسک NVMe سرور اختصاصی دیگر مزیت محسوس می‌شود:

مورد استفادهسرور مناسبچرا
۱-۲ پروژه، build سبک (Node، PHP)سرور مجازی ۲ vCPU / ۴ گیگ RAMهزینهٔ ماهانه پایین، کافی برای شروع
چند تیم، build موازی زیادسرور اختصاصی با CPU و دیسک اختصاصیبدون رقابت منابع با سرورهای دیگر
تیم بین‌المللی با اعضا در اروپاسرور اختصاصی آلمان یا فرانسهتاخیر کمتر برای توسعه‌دهندگان خارج از ایران
محدودیت بودجه، پروژه شخصی یا آزمایشیسرور اختصاصی ارزان یا سرور مجازیشروع کم‌هزینه، بعدا ارتقا

اگر تیم‌تان روی چند منطقه پخش است، محل سرور را هم در نظر بگیرید؛ یک سرور اختصاصی آلمان یا فرانسه می‌تواند برای توسعه‌دهندگان خارج از ایران تاخیر کمتری نسبت به سرور اختصاصی ایران داشته باشد. وقتی امکانات این سرورها را مقایسه می‌کنید، روی تعداد core واقعی CPU، نوع دیسک (SSD یا NVMe) و پهنای باند پورت شبکه تمرکز کنید، نه فقط قیمت.

نصب جاوا، پیش‌نیاز Jenkins

Jenkins روی JVM اجرا می‌شود، پس اول جاوا نصب می‌شود. نسخهٔ پیشنهادی فعلی Jenkins، OpenJDK 17 یا 21 است:

sudo apt update
sudo apt install -y fontconfig openjdk-17-jre
java -version

اگر خروجی java -version یک نسخهٔ 17 یا بالاتر نشان داد، مرحلهٔ بعد را شروع کنید.

نصب Jenkins روی اوبونتو یا دبیان

مخزن رسمی Jenkins را اضافه و بسته را نصب می‌کنیم:

sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
  https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian-stable binary/" | \
  sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt update
sudo apt install -y jenkins
sudo systemctl enable jenkins
sudo systemctl start jenkins

وضعیت سرویس را چک کنید:

sudo systemctl status jenkins

اگر active (running) دیدید، Jenkins روی پورت 8080 در حال اجراست.

باز کردن پورت فایروال

برای دسترسی به رابط وب Jenkins، پورت 8080 (و پورت SSH که از قبل باز است) باید در فایروال باز باشد. با ufw:

sudo ufw allow OpenSSH
sudo ufw allow 8080/tcp
sudo ufw enable
sudo ufw status

اگر از nftables یا iptables استفاده می‌کنید، همان قانون را با ابزار خودتان تکرار کنید. در محیط production بهتر است پورت 8080 فقط برای IP ثابت دفتر یا VPN باز باشد، نه برای همهٔ اینترنت؛ دسترسی عمومی را از پشت یک reverse proxy با Nginx و HTTPS بدهید.

تنظیم اولین کاربر Jenkins

رمز موقت اولین ورود در این مسیر ذخیره شده:

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

این رمز را در مرورگر، در آدرس http://IP-سرور:8080 وارد کنید. مراحل بعدی:

  1. گزینهٔ «Install suggested plugins» را بزنید تا پلاگین‌های پایه (Git، Pipeline، Credentials) نصب شوند.
  2. فرم ساخت کاربر ادمین را پر کنید؛ از رمز موقت فقط برای همین یک‌بار استفاده می‌شود.
  3. آدرس Jenkins را تایید کنید (معمولا همان IP یا دامنه‌ای که روی آن reverse proxy گذاشته‌اید).

از این‌جا به بعد با همین کاربر وارد می‌شوید، نه با رمز اولیه.

ساخت اولین Pipeline برای CI/CD

برای شروع یک Pipeline ساده کافی است:

  1. از صفحهٔ اصلی روی «New Item» کلیک کنید، نام پروژه را بدهید و نوع «Pipeline» را انتخاب کنید.
  2. در بخش «Pipeline»، گزینهٔ «Pipeline script» را انتخاب و این کد را وارد کنید:
pipeline {
    agent any
    stages {
        stage('Build') {
            steps { sh 'echo "building project..."' }
        }
        stage('Test') {
            steps { sh 'echo "running tests..."' }
        }
        stage('Deploy') {
            steps { sh 'echo "deploying to server..."' }
        }
    }
}

مثال Jenkinsfile با سه مرحله Build، Test و Deploy

  1. روی «Save» و بعد «Build Now» کلیک کنید؛ در بخش «Console Output» هر سه مرحله را به ترتیب می‌بینید.

برای پروژهٔ واقعی، به‌جای نوشتن اسکریپت مستقیم در پنل، یک فایل به نام Jenkinsfile با همین محتوا در ریشهٔ ریپازیتوری قرار دهید و در تنظیمات Job، گزینهٔ «Pipeline script from SCM» را با آدرس ریپازیتوری Git انتخاب کنید. برای اجرای خودکار بعد از هر push، در GitHub یا GitLab یک webhook به آدرس http://your-jenkins-url/github-webhook/ اضافه کنید.

نکات نگهداری قبل از production

قبل از اتکای تیم به این Jenkins، این موارد را چک کنید:

  • پشتیبان‌گیری منظم از پوشهٔ /var/lib/jenkins (شامل تنظیمات job‌ها و credential‌ها)
  • پلاگین‌ها را هر چند هفته یک‌بار از داشبورد «Manage Jenkins → Plugins» به‌روز کنید
  • پشت یک reverse proxy با گواهی SSL رایگان Let's Encrypt قرار دهید، نه مستقیم روی HTTP
  • برای credential‌های Git و SSH از بخش «Manage Credentials» استفاده کنید، نه هاردکد در اسکریپت pipeline

چه سروری برای Jenkins بگیرید؟

برای شروع و تست، یک سرور مجازی با 2 vCPU و 4 گیگ RAM کافی است و هزینهٔ آن از یک سرور اختصاصی ارزان هم پایین‌تر است. وقتی تعداد job‌های موازی زیاد شد یا build‌ها به CPU/RAM بیشتری نیاز داشتند، می‌توانید بدون تغییر تنظیمات Jenkins به یک سرور اختصاصی مهاجرت کنید؛ تفاوت این دو گزینه را در راهنمای انتخاب بین سرور مجازی و سرور اختصاصی کامل‌تر می‌بینید.

سرور مجازی آریانت گزینهٔ خوبی برای شروع است؛ اگر پروژه رشد کرد و به منابع اختصاصی نیاز داشتید، سرور اختصاصی آریانت را هم ببینید.

سؤالات متداول

آیا Jenkins روی سرور مجازی هم به اندازهٔ سرور اختصاصی پایدار کار می‌کند؟ برای تیم‌های کوچک با چند job همزمان، بله. مشکل معمولا وقتی شروع می‌شود که چند build سنگین هم‌زمان اجرا شوند و منابع CPU کم بیاید؛ آن‌جا سرور اختصاصی فرق را نشان می‌دهد.

چرا پورت 8080 به‌جای 443 باز می‌کنیم؟ 8080 پورت پیش‌فرض خود Jenkins است. برای دسترسی عمومی امن‌تر، یک Nginx با گواهی SSL جلوی آن می‌گذارید که از 443 به 8080 داخلی proxy کند؛ خود Jenkins را مستقیم به اینترنت باز نکنید.

آیا می‌توان Jenkinsfile را مستقیم در ریپازیتوری نگه داشت؟ بله، و همین روش توصیه‌شده است. گزینهٔ «Pipeline script from SCM» دقیقا برای این ساخته شده تا تغییرات pipeline هم مثل کد نسخه‌بندی شود.

برای یک تیم کوچک، سرور ارزان یا سرور با منابع بیشتر؟ اگر الان یک یا دو پروژه دارید، یک سرور مجازی ارزان کافی است. هزینهٔ منابع بیشتر را وقتی پرداخت کنید که صف build طولانی شده باشد، نه از قبل.