خطوط أنابيب Jenkins و CI
(القسم: التكنولوجيا والهياكل الأساسية)
موجز موجز
لا يزال Jenkins هو «المحرك» العالمي لـ CI في البنى التحتية الهجينة iGaming: فهو يدمج تجميع التطبيقات والحاويات والاختبار والتحقق من صحة الأمان ونشر القطع الأثرية. النجاح هو خط أنابيب مثل الرمز (إعلان/تعدد البرانش)، والمكتبات المشتركة، والعوامل سريعة الزوال في كوبرنيتس، والأمن الشديد والأسرار، وإدارة GitOps للتكوين، ومقاييس الأداء والتكلفة.
1) هندسة جينكينز المعمارية للألعاب
وحدة التحكم (LTS) + العوامل: الحد الأدنى من الملحقات على وحدة التحكم ؛ يتم نقل العمل إلى الوكلاء.
العوامل سريعة الزوال: تعمل في «jnlp» ديناميكية K8s/under (بداية سريعة، بيئات نظيفة).
عزل العمل: مجلدات/حقوق (مجلدات + استراتيجية قائمة على الأدوار)، ائتمانات لأصغر الحقوق.
إمكانية الرصد: تصدير المقاييس (زمن الانتظار، قائمة الانتظار)، سجلات المراحل المركزية، بطاقة الهوية النزرة في خطوط الأنابيب.
2) أنماط الأنابيب: إعلانية ومتعددة البرانش
عند التصريح: خطوط الأنابيب القياسية ذات المراحل الموحدة، خطوات «البريد» الواضحة.
عند الكتابة: فروع «مخصصة» نادرة.
Multibranch: auto-pipline لكل فرع/PR ؛ سياسات الفرع النشط فقط.
خط الأنابيب الإعلاني الأساسي
groovy pipeline {
agent { label 'k8s' } // или agent { kubernetes {... } }
options {
timestamps()
ansiColor('xterm')
buildDiscarder(logRotator(numToKeepStr: '50'))
timeout(time: 30, unit: 'MINUTES')
disableConcurrentBuilds()
}
environment {
REGISTRY = 'registry. example. com'
IMAGE = "${env. REGISTRY}/payments:${env. GIT_COMMIT}"
}
stages {
stage('Checkout') {
steps { checkout(scm) }
}
stage('Lint & Unit') {
parallel {
stage('Lint') { steps { sh 'make lint' } }
stage('Unit') { steps { sh 'make test' } }
}
}
stage('SCA/SAST') {
steps {
sh'make deps_audit'//SCA (dependencies)
sh'make sast '//static analysis
}
}
stage('Build Image') {
steps { sh 'docker build -t $IMAGE. && docker push $IMAGE' }
}
stage('SBOM & Sign') {
steps {
sh 'syft $IMAGE -o spdx-json > sbom. json'
sh 'cosign sign --key $COSIGN_KEY $IMAGE'
archiveArtifacts artifacts: 'sbom. json', fingerprint: true
}
}
}
post {
success { echo '+ Build OK' }
failure { echo '- Build failed'; sh 'printenv sort sed -n "1,50p"' }
always { cleanWs() }
}
}
3) عوامل Kubernetes وبيئات الحاويات
مثال podTemplate (إعلان)
groovy pipeline {
agent {
kubernetes {
yaml """apiVersion: v1 kind: Pod spec:
serviceAccountName: jenkins containers:
- name: build image: docker:27-dind securityContext: { privileged: true }
- name: tools image: alpine:3. 20 command: ['cat']
tty: true
"""
defaultContainer 'tools'
}
}
stages {
stage('Build in DinD') {
steps {
container('build') {
sh '''
dockerd-entrypoint. sh & sleep 5 docker build -t $IMAGE.
docker push $IMAGE
'''
}
}
}
}
}
الممارسة: مخبأ الطبقة عن طريق «الدير الفارغ »/المخبأ البعيد ؛ وحدة المعالجة المركزية/ذاكرة الوصول العشوائي ؛ حدود "nodeSelector/tains' لفصل التجميعات الثقيلة.
4) المكتبات المشتركة: DRY والمعايير الموحدة
ابرز الخطوات المشتركة (البطانات، SAST، التجميع، النشر) في المكتبة المشتركة.
groovy
// vars/withQuality. groovy def call(Closure body) {
stage('Quality Gate') {
parallel(
"Lint": { sh 'make lint' },
"Unit": { sh 'make test' },
"SCA": { sh 'make deps_audit' }
)
}
body()
}
الاستخدام:
groovy
@Library('ci-lib@v3') _
pipeline {
agent any stages {
stage('Pipeline') {
steps {
withQuality {
sh 'make build'
}
}
}
}
}
نصائح: إصدار المكتبة («العلامات»)، تغطي باختبارات وحدة الخطوات، احتفظ بـ CHANGELOG.
5) الأسرار ووثائق التفويض
أوراق الاعتماد ملزمة: «اسم المستخدم كلمة المرور»، «سلسلة»، «ملف»، «sshUserPrivateKey».
النطاقات السرية: الحقوق الدنيا ؛ إلا في المراحل المناسبة.
المديرون السريون: مقدمو المستودعات الخارجية (KMS/Secrets Manager/HashiCorp Vault).
groovy withCredentials([string(credentialsId: 'cosign-key', variable: 'COSIGN_KEY')]) {
sh 'cosign sign --key $COSIGN_KEY $IMAGE'
}
6) متزامنة، مصفوفات، ذاكرة تخزين مؤقت
مجموعات المصفوفات
groovy stage('Test Matrix') {
matrix {
axes {
axis { name 'PY'; values '3. 10', '3. 12' }
axis { name 'DB'; values 'mysql', 'postgres' }
}
stages {
stage('Run') { steps { sh 'pytest -q' } }
}
post { always { junit 'reports/.xml' } }
}
}
التخزين المؤقت: مخبأ طبقة Docker، مخبأ التبعية ('~/.m2'، '~/.cache/pip') على الحجم ؛ القطع الأثرية بين المراحل - من خلال «التخزين/التخزين» أو تخزين القطع الأثرية.
7) فحوصات السلامة والامتثال
SCA/SAST/Secret-scan in CI، DAST في بيئة منفصلة.
SBOM (Syft/CycloneDX)، توقيع القطع الأثرية (cosign)، سياسة النشر غير الموقعة.
بوابات السياسات: وقف خط الأنابيب لمركبات الكربون الكلورية فلورية الحرجة ؛ في العلاقات العامة.
خطوط PII: لا تسجل الأسرار، تخفي المتغيرات، عوامل منفصلة للتجمعات الحساسة.
8) نشر القطع الأثرية وتكامل القرص المدمج
السجل: Docker/OCI مع سياسة الاحتفاظ، وعلامات الحصانة.
باقة Repos: Maven/NPM/PyPI proxy + cache.
مشغلات الأقراص المدمجة: إرسال الأحداث إلى Argo CD/Flagger، أو إنشاء العلاقات العامة في مستودع بيانات GitOps.
9) تكوين Jenkins كرمز (JCasC) и GitOps
احتفظ بتكوين وحدة التحكم كرمز: وظائف القالب، الاعتمادات (الروابط)، RBAC، الوكلاء.
yaml jenkins:
systemMessage: "Jenkins (iGaming CI)"
numExecutors: 0 authorizationStrategy:
roleBased:
roles:
global:
- name: "readers"
pattern: "."
permissions: ["Overall/Read"]
nodes:
- permanent:
name: "edge-builder"
remoteFS: "/home/jenkins"
labels: "docker"
unclassified:
location:
url: "https://ci. example. com/"
credentials:
system:
domainCredentials:
- credentials:
- string:
id: "cosign-key"
description: "Cosign key ref"
secret: "${COSIGN_KEY_FROM_ENV}"
الممارسة: التهيئة - في Git، استعراض العلاقات العامة، الترويج dev→stage→prod ؛ - من خلال المتغيرات/المديرين الخارجيين.
10) إمكانية الرصد والموثوقية والتكلفة
المقاييس: قائمة الانتظار، مدة المراحل، النسبة المئوية لإعادة التشغيل، إنتاجية العوامل.
الإخفاقات: «إعادة المحاولة»، «المهلة»، وضع علامات «مستقرة» على الاختبارات غير المستقرة، الإشعارات في ChatOps.
FinOps: الإغلاق التلقائي للوكلاء العاطلين، وحدود التجميع المتزامنة، وحصص المجلد/الأمر.
11) خطوط أنابيب لمهام مختلفة
خدمة Backend/Web
Lint/Units → SAST/SCA → Build → SBOM/Sign → Publish → (CD trigger).
البيانات/ETL
اختبار dbt → تولد القطع الأثرية → تحليل SQL الثابت → ونشر النماذج والوثائق.
ML/LLM
التحقق من البيانات/الترخيص → التدريب على العوامل الموقعية → اختبارات التصدير → perf (زمن الانتقال/الرموز/s) → التوقيع على النموذج ونشره.
12) رونابوك (حوادث نموذجية)
قائمة الانتظار آخذة في الازدياد: أضف وكلاء، وتحقق من خطوط الأنابيب «المعلقة»، وحدود التزامن.
طفو التجميعات: ركل نسخ من الأدوات في حاوية الوكيل ؛ تعطيل مساحة العمل المشتركة.
«تسرب» السري إلى السجلات: تحذف سجلات البناء، وتحل محل الائتمان، وتجري مراجعة للحسابات ؛ أضف القناع.
إسقاط وحدة التحكم: يتم التعرف على الاسترداد من التخزين الوظيفي/الإضافي الاحتياطي JCasC +.
13) قائمة التنفيذ المرجعية
1. Jenkins LTS مع مجموعة دنيا من الملحقات ؛ كل شيء آخر في العملاء.
2. عوامل K8s سريعة الزوال، حدود الموارد، مخابئ الطبقات.
3. Declarative/Multibranch, PR validation, 'post {always {cleanWs ()}}'.
4. المكتبات المشتركة مع نسخ ؛ خطوات موحدة للجودة والسلامة.
5. وثائق التفويض ملزمة + أسرار خارجية ؛ الحد الأدنى من النطاقات.
6. SCA/SAST/Secret-scan/DAST و SBOM وتوقيع الصورة.
7. إدارة تشكيلات JCasC و GitOps ؛ استعراض العلاقات العامة للتغييرات.
8. المقاييس/التنبيهات/عمليات الدردشة ؛ التراجعات/المهلات ؛ القطع الأثرية والمجلات.
9. سياسات التخزين/الاحتفاظ، والنظافة الذاتية لأماكن العمل.
10. رونابوك موثق وأيام اللعبة العادية.
14) أنتيباترن
وحدة التحكم «مثل خادم كل شيء»: تجميعات ثقيلة وملحقات عليها.
وظائف مكتوبة بدون إصدار ومراجعة رمز.
خلط الأسرار والسجلات ؛ القروض ذات الحقوق الواسعة.
العوامل قليلة/هي بيئات انجراف ثابتة →، اختبارات قشرية.
عدم وجود SBOM/توقيع CVE على القطع الأثرية والبوابات.
التحكم في التهيئة «اليدوية»، لا يوجد JCasC/GitOps.
موجز
يظل Jenkins نواة CI قوية ومرنة. من خلال ترجمة التكوين إلى رمز (JCasC)، وتوحيد الخطوات في المكتبات المشتركة، والتشغيل يبني على عوامل K8s سريعة الزوال، وتضمين الأمان/التوقيع/SBOM مباشرة في خط الأنابيب، تحصل على إصدارات يمكن التنبؤ بها، والتكلفة الخاضعة للرقابة، ومرونة ذروة تحمل iGaming.