تحديث عملية CI / CD: نشر الأخطبوط

صورةالجزء الثالث من المقالة حول تحديث عمليات CI / CD. 

في هذه المرحلة ، لدينا (على الأقل يجب أن يكون لدينا) فهمًا لكيفية عمل CI ، وما لدينا عند المدخلات ، وكيفية الحصول على النتيجة منه ، وما يجب القيام به حتى يصبح ناتج البناء وحدة مشروع كاملة ويبدأ. وكذلك الأخطبوط (يفضل أن يكون LTS). في الجزء الأخير ، تم النظر في عملية إنشاء المدينة الجماعية: كل ما يحدث منذ اللحظة التي يدخل فيها الرمز إلى المستودع وحتى يمكن تفريغ الأرشيف الجاهز ، ومن الناحية النظرية ، يجب أن يعمل.

أذكر جدول المحتويات:

الجزء 1: ما هو ، لماذا لا يبدو ، التخطيط ، القليل من الباش. أود أن أسمي هذا الجزء شبه التقني.
الجزء 2: teamcity.
الجزء 3: نشر الأخطبوط.
الجزء الرابع: خلف الكواليس. لحظات غير سارة ، خطط للمستقبل ، ربما أسئلة متكررة. على الأرجح ، يمكن أن يطلق عليه أيضًا شبه تقني.

الأخطبوط: عام


عند الإدخال ، لدينا الكود ، في الإخراج ، والتركيبات ، كل شيء واضح هنا. لكن النتيجة لكل وحدة تتكون من جزأين: حزمة أساسية (نتيجة البناء نفسه) ، وحزمة فردية (تكوينات ومكتبات فريدة). لذا ، لكي تعمل وحدة معينة ، نحتاج إلى شيء مثل ما يلي:

  1. مثيل في IIS له تجمّع خاص به و "يبدو" في جذر المستند. يتم تخصيص تجمع منفصل لكل وحدة نمطية.
  2. ملفات الحزمة الأساسية في جذر المستند.
  3. ملفات حزمة فردية في جذر المستند.
  4. من المستحسن عمل نسخة احتياطية من المحتويات القديمة لجذر المستند أمام كل هذا. نحن ، بالطبع ، واثقون من أنفسنا ، لكن الناس منقسمون إلى نوعين: أولئك الذين لا يقومون بالنسخ الاحتياطي ، والذين يفعلون بالفعل
  5. ( ) ( ). , , .
  6. , , .
  7. , .
  8. () .

ليس بهذا القدر ، لكن ليس بما يكفي. لا توجد مشاكل في الخطوة 1. الأخطبوط لديه قالب نشر إلى IIS ، لديه كل ما تحتاجه. في الخطوتين 2 و 3 سوف نسهب في مزيد من التفاصيل أدناه. في الخطوة 4 ، يكون المتغير المطلوب كافياً ، والذي سنمرره من teamcity. الخطوة 5 هي نص برمجي. كما سيقوم بتدوير النسخ الاحتياطية. لماذا نحتاج إلى تخزينها كلها ، يمكن إزالة القديمة منها. الخطوة 6 هي أيضًا powerhell. الخطوة 7 - نموذج Slack - إخطار مفصل. الخطوة 8 - powerhell مرة أخرى. يبدو وكأنه خطة ، لذلك سنقوم بتنفيذها.

المستأجرين


مزيد من التفاصيل حول الخطوتين 2 و 3. أفترض أن القارئ على دراية بنشر الأخطبوط. إن لم يكن - هناك مقالات رائعة (وفقط) موجودة على المحور يمكنهم إعطاء فهم أساسي. ها هم: واحد و الثانية . لذلك ، لدينا علامات تبويب للمشاريع والبنية التحتية والمستأجرين والمكتبات والمهام والإعدادات الحالية. ضروري - المستأجرين. الترجمة الحرفية لكلمة المستأجر هي المستأجر. في هذا السياق ، على الأرجح أن يكون العميل ، العميل. يخبرنا Oktopus أن المستأجرين يسمحون لك بنشر مثيلات مختلفة من المشروع دفعة واحدة للعديد من العملاء (المستأجرين). هذه هي الصفحة مع قائمتهم.

صورة

في هذه الحالة ، يتم استخدام المستأجرين بشكل مختلف قليلاً. يمثل كل مستأجر عميل فردي. بالنسبة للمستأجر هناك فرصة لإضافة المشاريع التي سيتم إطلاقها عند نشرها. وبالتالي سيكون هناك مشروع أساسي ومشروع فردي.
هناك علامتان لكل مستأجر: TenantRole - شائع للجميع ، مما يشير إلى أن وحدة من نوع معين (أساسي) يتم نشرها لجميع المستأجرين مع هذه العلامة ، و ModName هي علامة تطابق اسم الوحدة (فردي). 

