CI/CD با چکمه فنری و خطوط لوله جنکینز
معرفی
ما در این آموزش، گردشهای کاری CI/CD را بررسی میکنیم و از Jenkins Pipeline برای برداشتن یک برنامه Spring Boot از کنترل نسخه از طریق فرآیندهای یکپارچهسازی، تحویل و استقرار استفاده میکنیم.
از قابلیتهای Jenkins Pipeline برای هماهنگی آزمایش، تجزیه و تحلیل پوشش کد، کانتینریسازی و استقرار در PaaS استفاده خواهد شد.
برنامه Spring Boot شما
یک برنامه ساده Spring Boot با استفاده از ابزار ساخت Gradle را می توان با استفاده از Spring Initializr ایجاد کرد. برای پیکربندی برنامه خود به عنوان یک برنامه وب، به وابستگی وب نیاز دارید. وابستگی Actuator یک URL برای بررسی وضعیت برنامه شما ارائه می دهد. پس از آن، برنامه خود را تولید، دانلود و استخراج کنید. با استفاده از یک IDE مناسب، فایل های پروژه خود را باز کنید.
کنترل نسخه
شما باید یک مخزن git را در پوشه استخراج شده راه اندازی کنید و مخزن را به GitHub پیوند دهید.
راه اندازی خط لوله جنکینز
ما از یک سرور محلی جنکینز برای اجرای فرآیندهای CI/CD خود استفاده خواهیم کرد. اگر نصب قبلی ندارید، جنکینز را نصب کنید. در مرحله بعد افزونه Pipeline را به صورت زیر نصب کنید:
- در داشبورد جنکینز خود را انتخاب کنید جنکینز را مدیریت کنید.
- انتخاب کنید مدیریت پلاگین ها.
- انتخاب کنید پلاگین های موجود.
- در کادر متن “Pipeline” را تایپ کرده و افزونه را نصب کنید.
بعد، یک مورد جدید در داشبورد جنکینز خود ایجاد کنید و انتخاب کنید خط لوله به عنوان نوع در منوی پیکربندی، تعریف خط لوله را به عنوان “Pipeline from SCM” تنظیم کنید تا اسکریپت خط لوله را از GitHub تهیه کنید. SCM را بهعنوان «Git» تنظیم کنید و URL مخزن را با قالببندی زیر ارائه کنید (براکتهای زاویهدار را با مقادیر مرتبط جایگزین کنید):https://<github access token>@github.com/<userName>/<name of repository containing pipeline script>.git
توجه:
-
ما از همان مخزن GitHub استفاده شده برای برنامه Spring برای قرار دادن اسکریپت خط لوله استفاده خواهیم کرد.
-
اگر میخواهید اسکریپت خط لوله را مستقیماً در رابط کاربری گرافیکی جنکینز بهجای منبعیابی از کنترل نسخه، ارائه دهید، تعریف خط لوله را بهعنوان «خط لوله» تنظیم کنید.
تعریف اسکریپت خط لوله
یک خط لوله جنکینز را با گنجاندن یک فایل متنی به نام تعریف کنید جنکینزفایل – حاوی اسکریپت خط لوله، در ریشه برنامه شما. اسکریپت خط لوله فرآیندهای CI/CD را که برنامه از آن عبور می کند، مشخص می کند. میتوانید با Jenkinsfile خود مشابه کد رفتار کنید و آن را در کنترل نسخه بررسی کنید.
در این آموزش ما a را تعریف می کنیم خط لوله اسکریپت شده با استفاده از نحو مرتبط با Groovy. موارد زیر را برای تعریف خط لوله ای که کد منبع شما را از GitHub با استفاده از افزونه Git شبیه سازی می کند و برنامه شما را می سازد، وارد کنید:
node {
stage("Clone project") {
git branch: 'main', url: 'https://github.com/<GitHub username>/<repo name>.git'
}
stage("Build project with test execution") {
sh "./gradlew build"
}
}
تغییرات خود را متعهد و فشار دهید، سپس به داشبورد جنکینز خود بروید، خط لوله خود را انتخاب کنید واکنون بسازیدجنکینز اسکریپت خط لوله شما را بازیابی می کند و مراحل تعریف شده در اسکریپت خط لوله شما را هماهنگ می کند. ساخت شما باید با موفقیت به پایان برسد.
راه اندازی تجزیه و تحلیل پوشش کد
ابزارهای تجزیه و تحلیل پوشش کد، مقدار کد آزمایش شده را کمیت می کنند، و به عنوان یک ابزار ارزشمند برای اطلاع رسانی در مورد ساختار کد و آزمایش تصمیمات مرتبط عمل می کنند. ما از JaCoCo استفاده خواهیم کرد، JaCoCo گزارش هایی را در مورد انواع مختلفی از معیارهای پوشش کد از جمله دستورالعمل ها، پوشش خط و شاخه تولید می کند.
برای پیکربندی JaCoCo مراحل زیر را اجرا کنید:
- افزونه JaCoCo Jenkins را نصب کنید.
- افزونه JaCoCo را در بلوک پلاگین ها در فایل build.gradle خود اضافه کنید.
plugins {
...
id 'jacoco'
}
- JaCoCo را پیکربندی کنید تا بعد از تست Gradle اجرا شود.
test {
finalizedBy jacocoTestReport
}
- Jenkinsfile را بهروزرسانی کنید، به نماینده JaCoCo در مورد اینکه چه فایلهایی را تجزیه و تحلیل کند، محل گزارش پوشش و حذف فایلهای آزمایشی را آموزش دهید.
node {
stage("Clone project") {
git branch: 'main', url: 'https://github.com/<GitHub username>/<repo name>.git'
}
stage("Build project with test execution") {
sh "./gradlew build"
}
jacoco(
execPattern: '**/*.exec',
sourcePattern: 'src/main/java',
exclusionPattern: 'src/test*'
)
}
تغییرات خود را انجام دهید و دوباره خط لوله جنکینز را بسازید. شما باید یک جدید داشته باشید روند پوشش دکمه در صفحه Pipeline شما که به اطلاعات اضافی در مورد پوشش کد پیوند می دهد.
استقرار یک تصویر کانتینر در DockerHub
در این بخش، تولید و استقرار خودکار یک تصویر کانتینر Docker را تنظیم خواهیم کرد. شما به یک حساب Docker Hub و پلاگین Jib Gradle نیاز دارید.
به دستور Docker از Pipeline Script دسترسی پیدا کنید
با استفاده از حساب Docker Hub خود، یک مخزن برای نگهداری تصویر کانتینر ایجاد کنید. پس از آن، اجازه دسترسی به نصب docker را در رایانه خود بدهید. برای رسیدن به این هدف مراحل زیر را اجرا کنید:
-
در جنکینز رابط کاربری گرافیکی، به مدیریت جنکینز > پیکربندی سیستم > خواص جهانی.
-
یک متغیر محیطی برای PATH+EXTRA با مقدار آن به عنوان دایرکتوری حاوی فایل اجرایی docker شما.
شما می توانید نصب docker خود را با اجرا پیدا کنیدwhere docker
در یک پنجره ترمینال به عنوان مثال، با توجه به یک مکان/usr/local/bin/docker
، مقدار مربوطه است/usr/local/bin/
.
اعتبار Docker Hub را در جنکینز تنظیم کنید
همچنین باید اعتبار ورود به Docker Hub خود را در Jenkins تنظیم کنید. a را تنظیم کنید نام کاربری با رمز عبور اعتبار با شناسه “DOCKER_CRED” و مقادیر مناسب برای نام کاربری و رمز عبور.
Jib را پیکربندی کنید
پلاگین Jib Gradle تولید یک تصویر کانتینر را بدون نیاز به فایل docker قادر می سازد. برای پیکربندی Jib مراحل زیر را اجرا کنید:
- افزونه را به بلوک پلاگین در خود اضافه کنید build.gradle فایل و مقادیر نام و تگ های تصویر را پیکربندی کنید.
plugins {
...
id 'com.google.cloud.tools.jib' version '3.3.1'
}
jib.to.image="<docker hub username>/<repository name>"
jib.to.tags = [version, 'latest']
- Jenkinsfile را بهروزرسانی کنید و مراحلی را اضافه کنید تا کار jib را فعال کنید.
node {
stage("Clone project") {
git branch: 'main', url: 'https://github.com/<GitHub username>/<repo name>.git'
}
stage("Build project with test execution") {
sh "./gradlew build"
}
stage("Deploy to DockerHub with Jib") {
withCredentials([string(credentialsId: 'DOCKER_PASSWORD', variable: 'DOCKER_PASSWORD'), string(credentialsId: 'DOCKER_USERNAME', variable: 'DOCKER_USERNAME')]) {
sh '''
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
./gradlew jib -Djib.to.auth.username="${DOCKER_USERNAME}" -Djib.to.auth.password="${DOCKER_PASSWORD}"
'''
}
}
jacoco(
execPattern: '**/*.exec',
sourcePattern: 'src/main/java',
exclusionPattern: 'src/test*'
)
}
تغییرات خود را انجام دهید و خط لوله جنکینز را بسازید. پس از ساخت موفق، تصویر کانتینر باید از مخزن Docker Hub شما در دسترس باشد.
استقرار برنامه در Heroku
ما با استفاده از پلتفرم Heroku به عنوان سرویسی برای میزبانی برنامه بوت بهار، به استقرار به عنوان آخرین مرحله رسیدگی خواهیم کرد. شما به یک حساب کاربری Heroku و پلاگین Heroku Gradle نیاز دارید.
برنامه را برای Heroku آماده کنید
یک برنامه جدید از داشبورد Heroku خود ایجاد کنید و به آن یک نام بدهید، سپس یک را اضافه کنید نمایه به ریشه برنامه Spring Boot خود حاوی دستور زیر برای راه اندازی برنامه شما web: java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/<Name of your jar file>.jar
. می توانید فایل jar خود را در قسمت پیدا کنید build/libs پس از اجرای وظیفه ساخت Gradle.
توجه:
-
از فایل jar “-plain” استفاده نکنید زیرا حاوی وابستگی های مورد نیاز برنامه شما برای اجرا نیست.
-
همچنین ایجاد کنید خصوصیات سیستم در ریشه برنامه Spring Boot خود فایل کنید و نسخه جاوا مورد استفاده برنامه خود را در آن مشخص کنید. مثلا،
java.runtime.version=17
به Heroku اطلاع می دهد که برنامه را با استفاده از زمان اجرا Java 17 راه اندازی کند.
کلید API Heroku را به عنوان اعتبار جنکینز تنظیم کنید
کلید Heroku API خود را از تنظیمات حساب خود بازیابی کنید. بعد، a را تنظیم کنید متن محرمانه اعتبار با شناسه “HEROKU_API_KEY” و کلید Heroku API خود را در قسمت مخفی قرار دهید.
پلاگین Heroku Gradle را پیکربندی کنید
- افزونه را به بلوک پلاگین در خود اضافه کنید build.gradle مقادیر نام برنامه Heroku را فایل و پیکربندی کنید.
plugins {
...
id 'com.heroku.sdk.heroku-gradle' version '3.0.0'
}
heroku.appName="<Heroku app name>"
- Jenkinsfile را با افزودن مراحل برای اجرای مرحله استقرار Heroku به موازات مرحله استقرار Jib به روز کنید.
node {
stage("Clone project") {
git branch: 'main', url: 'https://github.com/<GitHub username>/<repo name>.git'
}
stage("Build project with test execution") {
sh "./gradlew build"
}
stage("Deploy to DockerHub with Jib and to Heroku") {
parallel([
docker: {
withCredentials([usernamePassword(credentialsId: 'DOCKER_CRED', usernameVariable: 'DOCKER_USERNAME', passwordVariable: 'DOCKER_PASSWORD')]) {
sh '''
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
./gradlew jib -Djib.to.auth.username="${DOCKER_USERNAME}" -Djib.to.auth.password="${DOCKER_PASSWORD}"
'''
}
},
heroku: {
withCredentials([string(credentialsId: 'HEROKU_KEY', variable: 'HEROKU_API_KEY')]) {
sh './gradlew deployHeroku'
}
}
])
}
jacoco(
execPattern: '**/*.exec',
sourcePattern: 'src/main/java',
exclusionPattern: 'src/test*'
)
}
تغییرات خود را انجام دهید و خط لوله جنکینز را بسازید. پس از ساخت موفق، برنامه Heroku شما باید از طریق آن قابل دسترسی باشد https://<Heroku app name>.herokuapp.com/
نتیجه
ما توانستهایم از قابلیتهای Jenkins Pipelines برای خودکارسازی جنبههای اصلی CI/CD برای یک برنامه Spring Boot استفاده کنیم. ما یکپارچه سازی، تحویل و استقرار برنامه را پوشش داده ایم و مراحل فوق را برای اجرا با فشار یک دکمه ساده کرده ایم. می توانید با استفاده از محرک های ساخت Jenkins Pipeline برای اجرای دوره ای اسکریپت خط لوله یا بر اساس برخی رویدادها، به عنوان مثال، فشار دادن کد به GitHub، قدمی فراتر بردارید.
ما تعدادی از مراحل ضروری را در این آموزش پوشش دادیم. ابتدا برنامه خود را به یک مخزن GitHub فشار می دهیم، سپس از Jenkins Pipeline برای بازیابی و ساخت برنامه خود استفاده می کنیم. پس از آن، ما آنالیز پوشش کد را معرفی کردیم و سپس یک تصویر ظرف را به داکر هاب فرستادیم. در نهایت، ما برنامه خود را در پلتفرم Heroku به عنوان یک سرویس آماده برای مصرف مستقر کردیم.
با کار انجام شده، ویژگیهای جدید را میتوان مستقیماً به محیطهای مختلف و به مشتریان تحویل داد و در عین حال کیفیت را با اجرای توسعه مبتنی بر آزمایش و موفقیت ساخت در تکمیل موفقیتآمیز آزمایشها حفظ کرد.
می توانید کد کامل را در GitHub پیدا کنید.