استمرارًا للمقال السابق حول أدوات النشر في Kubernetes ، أريد أن أخبركم عن كيفية استخدام Jsonnet لتبسيط وصف المهمة في .gitlab-ci.yml

دانو
يوجد مونوريبا:
- 10 عمال ميناء
- 30 وصفها ينشر
- 3 بيئات: التنمية ، التدريج والإنتاج
مهمة
قم بإعداد خط أنابيب:
- يجب أن يتم إنشاء صور Docker عن طريق إضافة علامة git مع إصدار.
- يجب إجراء كل عملية نشر عند الضغط على فرع البيئة وفقط عن طريق تغيير الملفات في دليل محدد
- كل بيئة لها عداء gitlab خاص بها مع علامة منفصلة لا تؤدي إلا النشر في بيئتها.
- لا ينبغي نشر جميع التطبيقات في كل من البيئات ؛ يجب أن نصف خط الأنابيب من أجل أن نكون قادرين على تقديم استثناءات.
- تستخدم بعض عمليات النشر GIT_SUBMODULE_STRATEGY=normalgit ويجب أن تبدأ مع المتغير المحددGIT_SUBMODULE_STRATEGY=normal
قد يبدو وصف كل هذا جحيمًا حقيقيًا ، لكننا لا نحبط ونسلح بـ Jsonnet ، فسنقوم بذلك بسهولة وبشكل طبيعي.
قرار
يحتوي gitlab-ci.yml على إمكانات مضمّنة لتقليل وصف الوظائف المتكررة ، على سبيل المثال ، يمكنك استخدام الامتدادات أو التضمين ، ولكنها لا توفر templating كامل ، والذي لا يسمح لك بوصف العمل الأكثر إيجازًا وفعالية.
لحل هذه المشكلة ، أقترح استخدام jsonnet ، والذي يتيح لك التخلص تقريبًا من تكرار التعليمات البرمجية عند وصف أي بنية بيانات.
عند العمل مع jsonnet ، أوصي بشدة بتثبيت مكون إضافي لمحررك
على سبيل المثال ، بالنسبة إلى vim ، يوجد مكون إضافي لـ vim-jsonnet يقوم بتشغيل تسليط الضوء على بناء الجملة ويقوم تلقائيًا بتنفيذ jsonnet fmt في كل مرة يتم حفظه (يتطلب تثبيت jsonnet).
دعونا نلقي نظرة على هيكل مستودعنا:
 . ├── deploy │  ├── analyse │  ├── basin │  ├── brush │  ├── copper │  ├── dinner │  ├── dirty │  ├── drab │  ├── drunk │  ├── education │  ├── fanatical │  ├── faulty │  ├── guarantee │  ├── guitar │  ├── hall │  ├── harmonious │  ├── history │  ├── iron │  ├── maniacal │  ├── mist │  ├── nine │  ├── pleasant │  ├── polish │  ├── receipt │  ├── shop │  ├── smelly │  ├── solid │  ├── stroke │  ├── thunder │  ├── ultra │  └── yarn └── dockerfiles ├── dinner ├── drunk ├── fanatical ├── guarantee ├── guitar ├── harmonious ├── shop ├── smelly ├── thunder └── yarn 
سيتم بناء صور عامل الميناء باستخدام kaniko
سيتم نشر التطبيقات على الكتلة باستخدام qbec . يوصف كل تطبيق لثلاث بيئات مختلفة ، من أجل تطبيق التغييرات على الكتلة ، يكفي تنفيذ:
 qbec apply <environment> --root deploy/<app> --yes 
حيث:
- <app>- اسم طلبنا
- <environment>هي إحدى بيئاتنا : devel أو stage أو prod .
في النهاية ، يجب أن تبدو وظائفنا كما يلي:
التجمع:
 build:{{ image }}: stage: build tags: - build image: name: gcr.io/kaniko-project/executor:debug entrypoint: [""] script: - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/{{ image }}/Dockerfile --destination $CI_REGISTRY_IMAGE/{{ image }}:$CI_COMMIT_TAG only: refs: - tags 
بدلاً من {{ image }} ، سيتم استبدال اسم الدليل من dockerfiles
نشر:
 deploy:{{ environment }}:{{ app }}: stage: deploy tags: - {{ environment }} script: - qbec apply {{ environment }} --root deploy/{{ app }} --force:k8s-context __incluster__ --wait --yes only: changes: - deploy/{{ app }}/**/* refs: - {{ environment }} 
بدلاً من {{ app }} ، سيتم استبدال اسم الدليل من النشر ،
وبدلاً من {{ environment }} - اسم البيئة التي تريد نشرها.
دعونا وصف النماذج الأولية لوظائفنا على أنها كائنات في lib / jobs.jsonnet منفصلة
 {  
يرجى ملاحظة أنني عمداً لم أحدد المراجع tags لجعل مكتبتنا أكثر مرونة وإظهار إمكانيات jsonnet لك تمامًا ، سنضيفها لاحقًا من الملف الرئيسي.
الآن سوف نصف .gitlab-ci.jsonnet لدينا:
 
انتبه إلى وظائف ref ، و tag ، و subodule في بداية الملف ؛ فهي تسمح لك بإنشاء كائن طاغ.
شرح بسيط: استخدام " +: " بدلاً من " : " لكائنات التجاوز يسمح لك بإضافة قيمة إلى كائن موجود أو قائمة.
على سبيل المثال " : " للحكام :
 local job = { script: ['echo 123'], only: { refs: ['tags'] }, }; local ref(x) = { only+: { refs: [x] } }; job + ref('prod') 
سيعود:
 { "only": { "refs": [ "prod" ] }, "script": [ "echo 123" ] } 
وهنا " +: " للحكام :
 local job = { script: ['echo 123'], only: { refs: ['tags'] }, }; local ref(x) = { only+: { refs+: [x] } }; job + ref('prod') 
سيعود:
 { "only": { "refs": [ "prod", "tags" ] }, "script": [ "echo 123" ] } 
كما ترون ، فإن استخدام Jsonnet يسمح لك بوصف كائناتك ودمجها بكفاءة عالية ، في الإخراج ، ستحصل دائمًا على JSON الجاهزة ، والتي يمكننا الكتابة إليها على الفور .gitlab-ci.yml :
 jsonnet .gitlab-ci.jsonnet > .gitlab-ci.yml 
تحقق من عدد الخطوط:
 
في رأيي ، هذا جيد جدًا!
تستطيع أن ترى المزيد من الأمثلة وتشعر Jsonnet مباشرة على الموقع الرسمي: jsonnet.org
إذا كنت مثلي ، مثل Jsonnet ، فقم بالانضمام إلى مجموعتنا في telegram t.me/jsonnet_ru