صورة

يتم استلام الأخطبوط الأخير من timcity كمعلمة ، وبالتالي تحديد الوحدة النمطية التي يتم نشرها حاليًا ( Deploy.Env و Deploy.2 ).

كما ترى من الشاشة ، عند نشر وحدة نمطية لمؤسسة معينة ، سيبدأ المشروع الأساسي أولاً ( نشر .2 خطوة المدينة الجماعية) ، ثم مشروع فردي (نشر الخطوات 3 ونشر 4 teamcity ). يمكن لكل مستأجر الوصول إلى متغيرات جميع المشاريع المضمنة فيه ، بالإضافة إلى متغيرات المستأجر نفسه (التي تم جمعها في مجموعة متغيرة ، وتحتوي على علامة ModName).

صورة

 يتم اختيار المستأجر للنشر في الفريق على النحو التالي: 

  • متغير env.tenantRoleTag - يحتوي على TenantRole (اسم علامة المستأجر في الأخطبوط) ، وقيمته الفعلية ؛
  • env.modName - قيمة علامة ModName في الأخطبوط.

المتغيرات


المتغيرات هي جزء مهم من المشروع ، ويجب أن يتم هيكلتها بشكل صحيح. في هذا المشروع ، تنقسم متغيرات الأخطبوط إلى ثلاثة أنواع: شائعة لجميع المشاريع (التي تم جمعها في مجموعة المكتبة "البيئة") ، والفرد لكل مشروع (تم تكوينه مباشرة في المشروع) ، والمتغيرات مباشرة من المستأجرين (مجموعة مكتبة أيضًا). في البيئة ، كما سبق ذكره ، كل شيء مشترك لجميع المشاريع ، على وجه الخصوص: 

  • المسارات الأساسية لجذر المستند (على سبيل المثال ، C: \ inetpub \) ؛
  • عنوان URL الأساسي (على سبيل المثال ، بالنسبة لجميع الوحدات ، النطاق العام هو organization.com) ؛
  • الوصول إلى قواعد البيانات (اللازمة لتنظيم النسخ الاحتياطية) ؛
  • إلخ

زائد كبير هو أنه في الأخطبوط لكل بيئة قد تكون هناك قيمة متغيرة. يمكن أن يكون الانفصال أي شيء.

صورة

على سبيل المثال ، الخطوط 3 و 6 و 7 على الشاشة. السطر 3 حالة شائعة. كل ما يحتاج إلى نشره في بيئة الإنتاج يحصل هنا. يصف السطران 6 و 7 حالات محددة للغاية ، على سبيل المثال: بيئة الإنتاج مع دور "CompanyWebsite" (السطر 6) ، وبيئة الإنتاج بعلامة المستأجر "orgznizationX". هذا ضروري لتحديد الخوادم التي ستحصل عليها الحزمة ، لأنه بالنسبة للمؤسسة X ، على سبيل المثال ، يتم تخصيص خادم منفصل.

متغيرات المشروع تشمل كل شيء آخر. شيء غير شائع ويختلف باختلاف البيئات ، على سبيل المثال ، اسم المجال المؤهل بالكامل للوحدة النمطية. بشكل عام ، يتم تصنيفها كـ # {Tenant.ModName}. # {BaseModuleDomain} ، ومع ذلك ، قد تكون مختلفة في بعض الحالات.

صورة

 يتم عرض مثل هذه الحالة في الصورة.

القنوات


ما زال يستحق الحديث عن القنوات. باختصار وبسرعة - تسمح لك القنوات بتعيين منطق النشر. واضحة جدا، وهذا هو موضح في وثائق رسمية، ولا سيما هنا و هنا . على سبيل المثال ، يمكن أن يدخل إصدار به علامة مستقرة فقط إلى قناة الإنتاج ، إلخ. هناك 4 قنوات في المشروع تتوافق مع البيئات (التطوير ، الاختبار ، المرحلة ، الإنتاج). تقع الإصدارات وفقًا لعلامات الإصدار التجريبي. يشار إلى ذلك في تنسيق teamcity رقم البناء ( Build.General الإعدادات للجزء حول teamcity). من teamcity ، يتم نقل القناة في الخطوة Deploy.2 إلى حقل وسيطات سطر الأوامر الإضافية (معلمة القناة).

أنماط - رسم


