Jenkins :

ما در تیم میربزرگی  قصد داریم تا در مورد این که Jenkins چیست و یکی از کاربردهای اصلی آن با شما صحبت کنیم. کار با Jenkinse در حوزه DevOps جای می‌گیرد. Jenkins یک automation سرور هست که شما می‌توانید خیلی از تسک ها رو به صورت کاملا اتوماتیک توسط آن انجام دهید.

 

 

هدف این مقاله این هست که زمانی که شما برنچی را با master مرج کردید، سرور اصلی realtime آپدیت شود.

به عنوان مثال فرض کنید یک بک اند با زبان جاوا دارید و می‌خواهید بعد از اضافه شدن فیچر جدید سرور را آپدیت دهید. در روش مرسوم ابتدا در گیت پوش می‌کنید و بعد در سرور اصلی pull می‌کنید. Docker Image را ساخته و با فایل Docker-Compose اجرا می‌کنید. یا Docker Image را در لوکال می‌سازید و Image را منتقل می‌کنید. یک روش دیگر استفاده از Tomcat بوده که  امروزه از آن استفاده نمی‌کنند.

در تمامی این روش‌ها می‌بایست یکسری مراحل را برای آپدیت شدن Production انجام دهید. ما در این‌جا به معرفی ابزاری پرداختیم که در هنگام Merge شدن پروژه به Branch دلخواه، سرور اصلی آپدیت می‌شود.

 

مرحله ۱ :

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

 

مرحله ۲ :

یک یوزر در gitlab خود با دسترسی api ساخته و Access token آن را به داشبورد jenkins اضافه می‌کنیم.

در مسیر زیر access token ساخته خواهد شد :‌

https://gitlab.com/-/profile

در قسمت access token می‌توان token ساخت .

مرحله ۳ :

نحوه‌ی اضافه کردن یوزر gitlab به jenkins : 

به مسیر زیر رفته : 

Manage jenkins -> Configure system -> gitlab

و فیلدهای خواسته شده را پر می‌کنیم.

 

توجه : ممکن است در هنگام اضافه کردن Access token  با خطا مواجه شویم. در این صورت از مسیر زیر credential را اضافه کرده و مجدد به مسیر پیشین می‌روم و ادامه‌ی روند را طی می‌کنیم.

Manage jenkins -> Configure Credential Providers – > (change providers and type to “Only selected”)

 

Manage jenkins -> Manage Credential -> add gitlab api token

 

مرحله ۴ :

 

در صفحه‌ی gitlab پروژه به مسیر زیر می رویم.

Setting -> Integrations 

و طبق تصویر تنظیمات این بخش را درج می‌کنیم.

مرحله ۵ :

plugin های زیر را در jenkins نصب می‌کنیم:

Publish Over SSH (for freeStyle project)

SSH Pipeline Steps

 

پس از نصب به آدرس زیر رفته و طبق تصویر، یک یوزر جدید می‌سازیم.

Manage jenkins -> Manage Credential

 

 ID : یک شناسه دلخواه اما واحد انتخاب می‌کنیم.

Username : نام یوزری که با آن قصد داریم به سرور مقصد لاگین کنیم را درج می‌کنیم. 

نکته : توجه‌داشته باشید که یوزر می‌بایست دارای سطح دسترسی root باشد.

Private key : در این بخش ابتدا می‌بایست در سرور jenkins با کد دستوری زیر یک فایل id_rsa بسازیم.

ssh-keygen -t rsa -m PEM

 

سپس فایل ساخته‌شده در پوشه‌ی .ssh را با کد دستوری زیر در سرور jenkins به سرور مقصد انتقال دهیم.

ssh-copy-id -i id_rsa root@hostname

 

جهت تست می‌توانید کد زیر را اجرا نموده تا با موفقیت وارد سرور مقصد شوید:

ssh -i id_rsa root@hostname

 

همچنان فیلد private key خالی بوده و برای تنظیم آن می‌بایست فایل id_rsa را باز نموده و تمامی محتویات آن را در این بخش درج کنیم.

 

 

مرحله ۶ :

جهت اضافه کردن پروژه گزینه‌ی add item را انتخاب و سپس همانند تصویر بالا پس از درج نام پروژه گزینه Pipeline را انتخاب کرده و به صفحه تنظیمات پروژه هدایت می‌شویم.

 

در تصویر بالا در بخش GitHub project آدرس Gitlab/Github پروژه خود را وارد می‌کنیم.

(نیازی به پر کردن بخش Description نیست)

 

در بخش Gitlab Server نامی که در مرحله‌ی یک به حساب gitlab خود اختصاص دادید را وارد نمایید. و در صورت نیاز می‌توانید سایر گزینه‌ها را انتخاب کنید.

 

 

مرحله ۷ :

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

 

در بخش Build Triggers برای حل مشکل build در صورت merge شدن از develop به master گزینه Advance را انتخاب نموده و تنظیمات زیر را درج می‌کنیم.

 

 

همان‌طور که در تصویر بالا مشاهده می‌کنید ابتدا گزینه‌‌ی Filter branches by regex را انتخاب نموده و سپس فیلدهای Source branch Regex و Target branch Regex را مطابق تصویر پر می‌کنیم.

 

مرحله ۸ :

به سراغ کانفیگ پروژه می‌رویم و گزینه‌ی Pipeline Script را انتخاب می‌‌کنیم.

