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 ساخته خواهد شد :
در قسمت 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 [email protected]
جهت تست میتوانید کد زیر را اجرا نموده تا با موفقیت وارد سرور مقصد شوید:
ssh -i id_rsa [email protected]
همچنان فیلد 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 یوزر [email protected] در jenkins است.
− سپس با کدهای دستوری یک فایل اسکریپت ساخته و مقادیری که قصد داریم به عنوان یوزر پسورد دیتابیسها و یا مقادیر به آن بدهیم را درج میکنیم.
− با دستور sshPut پروژه را در سرور مقصد بارگذاری میکنیم.
− دستور sshCommand ابتدا فایل ساخته شده در بخش ۲ را قابل اجرا کرده و سپس آن را اجرا میکنیم.
خطاها در Jenkins:
ممکن است در طول اجرای کد به خطاهایی برخورد نمایید.
- از جملهی این خطاها، خطای عدم اتصال به docker است که می بایست image های پروژه خود را در سرور مقصد load کنید. به عنوان مثال در پروژهی ما imageهای زیر در سرور مقصد وجود دارند.
Docker
Maven
Redis
OpenJdk
- همچنین خطاهایی از جمله عدم پیدا کردن فایل و یا فولدر مقصد مشاهده کنید که در قسمت script میبایست یا در ابتدا با دستور cd به فولدر مقصد رفته و یا در هر بار آدرسدهی از root آدرس دهیم.
- خطای دیگری که ممکن است با آن مواجه شوید عدم دسترسی و یا نیاز به استفاده از sudo برای اجرای دستورات است. توجه داشتهباشید که یوزر پسوردی که برای لاگین به سرور مقصد درج میکنید میبایست از سطح دسترسی root برخوردار باشد.