إذا لم تكن قد قدرت بعد جميع مزايا استخدام القوالب أثناء قراءة مقال حول teamcity ، فقد حان الوقت. من المستحسن صياغة خطوات مخصصة شائعة بما يكفي ، لأنه إذا كانت هناك حاجة لإجراء تعديلات ، فسيتعين عليك تذكر الأماكن التي يتم فيها تطبيق هذه الخطوة ، والنقر على كل مكان مشابه وإجراء تعديلات عدة مرات مثل استخدامات هذه الخطوة. في هذا المشروع ، تم إنشاء النماذج للتحقق من صحة الموقع وإرسال قائمة بالنطاقات إلى فريق العمل. النظر بإيجاز في عملية إنشاء قالب.

هناك سكربت بوويرشيل الذي يجب تشغيله في كل مرة بعد نشر أي وحدة نمطية.

$url = "$scheme" + "://" + "$domain"
Write-Host "Requesting '$url'"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$request = [System.Net.WebRequest]::Create($url)
$request.Timeout = $timeout
$response = $request.GetResponse()
$response.Close()

يقبل النص البرمجي مخطط الإدخال والنطاق والمهلة التي نعتقد بعدها أن الموقع لا يعمل. يمكنك إنشاء قالب في المكتبة - قوالب الخطوة.