در کادر Script عبارات زیر را وارد می‌کنیم.

def remote = [:]
remote.name = "root"
remote.host = "127.0.0.1"
remote.port = 22
remote.allowAnyHosts = true
 
node {
 
     git branch : 'master', credentialsId: 'e03b3798-0e67-4769-ssss94b3-7d6e696f', url: 'https://gitlab.com/server/mirbozorgi.git'
 
    withCredentials([sshUserPrivateKey(credentialsId: 'root-jenkins', keyFileVariable: 'identity', passphraseVariable: '', usernameVariable: arsalan)]) {
        remote.user = arsalan
        remote.identityFile = identity
        stage("SSH Steps Rocks!") {
            writeFile file: 'deploy.sh', text: '''#!/bin/bash
                                                echo "Creating Dockerfile..."
                                                cd /root/arsalan/workdir/mirbozorgi_pipeline
                                                docker build --no-cache -t arsalan/mirbozorgi:latest . -f /root/arsalan/workdir/mirbozorgi_pipline/Dockerfile
                                                sed -i 's/127.0.0.1/127.0.0.1/g' /root/arsalan/workdir/mirbozorgi_pipline/docker-compose.yml
                                                sed -i 's/postgres_user_password/455sfdfdsfghrt8687ggjjjuu/g' /root/arsalan/workdir/mirbozorgi_pipline/docker-compose.yml
                                                sed -i 's/mongo_mirbozorgi/arsalan-mirbozorgi/g' /root/arsalan/workdir/mirbozorgi_pipline/docker-compose.yml
                                                sed -i 's/127.0.0.1/127.0.0.1/g' /root/arsalan/workdir/mirbozorgi_pipline/docker-compose.yml
                                                sed -i 's/mirbozorgi_user/admin/g' /root/arsalan/workdir/mirbozorgi_pipline/docker-compose.yml
                                                sed -i 's/mongo_user_password/455sfdfdsfghrt8687ggjjjuu/g' /root/arsalan/workdir/mirbozorgi_pipline/docker-compose.yml
                                                docker stack deploy -c /root/arsalan/workdir/mirbozorgi_pipline/docker-compose.yml mirbozorgi
                                                docker service update --force --image arsalan/mirbozorgi:latest mirbozorgi_app'''
            
            sshPut remote: remote, from: '../mirbozorgi_pipline', into: '/root/arsalan/workdir'
            sshCommand remote: remote, command: 'chmod +x /root/arsalan/workdir/mirbozorgi_pipline/deploy.sh'
            sshCommand remote: remote, command: 'bash /root/arsalan/workdir/mirbozorgi_pipline/deploy.sh'
        }
        
    }
}

 

همان‌طور که می‌بینید ابتدا یک فیلد به نام remote ساخته و مقادیر سرور مقصد را به آن اختصاص دادیم.

سپس با تابع withCredentials تنظیمات خود را وارد می‌کنیم. همان‌طور که مشاهده می‌کنید در فیلد 

credentialsId: root-jenkins شناسه‌ای که در مرحله‌ی ۱ به صورت واحد قرار دادیم را در اینجا درج می‌کنیم.

 

− خط کد زیر وظیفه‌ی دریافت فایل پروژه از git را برعهده دارد:

  •  git branch : ‘master’, credentialsId: ‘e03b3798-0e67-4769-94b3-7d6e69637aaf’, url: ‘https://.gitlab.com/arsalan/server/mirbozorgi.git’

 

فیلد credentialsId از صفحه‌ی زیر در Manage jenkins -> Manage Credential دریافت شده است.

 

به عبارت دیگر این فیلد id یوزر h.koraei@arsalan.info در jenkins است.

 

− سپس با کد‌های دستوری یک فایل اسکریپت ساخته و مقادیری که قصد داریم به عنوان یوزر پسورد دیتابیس‌ها و یا مقادیر به آن بدهیم را درج می‌کنیم.

− با دستور sshPut پروژه را در سرور مقصد بارگذاری می‌کنیم.

− دستور sshCommand ابتدا فایل ساخته شده در بخش ۲ را قابل اجرا کرده و سپس آن را اجرا می‌کنیم.

 

خطاها در Jenkins:

 

ممکن است در طول اجرای کد به خطاهایی برخورد نمایید.

  • از جمله‌ی این خطاها، خطای عدم اتصال به docker است که می بایست image های پروژه خود را در سرور مقصد load کنید. به عنوان مثال در پروژه‌ی ما imageهای زیر در سرور مقصد وجود دارند.

Docker

Maven

Redis

OpenJdk

  • همچنین خطاهایی از جمله عدم پیدا کردن فایل و یا فولدر مقصد مشاهده کنید که در قسمت script می‌بایست یا در ابتدا با دستور cd به فولدر مقصد رفته و یا در هر بار آدرس‌دهی از root آدرس دهیم.

 

  • خطای دیگری که ممکن است با آن مواجه شوید عدم دسترسی و یا نیاز به استفاده از sudo برای اجرای دستورات است. توجه داشته‌باشید که یوزر پسوردی که برای لاگین به سرور مقصد درج می‌کنید می‌بایست از سطح دسترسی root برخوردار باشد.

 

 

ارسال دیدگاه

− 5 = 1

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

پیام با موفقیت ثبت شد.
خطایی رخ داده است.