مقدمه ای بر جنکینز – ابزار CI/CD

جنکینز یک ابزار منبع باز CI/CD است که به طور گسترده در DevOps استفاده می شود. این راهنما شامل نصب Jenkins، استفاده از Secrets در Jenkins و نوشتن یک Jenkinsfile برای کشیدن و فشار دادن یک تصویر Docker به یک Oracle Cloud Container Registry است.
CI/CD چیست؟
بخش مهمی از یک روش توسعه خوب، یک تمرین خوب یکپارچه سازی/توسعه مستمر (CI/CD) است که بر روی استقرار به روز رسانی های برنامه شما برای استفاده عموم تمرکز دارد.
یک خط لوله CI/CD را می توان به دو بخش تقسیم کرد (بدیهی است):
- ادغام
به ادغام کد جدید در پایگاه کد مرکزی می پردازد. این شامل بررسیها (بررسیهای پرز/قالب، بررسی ساخت، آزمایشهای واحد پایه، قرار گرفتن در معرض مخفی) و مراحل یکپارچهسازی با پایگاه کد مانند کشیدن کد خارجی و درخواست بررسی است.
2. گسترش
مواردی مانند ساختن یک تصویر Docker، فشار دادن آن، و بیرون راندن بهروزرسانی استقرار به روشی ایمن، احتمالاً با استفاده از آزمایش A/B
بسیاری از این موارد مانند آزمایشهای در حال اجرا تکراری هستند و بنابراین میتوانند خودکار شوند، مثلاً در هر فشار کد جدید.
وارد جنکینز شوید.
اگر نام GitHub Actions را شنیده اید، جنکینز خواهر سطح پایین تر و منبع باز GitHub Actions است که امکان سفارشی سازی های بسیار بیشتری را فراهم می کند.
نصب جنکینز
Jenkins یک ابزار مستقل است که میتوانید آن را بهطور پیشفرض در http://localhost:8080 نصب و اجرا کنید.
دستورالعمل نصب را در صفحه رسمی جنکینز ببینید.
صفحه اصلی جنکینز شما (localhost:8080) تا حدودی شبیه به این است:
اجرای یک دستور اولیه Shell در جنکینز
بیایید از کوچک شروع کنیم و یک کار ساختی بسازیم که روی کنسول چاپ شود.
از صفحه اصلی، کلیک کنید گزینه جدید > پروژه سبک آزاد (به یاد داشته باشید پروژه خود را نام ببرید).
هنگامی که پروژه را ایجاد کردید و به صفحه پیکربندی رسیدید، به پایین بروید تا مراحل ساخت را پیدا کنید و یک شل را اجرا کنید گام.
چیزی شبیه به:
echo "hello123"
و کلیک کنید صرفه جویی.
در صفحه پروژه، کلیک کنید اکنون بسازید و ببینید که Build History با بیلد شماره 1 شما ظاهر می شود. روی آن کلیک کنید.
کلیک خروجی کنسول و مشاهده کنید که اکو شما در کنسول چاپ شده است:
ذخیره اسرار
ذخیره اسرار برای تزریق بعداً به ساخت خود در جنکینز آسان است. برای ایجاد یک راز جدید، روی تصویر نمایه خود > اعتبارنامه > (جهانی) > افزودن اعتبارنامه کلیک کنید.
می توانید ترکیب نام کاربری/رمز عبور، اسرار متنی، اسرار فایل و موارد دیگر را اضافه کنید.
بیایید سعی کنیم a اضافه کنیم .env
فایل به عنوان نمونه از آنجایی که در مک نمی توانم a را انتخاب کنم .env
فایل از Finder، نام آن را به fenv
. بیایید به اعتبار یک شناسه بدهیم fd-env-f
.
و در اینجا، من نام کاربری و رمز عبور ورود به سیستم Oracle Container Registry Docker خود را اضافه میکنم، یعنی Token Auth. می توانید در مقاله دیگری درباره استفاده از رجیستری کانتینر بیشتر بخوانید.
یک نمونه فشار کامل Docker با Jenkinsfile
هدف ما برای این بخش آخر درک این موضوع است Jenkinsfile
:
// Jenkinsfile
pipeline {
agent any
stages {
stage('Clean workspace') {
steps {
cleanWs()
}
}
stage('Git pull after each commit') {
steps {
git branch: 'dev', credentialsId: 'fd-git-creds', url: 'https://github.com/farisdurrani/nonexistentrepo'
echo 'pulled successfully'
}
}
stage('Build and Push Docker Frontend Image') {
steps {
withCredentials(
[file(credentialsId: 'fd-env-f', variable: 'mapEnvF')]
) {
script {
docker.withRegistry(registryUrl, registryCredential) {
// create .env file
sh "sudo touch ./frontend/.env"
sh "sudo chmod 666 ./frontend/.env"
sh "cp \"$mapEnvF\" ./frontend/.env"
// build image, push to registry, and remove image
image = docker.build(
"$frontendImage",
"./frontend"
)
image.push(tagLatest)
sh "docker rmi ${image.id}"
}
}
}
}
}
}
environment {
tenancyNamespace = 'id8wj7jebvoqh'
registry = 'iad.ocir.io'
registryCredential = "fd-docker-oci-container-registry"
registryUrl = "https://$registry/"
tagPrefix = "$registry/$tenancyNamespace"
frontendImage = "$tagPrefix/myapp-f:latest"
// required to save/re-use Yarn cache across multiple runs
YARN_GLOBAL_FOLDER = "${JENKINS_HOME}/workspace/.yarn/global"
}
}
این فایل کد خط لوله ساخت جنکینز این برنامه است که معمولاً در فهرست اصلی مخزن برنامه ذخیره می شود و به طور معمول نامیده می شود. Jenkinsfile
.
این فایل دارای 3 مرحله است که هر مرحله مراحل خاص خود را دارد:
- پاک کردن فضای کاری – تمام فایل های ساخت قبلی که در ساخت های قبلی ایجاد شده بودند را حذف کنید
- Git pull – کشیدن کد از مخزن
- تصویر Docker را بسازید و به رجیستری کانتینر اوراکل فشار دهید
دو مورد اول نسبتاً ساده هستند. توجه داشته باشید که ما از a استفاده می کنیم credentialsId
، برای ورود به git repo در Credentials ایجاد شده است.
هدف مرحله سوم ساخت و فشار دادن تصویر داکر در حین تزریق a است .env
فایل در تصویر
و بله، باید از Docker داخلی استفاده کنید --build-arg
برای انجام این کار پرچم گذاری کنید، اما ما در اینجا بیشتر نگران عملکرد پایه جنکینز هستیم.
با استفاده از withCredentials
تابع، ما قادریم فایل مخفی را با استفاده از شناسه آن انتخاب کرده و قبل از فشار دادن، محتویات آن را در تصویر داکر کپی کنیم. با توجه به ماهیت محدود رازهای جنکینز، کمی کپی پیست برای دریافت محتوای خام آن ضروری است.
کپی پیست کردن Jenkinsfile
با ورود به یک خط لوله جدید جنکینز (نه یک پروژه فری استایل)، ما یک خط لوله مناسب آماده کرده ایم.
از طرف دیگر، ممکن است انتخاب کنید که خط لوله جنکینز به a Jenkinsfile
با انتخاب در یک مخزن git ذخیره می شود Pipeline script from SCM
به عنوان تعریف خط لوله:
کار را ذخیره و اجرا کنید. در اینجا نمونه ای از ظاهر بسیاری از مشاغل ساخت جنکینز آورده شده است:
مهم: مجوزهای Docker
ممکن است هنگام استفاده از Docker در Jenkins با این مشکل مواجه شوید:
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
برای حل این مشکل به این پاسخ StackOverflow اشاره می کنم که پیشنهاد می کند هر بار که رایانه شما راه اندازی می شود در ترمینال اصلی خود اجرا کنید:
sudo chmod 666 /var/run/docker.sock
مهم: "
در مقابل '
در جنکینزفایل
یک تمایز قوی بین دو نقل قول وجود دارد "
و تک نقل قول ها '
در جنکینزفایل "
درون یابی رشته ای را فعال می کند، به عنوان مثال،docker rmi ${image.id}
در حالی که '
نمی کند، و باعث می شود رشته خام را بدون جایگزینی به همان شکلی که هست برگرداند.
ساختمان با برنامه زمانبندی
برای اجرای خط لوله ساخت جنکینز در یک زمان بندی با هر تغییر کد، کافی است یک را اضافه کنید نظرسنجی SCM به عنوان مثال، گزینه زیر Build Triggers،
H/30 * * * *
برای اجرای کار ساخت هر 30 دقیقه. اگر هیچ تغییری در کد راه دور شناسایی نشد، خط لوله اجرا نمی شود.
بیانیه بندر امن
اطلاعات ارائه شده در این کانال/مقاله/داستان صرفاً برای مقاصد اطلاعاتی در نظر گرفته شده است و نمی توان از آن به عنوان بخشی از هیچ قرارداد قراردادی استفاده کرد. محتوا تحویل هیچ ماده، کد یا عملکردی را تضمین نمی کند و نباید تنها مبنای تصمیم گیری خرید باشد. پست های این سایت متعلق به من است و لزوماً منعکس کننده دیدگاه ها یا کارهای Oracle یا Mythics, LLC نیست.
این اثر تحت مجوز Creative Commons Attribution 4.0 بین المللی مجوز دارد.