أدخل اسمًا ، واختر شعارًا. بعد ذلك ، قم بتكوين معلمات الإدخال وقيمها الافتراضية. قد تكون القيمة الافتراضية أيضًا هي قيمة المتغير المحدد (قيمة المتغير # {HostName} هي القيمة الافتراضية لمعلمة الإدخال # {المجال}).

صورة

بعد ذلك ، نعدل النص قليلاً ونضيفه كخطوة للتنفيذ:

صورة

تم. في المخرج ، نحصل على نموذج خطوة ممتعة للعمل معه ، وأيضًا ، في غياب عملنا ، سيكون الزملاء قادرين على معرفة القيم الميدانية دون قراءة النصوص الغامضة.

صورة

الأخطبوط: تفاصيل العملية


تنقسم جميع المشاريع إلى مجموعات ، سيتم تنفيذ الوصف على سبيل المثال من مجموعة الوحدات النمطية. يحتوي على المشاريع التالية: 

  • النواة؛
  • مشاريع الوحدة الفردية.

لنبدأ بالمشروع الأساسي.

هنا صفحة النظرة العامة:

صورة

هنا يمكنك أن ترى بوضوح إصدارات النواة التي وصلت إليها. أعتذر عن الارتباك في أرقام الإصدار ، والآن ننتقل إلى الإصدار المرتبط بعلامة git ، وفي كل مكان باستثناء الإنتاج ، يتم استخدام الإصدار الجديد بالفعل.

كما ترى ، لا توجد بيئات محددة لبعض المستأجرين. إما أنها لم يتم إنشاؤها بعد أو لم يتم توقعها. 

عملية النشر الأساسية


في مرحلة تسليم النواة ، يتم أيضًا تنفيذ جزء من عمليات الخدمة ، أي النسخ الاحتياطي لقاعدة البيانات (إذا لزم الأمر) ، والنسخ الاحتياطي للنسخة السابقة من الملفات ، وتناوب النسخ الاحتياطية ونشر النواة. 

صورة

الخطوة 1: النسخ الاحتياطي لقاعدة البيانات. إنه اختياري ، ويستند إلى قيمة المعلمة المتغيرة التي يتم تمريرها من teamcity في خطوة النشر .2 إلى حقل وسيطات سطر الأوامر الإضافية. بشكل افتراضي ، يتم تعيين هذا المتغير على خطأ ، حيث يجب إجراء النسخ الاحتياطي لقاعدة البيانات فقط عند الطلب ، وليس باستمرار. في مدينة الفريق ، يبدأ تغيير هذه المعلمة بهذا الشكل (تحتاج إلى النقر فوق علامة الحذف بجوار زر التشغيل):

صورة

في الأخطبوط ، يبدو كالتالي: 

صورة

بعد ذلك ، لا يوجد شيء غير عادي. نسخة احتياطية من الملفات بتنسيق zip (حسب القالب) ، وتدوير النسخ الاحتياطي (سيكون النص البرمجي أقل قليلاً) ، ونشر kernel حسب القالب. 

ما يجب الانتباه إليه: 

  • يتم تعيين جميع المعلمات الهامة بواسطة المتغيرات ، وهذا يسمح لك بتغيير قيمتها بسرعة في مكان واحد دون حفر عميقة في إعدادات العملية ؛
  • يطابق اسم تجمّع IIS اسم المثيل واسم مجال الخدمة (للراحة) ؛
  • في خطوة نشر IIS ، يتم تثبيت الدمج مع الروابط الموجودة ، بدلاً من استبدالها. نظرًا لأنه بالإضافة إلى الخدمة ، لا يزال لدينا مجموعة من نطاقات العميل في كل حالة ؛
  • فشل تنظيف جذر المستند (علامة الاختيار تطهير هذا الدليل قبل التثبيت). الملفات الجديدة تحل محل الملفات القديمة أثناء النسخ. يتم ذلك حتى لا "يتعطل" الموقع أثناء النشر. التأخير في تحميل الصفحة أجمل بكثير من شاشة الموت.

البرنامج النصي لتدوير النسخ الاحتياطي:

$days = $OctopusParameters["DaysStoreBackups"]
$limit = (Get-Date).AddDays(-$days)
$pathDb = $OctopusParameters["DbBackupDir"]
$pathFiles = $OctopusParameters["FilesBackupDir"] + '\' + $OctopusParameters["HostName"]

# Delete files older than the $limit.
Get-ChildItem -Path $pathDb -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $pathDb -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

# Delete files older than the $limit.
Get-ChildItem -Path $pathFiles -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $pathFiles -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

عملية نشر حزمة فردية


في مرحلة تسليم حزمة الوحدة النمطية الفردية ، يتم نشر التكوينات والمكتبات الفريدة ، ويتم تحديد موقع الملفات و / أو إعادة تسميتها ، ويتم طلب الموقع (أولاً ، يتم تحميل المواقع على .net لأول مرة لفترة طويلة ، وتتيح لك هذه الخطوة تنفيذ هذا الإجراء فورًا ، وثانيًا ، تسمح لك بفهم ما إذا كانت هناك أية أخطاء عند تحميل الموقع). يتم إرسال إشعار أيضًا إلى slack ، ويتم نقل قائمة فعلية بجميع المجالات التي تنتمي إلى هذه الوحدة إلى teamcity. 

صورة

من المهم:

  • في خطوة النشر ، لا يتم تنظيف جذر المستند (الحزمة الأساسية الجديدة موجودة بالفعل) ؛

الخطوة 3 ، البرنامج النصي. كان أعلى قليلاً في وصف القوالب.

الخطوة 5. كما انه يرتبط مع deploy.4 خطوة في teamcity.

في الأخطبوط ، يبدو مثل هذا:

$baseDomain = $OctopusParameters["HostName"]
$domains = (Get-WebBinding $baseDomain).bindingInformation | %{ $_.Split(':')[2] } | Sort-Object | Get-Unique
Write-Host "##teamcity[setParameter name='AllInstanceDomains' value='$domains']"
Write-Host "##teamcity[setParameter name='ServiceDomain' value='$baseDomain']"

يتيح لك بناء الجملة ## teamcity ... تعيين معلمة البناء في teamcity. في الواقع ، تبدو هذه الخطوة كما يلي:

Write-Host "All domains on instance %ServiceDomain% :"
$domains = "%AllInstanceDomains%"
$domains = $($domains.Split(" ") | ForEach-Object {"http://$_"} | Out-String)
Write-Host $domains
Write-Host "Service domain: http://%ServiceDomain%"

الأخطبوط: النتائج


عملية البناء بأكملها هي كما يلي:

  • يتم جمع الكود من فرع معين (المقابل للبيئة) ؛
  • تعطى نتيجة التجميع (القطع الأثرية) للأخطبوط وتتكون من جزأين: النواة وحزمة وحدة فردية. وهذا يسمح بالاستخدام الفعال لمساحة القرص ويوفر وقت تسليم التحديث بشكل عام. 
  • تحتوي كل حزمة على إصدار يتكون من رقم وعلامة ما قبل الإصدار التي تحدد القناة والبيئة التي سيقع فيها هذا الإصدار.
  • تقوم Octopus ، من خلال الإدخال ، بإنشاء إصدار وتسليم حزم إلى الخوادم المناسبة ، مسترشدة ببيانات المؤسسة (علامات المستأجر) ، والقنوات (علامة ما قبل الإصدار) وإرشادات إضافية (نسخة احتياطية اختيارية لقاعدة البيانات) ، كما تقوم بإجراء فحص أولي لأداء الوحدة.

هذا نوع من ذلك القبيل. على الأرجح ، سيكون هناك مقال آخر شبه تقني ، إذا جاز التعبير ، خلف الكواليس. سيشمل كل ما لم يدخل هنا: بعض التفاصيل ، ما أصبح جديدًا في عملية العمل وما قد يتعين عليك مواجهته بالنسبة لأولئك الذين يقررون ذلك ، والتصحيحات والتحديثات على المشروع ، وربما أسئلة / إجابات متكررة. شكرا للانتباه.

All Articles