Руководство ΠΏΠΎ CI/CD Π² GitLab для (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°

Или ΠΊΠ°ΠΊ ΠΎΠ±Π·Π°Π²Π΅ΡΡ‚ΠΈΡΡŒ красивыми Π±Π΅ΠΉΠ΄ΠΆΠΈΠΊΠ°ΠΌΠΈ для своСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π·Π° ΠΎΠ΄ΠΈΠ½ Π²Π΅Ρ‡Π΅Ρ€ нСнапряТного ΠΊΠΎΠ΄ΠΈΠ½Π³Π°

НавСрноС, Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΏΠ΅Ρ‚-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π·ΡƒΠ΄ Π½Π° Ρ‚Π΅ΠΌΡƒ красивых Π±Π΅ΠΉΠ΄ΠΆΠΈΠΊΠΎΠ² со статусами, ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ ΠΊΠΎΠ΄Π°, вСрсиями ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² nuget… И мСня этот Π·ΡƒΠ΄ ΠΏΡ€ΠΈΠ²Ρ‘Π» ΠΊ написанию этой ΡΡ‚Π°Ρ‚ΡŒΠΈ. Π’ процСссС ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΊ Π΅Ρ‘ написанию я обзавёлся Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ красотой Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²:

Руководство ΠΏΠΎ CI/CD Π² GitLab для (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСна базовая настройка Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΈ поставки для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ классов Π½Π° .Net Core Π² GitLab, с ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π² GitLab Pages ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ собранных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ Ρ„ΠΈΠ΄ Π² Azure DevOps.

Π’ качСствС срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ использовалась VS Code c Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ GitLab Workflow (для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° настроСк прямо ΠΈΠ· срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ).

ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅

CD β€” это ΠΊΠΎΠ³Π΄Π° Ρ‚Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡƒΡˆΠ½ΡƒΠ», Π° Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΡƒΠΆΠ΅ всё ΡƒΠΏΠ°Π»ΠΎ?

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ CI/CD ΠΈ Π·Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ β€” ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π½Π°Π³ΡƒΠ³Π»ΠΈΡ‚ΡŒ. ΠŸΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ настройкС ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ΠΎΠ² Π² GitLab Π½Π°ΠΉΡ‚ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ нСслоТно. Π—Π΄Π΅ΡΡŒ я ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΈ ΠΏΠΎ возмоТности Π±Π΅Π· ΠΎΠ³Ρ€Π΅Ρ…ΠΎΠ² ΠΎΠΏΠΈΡˆΡƒ процСсс Ρ€Π°Π±ΠΎΡ‚Ρ‹ систСмы с высоты ΠΏΡ‚ΠΈΡ‡ΡŒΠ΅Π³ΠΎ ΠΏΠΎΠ»Ρ‘Ρ‚Π°:

  • Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ отпраляСт ΠΊΠΎΠΌΠΌΠΈΡ‚ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, создаёт merge request Ρ‡Π΅Ρ€Π΅Π· сайт, ΠΈΠ»ΠΈ Π΅Ρ‰Ρ‘ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ явно ΠΈΠ»ΠΈ нСявно запускаСт ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½,
  • ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ всС Π·Π°Π΄Π°Ρ‡ΠΈ, условия ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΡ… Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² Π΄Π°Π½Π½ΠΎΠΌ контСкстС,
  • Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Π² соотвСтствии со своими этапами,
  • этапы ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ β€” Ρ‚.Π΅. ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ всС Π·Π°Π΄Π°Ρ‡ΠΈ этого этапа,
  • Ссли этап Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ (Ρ‚.Π΅. Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ хотя Π±Ρ‹ ΠΎΠ΄Π½Π° ΠΈΠ· Π·Π°Π΄Π°Ρ‡ этапа) β€” ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ останавливаСтся (ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда),
  • Ссли всС этапы Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Ρ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ считаСтся ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠΈΠΌ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΠΌΠ΅Π΅ΠΌ:

  • ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ β€” Π½Π°Π±ΠΎΡ€ Π·Π°Π΄Π°Ρ‡, ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² этапы, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ, ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²ΡƒΡŽ сборку Π² ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹ΠΉ сСрвис, ΠΈ ΠΏΡ€.,
  • этап (stage) β€” Π΅Π΄ΠΈΠ½ΠΈΡ†Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°, содСрТит 1+ Π·Π°Π΄Π°Ρ‡Ρƒ,
  • Π·Π°Π΄Π°Ρ‡Π° (job) β€” Π΅Π΄ΠΈΠ½ΠΈΡ†Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π΅. Бостоит ΠΈΠ· скрипта (ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ), условий запуска, настроСк ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ/ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ.

БоотвСтствСнно, Π·Π°Π΄Π°Ρ‡Π° ΠΏΡ€ΠΈ настройкС CI/CD сводится ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ Π·Π°Π΄Π°Ρ‡, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ дСйствия для сборки, тСстирования ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΈ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ².

ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ: ΠΏΠΎΡ‡Π΅ΠΌΡƒ?

  • ΠŸΠΎΡ‡Π΅ΠΌΡƒ GitLab?

ΠŸΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° появилась Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΠΎΠ΄ ΠΏΠ΅Ρ‚-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, Π½Π° GitHub’e ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΏΠ»Π°Ρ‚Π½Ρ‹ΠΌΠΈ, Π° я β€” ΠΆΠ°Π΄Π½Ρ‹ΠΌ. Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ стали бСсплатными, Π½ΠΎ ΠΏΠΎΠΊΠ° это Π½Π΅ являСтся для мСня ΠΏΠΎΠ²ΠΎΠ΄ΠΎΠΌ достаточным ΠΏΠ΅Ρ€Π΅Π΅Π·ΠΆΠ°Ρ‚ΡŒ Π½Π° GitHub.

  • ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ Azure DevOps Pipelines?

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ настройка элСмСнтарная β€” Π΄Π°ΠΆΠ΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ знания ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с внСшними ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°ΠΌΠΈ git β€” Π² ΠΏΠ°Ρ€Ρƒ ΠΊΠ»ΠΈΠΊΠΎΠ², ΠΈΠΌΠΏΠΎΡ€Ρ‚ SSH-ΠΊΠ»ΡŽΡ‡Π΅ΠΉ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ β€” Ρ‚ΠΎΠΆΠ΅, ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π»Π΅Π³ΠΊΠΎ настраиваСтся Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΈΠ· шаблона.

Π˜ΡΡ…ΠΎΠ΄Π½Π°Ρ позиция: Ρ‡Ρ‚ΠΎ имССтся ΠΈ Ρ‡Π΅Π³ΠΎ хочСтся

ИмССм:

  • Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π² GitLab.

Π₯ΠΎΡ‚ΠΈΠΌ:

  • Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ сборку ΠΈ тСстированиС для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ merge request,
  • сборку ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ merge request ΠΈ ΠΏΡƒΡˆΠ° Π² мастСр ΠΏΡ€ΠΈ условии наличия Π² сообщСнии ΠΊΠΎΠΌΠΌΠΈΡ‚Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ строки,
  • ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ собранных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ Ρ„ΠΈΠ΄ Π² Azure DevOps,
  • сборку Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π² GitLab Pages,
  • Π±Π΅ΠΉΠ΄ΠΆΠΈΠΊΠΈ!11

ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ трСбования ΠΎΡ€Π³Π°Π½ΠΈΡ‡Π½ΠΎ лоТатся Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ модСль ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°:

  • Π­Ρ‚Π°ΠΏ 1 β€” сборка
    • Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ ΠΊΠΎΠ΄, Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ ΠΊΠ°ΠΊ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹
  • Π­Ρ‚Π°ΠΏ 2 β€” тСстированиС
    • ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ с этапа сборки, гоняСм тСсты, собраСм Π΄Π°Π½Π½Ρ‹Π΅ покрытия ΠΊΠΎΠ΄Π°
  • Π­Ρ‚Π°ΠΏ 3 β€” ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ°
    • Π—Π°Π΄Π°Ρ‡Π° 1 β€” собираСм nuget-ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈ отправляСм Π² Azure DevOps
    • Π—Π°Π΄Π°Ρ‡Π° 2 β€” собираСм сайт ΠΈΠ· xmldoc Π² исходном ΠΊΠΎΠ΄Π΅ ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ Π² GitLab Pages

ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΠΌ!

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ

Π“ΠΎΡ‚ΠΎΠ²ΠΈΠΌ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Ρ‹

  1. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ Π² Microsoft Azure

  2. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² Azure DevOps

  3. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

    1. Имя β€” любоС
    2. Π’ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ β€” любая
      Руководство ΠΏΠΎ CI/CD Π² GitLab для (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°

  4. ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Create ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ создан, ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΡ‘Π½ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° Π΅Π³ΠΎ страницу. На этой страницС ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ возмоТности, пСрСйдя Π² настройки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ (ниТняя ссылка Π² спискС слСва -> Overview -> Π±Π»ΠΎΠΊ Azure DevOps Services)
    Руководство ΠΏΠΎ CI/CD Π² GitLab для (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°

  5. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² Atrifacts, ΠΆΠΌΡ‘ΠΌ Create feed

    1. Π’Π²ΠΎΠ΄ΠΈΠΌ имя источника
    2. Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ
    3. Π‘Π½ΠΈΠΌΠ°Π΅ΠΌ Π³Π°Π»ΠΎΡ‡ΠΊΡƒ Include packages from common public sources, Ρ‡Ρ‚ΠΎΠ±Ρ‹ источник Π½Π΅ прСвратился Π² ΠΏΠΎΠΌΠΎΠΉΠΊΡƒ ΠΊΠ»ΠΎΠ½ nuget
      Руководство ΠΏΠΎ CI/CD Π² GitLab для (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°

  6. Π–ΠΌΡ‘ΠΌ Connect to feed, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Visual Studio, ΠΈΠ· Π±Π»ΠΎΠΊΠ° Machine Setup ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Source
    Руководство ΠΏΠΎ CI/CD Π² GitLab для (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°

  7. Π˜Π΄Ρ‘ΠΌ Π² настройки Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Personal Access Token
    Руководство ΠΏΠΎ CI/CD Π² GitLab для (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°

  8. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½ доступа

    1. Имя β€” ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅
    2. ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ β€” тСкущая
    3. Π‘Ρ€ΠΎΠΊ дСйствия β€” максимум 1 Π³ΠΎΠ΄
    4. ΠžΠ±Π»Π°ΡΡ‚ΡŒ дСйствия (scope) β€” Packaging/Read & Write
      Руководство ΠΏΠΎ CI/CD Π² GitLab для (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°

  9. ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ созданный Ρ‚ΠΎΠΊΠ΅Π½ β€” послС закрытия модального ΠΎΠΊΠ½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ нСдоступно

  10. Π—Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π² настройки рСпозитория Π² GitLab, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ настройки CI/CD
    Руководство ΠΏΠΎ CI/CD Π² GitLab для (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°

  11. РаскрываСм Π±Π»ΠΎΠΊ Variables, добавляСм Π½ΠΎΠ²ΡƒΡŽ

    1. Имя β€” любоС Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² (Π±ΡƒΠ΄Π΅Ρ‚ доступно Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅)
    2. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” Ρ‚ΠΎΠΊΠ΅Π½ доступа ΠΈΠ· ΠΏ. 9
    3. Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Mask variable
      Руководство ΠΏΠΎ CI/CD Π² GitLab для (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°

На этом ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ настройка Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°.

Π“ΠΎΡ‚ΠΎΠ²ΠΈΠΌ каркас ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, для настройки CI/CD Π² GitLab ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ„Π°ΠΉΠ» .gitlab-ci.yml ΠΈΠ· корня рСпозитория. МоТно Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ этого Ρ„Π°ΠΉΠ»Π° Π² настройках рСпозитория, Π½ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС это Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Ρ„Π°ΠΉΠ» содСрТит ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ YAML. Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описано, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π° Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ.

Π‘Π½Π°Ρ‡Π°Π»Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ссылку Π½Π° docker-ΠΎΠ±Ρ€Π°Π·, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡. Для этого Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ страницу ΠΎΠ±Ρ€Π°Π·ΠΎΠ² .Net Core Π² Docker Hub. Π’ GitHub Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ руководство, ΠΊΠ°ΠΊΠΎΠΉ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π· для Ρ€Π°Π·Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. Нам для сборки ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΎΠ±Ρ€Π°Π· с .Net Core 3.1, поэтому смСло добавляСм ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкой Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ

image: mcr.microsoft.com/dotnet/core/sdk:3.1

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ запускС ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° с Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Microsoft Π±ΡƒΠ΄Π΅Ρ‚ скачан ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ всС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ этап β€” Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ stage‘Ρ‹. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ GitLab опрСдСляСт 5 этапов:

  • .pre β€” выполняСтся Π΄ΠΎ всСх этапов,
  • .post β€” выполняСтся послС всСх этапов,
  • build β€” ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ послС .pre этап,
  • test β€” Π²Ρ‚ΠΎΡ€ΠΎΠΉ этап,
  • deploy β€” Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ этап.

НичСго Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΈΡ… явно, Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ этапы, влияСт Π½Π° порядок, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ. Для ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ излоТСния, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ:

stages:
  - build
  - test
  - deploy

Для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π·Π°Π΄Π°Ρ‡ΠΈ. Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ before_script:

before_script:
  - $PSVersionTable.PSVersion
  - dotnet --version
  - nuget help | select-string Version

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄Π½Ρƒ Π·Π°Π΄Π°Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ запустился. Пока Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΡƒΡΡ‚ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ для дСмонстрации:

dummy job:
  script:
    - echo ok

ЗапускаСм Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ сообщСниС, Ρ‡Ρ‚ΠΎ всё Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΈΠΌ, ΠΏΡƒΡˆΠΈΠΌ, смотрим Π½Π° сайтС Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹β€¦ И ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ скрипта β€” bash: .PSVersion: command not found. WTF?

Всё Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ β€” ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ runner’Ρ‹ (ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ Π·Π° исполнСниС скриптов Π·Π°Π΄Π°Ρ‡, ΠΈ прСдоставляСмыС GitLab’ΠΎΠΌ) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ bash для исполнСния ΠΊΠΎΠΌΠ°Π½Π΄. МоТно ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это Π΄Π΅Π»ΠΎ, явно ΡƒΠΊΠ°Π·Π°Π² Π² описании Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚Π΅Π³ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρƒ ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Ρ€Π°Π½Π½Π΅Ρ€Π°:

dummy job on windows:
  script:
    - echo ok
  tags:
    - windows

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ! Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ выполняСтся.

Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ, ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠ² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ шаги, Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡŒ Π² этапС test, хотя ΠΌΡ‹ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΈ этап. Как ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, test являСтся этапом ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ созданиС скСлСта ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² всС Π·Π°Π΄Π°Ρ‡ΠΈ, описанныС Π²Ρ‹ΡˆΠ΅:

build job:
  script:
    - echo "building..."
  tags:
    - windows
  stage: build

test and cover job:
  script:
    - echo "running tests and coverage analysis..."
  tags:
    - windows
  stage: test

pack and deploy job:
  script:
    - echo "packing and pushing to nuget..."
  tags:
    - windows
  stage: deploy

pages:
  script:
    - echo "creating docs..."
  tags:
    - windows
  stage: deploy

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π½Π΅ особСнно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ, Π½ΠΎ Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½.

Настройка Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠ²

Из-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΠΈ для ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π·Π°Π΄Π°Ρ‡ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ срабатывания, ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ. Π’Π°ΠΊ ΠΊΠ°ΠΊ это Π½Π΅ являСтся ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС, ΠΌΡ‹ настроим Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ срабатывания для Π·Π°Π΄Π°Ρ‡.

Π€ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² Π΄Π²ΡƒΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ…: only/except ΠΈ rules. Π’ΠΊΡ€Π°Ρ‚Ρ†Π΅, only/except позволяСт Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΏΠΎ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°ΠΌ (merge_request, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” настраиваСт Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ создании запроса Π½Π° слияниС ΠΈ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π² Π²Π΅Ρ‚ΠΊΡƒ, ΡΠ²Π»ΡΡŽΡ‰ΡƒΡŽΡΡ исходной Π² запросС Π½Π° слияниС) ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌ Π²Π΅Ρ‚ΠΎΠΊ (Π² Ρ‚.Ρ‡. с использованиСм рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ); rules позволяСт Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ условий ΠΈ, ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ, ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ условиС выполнСния Π·Π°Π΄Π°Ρ‡ΠΈ Π² зависимости ΠΎΡ‚ успСха ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡ (when Π² GitLab CI/CD).

Вспомним Π½Π°Π±ΠΎΡ€ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ β€” сборка ΠΈ тСстированиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для merge request, ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π² Azure DevOps β€” для merge request ΠΈ ΠΏΡƒΡˆΠ΅ΠΉ Π² мастСр, гСнСрация Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ β€” для ΠΏΡƒΡˆΠ΅ΠΉ Π² мастСр.

Для Π½Π°Ρ‡Π°Π»Π° настроим Π·Π°Π΄Π°Ρ‡Ρƒ сборки ΠΊΠΎΠ΄Π°, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ срабатывания Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ merge request:

build job:
  # snip
  only:
    - merge_request

Π’Π΅ΠΏΠ΅Ρ€ΡŒ настроим Π·Π°Π΄Π°Ρ‡Ρƒ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π½Π° срабатывания Π½Π° merge request ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π² мастСр:

pack and deploy job:
  # snip
  only:
    - merge_request
    - master

Как Π²ΠΈΠ΄Π½ΠΎ, всё просто ΠΈ прямолинСйно.

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° срабатываниС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли создан merge request с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΈΠ»ΠΈ исходной Π²Π΅Ρ‚ΠΊΠΎΠΉ:

  rules:
    - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"

Π’ условиях ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ пСрСчислСнныС здСсь ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅; ΠΏΡ€Π°Π²ΠΈΠ»Π° rules Π½Π΅ совмСстимы с ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ only/except.

Настройка сохранСния Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ²

Π’ΠΎ врСмя выполнСния Π·Π°Π΄Π°Ρ‡ΠΈ build job Ρƒ нас Π±ΡƒΠ΄ΡƒΡ‚ созданы Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ сборки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡Π°Ρ…. Для этого Π½ΡƒΠΆΠ½ΠΎ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π·Π°Π΄Π°Ρ‡ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΠΈ, Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡Π°Ρ…, Π² ΠΊΠ»ΡŽΡ‡ artifacts:

build job:
  # snip
  artifacts:
    paths:
      - path/to/build/artifacts
      - another/path
      - MyCoolLib.*/bin/Release/*

ΠŸΡƒΡ‚ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ wildcards, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΈΡ… Π·Π°Π΄Π°Π½ΠΈΠ΅.

Если Π·Π°Π΄Π°Ρ‡Π° создаёт Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹, Ρ‚ΠΎ каТдая ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Π·Π°Π΄Π°Ρ‡Π° смоТСт ΠΈΡ… ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½ΠΈΠΌ доступ β€” ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ ΠΏΠΎ Ρ‚Π΅ΠΌ ΠΆΠ΅ путям ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ корня рСпозитория, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π±Ρ‹Π»ΠΈ собраны ΠΈΠ· исходной Π·Π°Π΄Π°Ρ‡ΠΈ. Π’Π°ΠΊ ΠΆΠ΅ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ доступны для скачивания Π½Π° сайтС.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π³ΠΎΡ‚ΠΎΠ² (ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½) каркас ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ собствСнно ΠΊ написанию скриптов для Π·Π°Π΄Π°Ρ‡.

ПишСм скрипты

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ Π΄Π°Π²Π½ΠΎ, Π² Π΄Π°Π»Ρ‘ΠΊΠΎΠΉ-Π΄Π°Π»Ρ‘ΠΊΠΎΠΉ Π³Π°Π»Π°ΠΊΡ‚ΠΈΠΊΠ΅, ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ (Π² Ρ‚ΠΎΠΌ числС ΠΈ Π½Π° .net) ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π±Ρ‹Π»ΠΎ болью. БСйчас ΠΆΠ΅ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ, ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ½ΠΎ Π² 3 ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

dotnet build
dotnet test
dotnet pack

ЕстСствСнно, Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡŽΠ°Π½ΡΡ‹, ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ нСсколько услоТним ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

  1. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ€Π΅Π»ΠΈΠ·Π½ΡƒΡŽ, Π° Π½Π΅ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ сборку, поэтому ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ добавляСм -c Release
  2. ΠŸΡ€ΠΈ тСстировании ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΊΠΎΠ΄Π°, поэтому потрСбуСтся ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ покрытия Π² тСстовыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:
    1. Π’ΠΎ всС тСстовыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ слСдуСт Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ coverlet.msbuild: dotnet add package coverlet.msbuild ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°
    2. Π’ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ запуска тСстов Π΄ΠΎΠ±Π°Π²ΠΈΠΌ /p:CollectCoverage=true
    3. Π’ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π·Π°Π΄Π°Ρ‡ΠΈ тСстирования Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠ»ΡŽΡ‡ для получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² покрытия (см. Π½ΠΈΠΆΠ΅)
  3. ΠŸΡ€ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ΅ ΠΊΠΎΠ΄Π° Π² nuget-ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π·Π°Π΄Π°Π΄ΠΈΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ для ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²: -o .

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ покрытия ΠΊΠΎΠ΄Π°

Coverlet послС запуска тСстов Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π² консоль статистику ΠΏΠΎ запуску:

Calculating coverage result...
  Generating report 'C:Usersxxxsourcereposmy-projectmyProject.testscoverage.json'

+-------------+--------+--------+--------+
| Module      | Line   | Branch | Method |
+-------------+--------+--------+--------+
| project 1   | 83,24% | 66,66% | 92,1%  |
+-------------+--------+--------+--------+
| project 2   | 87,5%  | 50%    | 100%   |
+-------------+--------+--------+--------+
| project 3   | 100%   | 83,33% | 100%   |
+-------------+--------+--------+--------+

+---------+--------+--------+--------+
|         | Line   | Branch | Method |
+---------+--------+--------+--------+
| Total   | 84,27% | 65,76% | 92,94% |
+---------+--------+--------+--------+
| Average | 90,24% | 66,66% | 97,36% |
+---------+--------+--------+--------+

GitLab позволяСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для получСния статистики, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΡ‚ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ Π±Π΅ΠΉΠ΄ΠΆΠ°. РСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ указываСтся Π² настройках Π·Π°Π΄Π°Ρ‡ΠΈ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ coverage; Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ capture-Π³Ρ€ΡƒΠΏΠΏΠ°, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Π² Π±Π΅ΠΉΠ΄ΠΆ:

test and cover job:
  # snip
  coverage: /|s*Totals*|s*(d+[,.]d+%)/

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ статистику ΠΈΠ· строки с ΠΎΠ±Ρ‰ΠΈΠΌ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ ΠΏΠΎ линиям.

ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ

Оба дСйствия Ρƒ нас Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ Π½Π° послСдний этап ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° β€” Ρ€Π°Π· ΡƒΠΆ сборка ΠΈ тСсты ΠΏΡ€ΠΎΡˆΠ»ΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с ΠΌΠΈΡ€ΠΎΠΌ Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°ΠΌΠΈ.

Для Π½Π°Ρ‡Π°Π»Π° рассмотрим ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π² источник ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²:

  1. Если Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π½Π΅ присутствуСт Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ nuget (nuget.config), создадим Π½ΠΎΠ²Ρ‹ΠΉ: dotnet new nugetconfig

    Π—Π°Ρ‡Π΅ΠΌ: Π² ΠΎΠ±Ρ€Π°Π·Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡ€Π΅Ρ‰Ρ‘Π½ доступ Π½Π° запись ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ (ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΈ машинной) конфигурациям. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π»ΠΎΠ²ΠΈΡ‚ΡŒ ошибки, просто создадим Π½ΠΎΠ²ΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½Π΅ΠΉ.

  2. Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π½ΠΎΠ²Ρ‹ΠΉ источник ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²: nuget sources add -name <name> -source <url> -username <organization> -password <gitlab variable> -configfile nuget.config -StorePasswordInClearText
    1. name β€” локальноС имя источника, Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΡ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ
    2. url β€” URL источника ΠΈΠ· этапа "Π“ΠΎΡ‚ΠΎΠ²ΠΈΠΌ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Ρ‹", ΠΏ. 6
    3. organization β€” Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Azure DevOps
    4. gitlab variable β€” имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠΌ доступа, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠΉ Π² GitLab ("Π“ΠΎΡ‚ΠΎΠ²ΠΈΠΌ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Ρ‹", ΠΏ. 11). ЕстСствСнно, Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ $variableName
    5. -StorePasswordInClearText β€” Ρ…Π°ΠΊ для ΠΎΠ±Ρ…ΠΎΠ΄Π° ошибки ΠΎΡ‚ΠΊΠ°Π·Π° Π² доступС (Π½Π΅ я ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π½Π° эти Π³Ρ€Π°Π±Π»ΠΈ наступил)
    6. На случай ошибок ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ -verbosity detailed
  3. ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ Π² источник: nuget push -source <name> -skipduplicate -apikey <key> *.nupkg
    1. ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, поэтому *.nupkg.
    2. name β€” ΠΈΠ· шага Π²Ρ‹ΡˆΠ΅.
    3. key β€” любая строка. Π’ Azure DevOps Π² ΠΎΠΊΠ½Π΅ Connect to feed всСгда Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° приводят строку az.
    4. -skipduplicate β€” ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ Π±Π΅Π· этого ΠΊΠ»ΡŽΡ‡Π° источник Π²Π΅Ρ€Π½Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ 409 Conflict; с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ настроим созданиС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ:

  1. Для Π½Π°Ρ‡Π°Π»Π°, Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, Π² Π²Π΅Ρ‚ΠΊΠ΅ master, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ docfx. Для этого ΠΈΠ· корня Π½Π°Π΄ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ docfx init ΠΈ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π·Π°Π΄Π°Π΄ΠΈΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для сборки Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС минимальной настройки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° здСсь.
    1. ΠŸΡ€ΠΈ настройкС Π²Π°ΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ..public β€” GitLab ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±Π΅Ρ€Ρ‘Ρ‚ содСрТимоС ΠΏΠ°ΠΏΠΊΠΈ public Π² ΠΊΠΎΡ€Π½Π΅ рСпозитория ΠΊΠ°ΠΊ источник для Pages. Π’.ΠΊ. ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΏΠ°ΠΏΠΊΠ΅ β€” добавляСм Π² ΠΏΡƒΡ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄ Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Π²Π΅Ρ€Ρ….
  2. ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ измСнСния Π² GitLab.
  3. Π’ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π·Π°Π΄Π°Ρ‡Ρƒ pages (Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ слово для Π·Π°Π΄Π°Ρ‡ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ сайтов Π² GitLab Pages):
    1. Π‘ΠΊΡ€ΠΈΠΏΡ‚:
      1. nuget install docfx.console -version 2.51.0 β€” установит docfx; вСрсия ΡƒΠΊΠ°Π·Π°Π½Π° для Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡƒΡ‚Π΅ΠΉ установки ΠΏΠ°ΠΊΠ΅Ρ‚Π°.
      2. .docfx.console.2.51.0toolsdocfx.exe .docfx_projectdocfx.json β€” собираСм Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ
    2. Π£Π·Π΅Π» artifacts:

pages:
  # snip
  artifacts:
    paths:
      - public

ЛиричСскоС отступлСниС ΠΏΡ€ΠΎ docfx

РаньшС ΠΏΡ€ΠΈ настройкС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° я ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» источник ΠΊΠΎΠ΄Π° для Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ» Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. Основной минус β€” докумСнтация создаётся ΠΈ для тСстовых ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Π’ случаС, Ссли это Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Ρƒ metadata.src:

{
  "metadata": [
    {
      "src": [
        {
          "src": "../",
          "files": [
            "**/*.csproj"
          ],
          "exclude":[
            "*.tests*/**"
          ]
        }
      ],
      // --- snip ---
    },
    // --- snip ---
  ],
  // --- snip ---
}

  1. metadata.src.src: "../" β€” Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Π²Π΅Ρ€Ρ… ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ располоТСния docfx.json, Ρ‚.ΠΊ. Π² ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°Ρ… Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ поиск Π²Π²Π΅Ρ€Ρ… ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ.
  2. metadata.src.files: ["**/*.csproj"] β€” Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½, собираСм всС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ C# ΠΈΠ· всСх Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ.
  3. metadata.src.exclude: ["*.tests*/**"] β€” Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½, ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ всё ΠΈΠ· ΠΏΠ°ΠΏΠΎΠΊ с .tests Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ

ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΈΡ‚ΠΎΠ³

Π’ΠΎΡ‚ Ρ‚Π°ΠΊΡƒΡŽ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Π·Π° полчаса ΠΈ ΠΏΠ°Ρ€Ρƒ Ρ‡Π°ΡˆΠ΅ΠΊ ΠΊΠΎΡ„Π΅, которая ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запросС слияния ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ Π² мастСр ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ собираСтся ΠΈ тСсты проходят, ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚, ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΈ Ρ€Π°Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π³Π»Π°Π· красивыми Π±Π΅ΠΉΠ΄ΠΆΠΈΠΊΠ°ΠΌΠΈ Π² README ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ .gitlab-ci.yml

image: mcr.microsoft.com/dotnet/core/sdk:3.1

before_script:
  - $PSVersionTable.PSVersion
  - dotnet --version
  - nuget help | select-string Version

stages:
  - build
  - test
  - deploy

build job:
  stage: build
  script:
    - dotnet build -c Release
  tags:
    - windows
  only:
    - merge_requests
    - master
  artifacts:
    paths:
      - your/path/to/binaries

test and cover job:
  stage: test
  tags:
    - windows
  script:
    - dotnet test -c Release /p:CollectCoverage=true
  coverage: /|s*Totals*|s*(d+[,.]d+%)/
  only:
    - merge_requests
    - master

pack and deploy job:
  stage: deploy
  tags:
    - windows
  script:
    - dotnet pack -c Release -o .
    - dotnet new nugetconfig
    - nuget sources add -name feedName -source https://pkgs.dev.azure.com/your-organization/_packaging/your-feed/nuget/v3/index.json -username your-organization -password $nugetFeedToken -configfile nuget.config -StorePasswordInClearText
    - nuget push -source feedName -skipduplicate -apikey az *.nupkg
  only:
    - master

pages:
  tags:
    - windows
  stage: deploy
  script:
    - nuget install docfx.console -version 2.51.0
    - $env:path = "$env:path;$($(get-location).Path)"
    - .docfx.console.2.51.0toolsdocfx.exe .docfxdocfx.json
  artifacts:
    paths:
      - public
  only:
    - master

ΠšΡΡ‚Π°Ρ‚ΠΈ ΠΎ Π±Π΅ΠΉΠ΄ΠΆΠΈΠΊΠ°Ρ…

Π Π°Π΄ΠΈ Π½ΠΈΡ… вСдь всё ΠΈ Π·Π°Ρ‚Π΅Π²Π°Π»ΠΎΡΡŒ!

Π‘Π΅ΠΉΠ΄ΠΆΠΈ со статусами ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° ΠΈ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ ΠΊΠΎΠ΄Π° доступны Π² GitLab Π² настройках CI/CD Π² Π±Π»ΠΎΠΊΠ΅ Gtntral pipelines:

Руководство ΠΏΠΎ CI/CD Π² GitLab для (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°

Π‘Π΅ΠΉΠ΄ΠΆ со ссылкой Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ я создавал Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Shields.io β€” Ρ‚Π°ΠΌ всё достаточно прямолинСйно, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой Π±Π΅ΠΉΠ΄ΠΆ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ запроса.

![ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с Shields.io](https://img.shields.io/badge/custom-badge-blue)

Руководство ΠΏΠΎ CI/CD Π² GitLab для (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°

Azure DevOps Artifacts Ρ‚Π°ΠΊΠΆΠ΅ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π±Π΅ΠΉΠ΄ΠΆΠΈ для ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсии. Для этого Π² источникС Π½Π° сайтС Azure DevOps Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° Create badge Ρƒ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ markdown-Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΡƒ:

Руководство ΠΏΠΎ CI/CD Π² GitLab для (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°

Руководство ΠΏΠΎ CI/CD Π² GitLab для (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°

ДобавляСм красоты

ВыдСляСм ΠΎΠ±Ρ‰ΠΈΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

Π’ΠΎ врСмя написания ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ поисков ΠΏΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, я наткнулся Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ½ΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ YAML β€” ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ².

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· настроСк Π·Π°Π΄Π°Ρ‡, всС ΠΎΠ½ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ наличия Ρ‚Π΅Π³Π° windows Ρƒ Ρ€Π°Π½Π½Π΅Ρ€Π°, ΠΈ ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ Π² мастСр/создании запроса Π½Π° слияниС (ΠΊΡ€ΠΎΠΌΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ). Π”ΠΎΠ±Π°Π²ΠΈΠΌ это Π²ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

.common_tags: &common_tags
  tags:
    - windows
.common_only: &common_only
  only:
    - merge_requests
    - master

И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² описании Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Ρ€Π°Π½Π΅Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚:

build job:
  <<: *common_tags
  <<: *common_only

Названия Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с Ρ‚ΠΎΡ‡ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΠΊΠ°ΠΊ Π·Π°Π΄Π°Ρ‡Π°.

ВСрсионированиС ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²

ΠŸΡ€ΠΈ создании ΠΏΠ°ΠΊΠ΅Ρ‚Π° компилятор провСряСт ΠΊΠ»ΡŽΡ‡ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΈ Π² ΠΈΡ… отсутствиС β€” Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²; найдя ΡƒΠ·Π΅Π» Version, ΠΎΠ½ Π±Π΅Ρ€Ρ‘Ρ‚ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ Π²Π΅Ρ€ΡΠΈΡŽ собираСмого ΠΏΠ°ΠΊΠ΅Ρ‚Π°. Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ с Π½ΠΎΠ²ΠΎΠΉ вСрсиСй, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Ρ‘ Π² Ρ„Π°ΠΉΠ»Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Ρƒ Ρ…ΠΎΡ‚Π΅Π»ΠΊΡƒ β€” ΠΏΡƒΡΡ‚ΡŒ младшиС Π΄Π²Π° Π½ΠΎΠΌΠ΅Ρ€Π° Π² вСрсии Π±ΡƒΠ΄ΡƒΡ‚ Π³ΠΎΠ΄ΠΎΠΌ ΠΈ Π΄Π°Ρ‚ΠΎΠΉ сборки ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΡ€Π΅Ρ€Π΅Π»ΠΈΠ·Π½Ρ‹Π΅ вСрсии. Π”ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ эти Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ β€” Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ вСдь это Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π΅, собирая Π²Π΅Ρ€ΡΠΈΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈΠ· контСкста ΠΈ пСрСдавая Ρ‡Π΅Ρ€Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.

Условимся, Ρ‡Ρ‚ΠΎ Ссли Π² сообщСнии ΠΊΠΎΠΌΠΌΠΈΡ‚Π° Π΅ΡΡ‚ΡŒ строка Π²ΠΈΠ΄Π° release (v./ver./version) <version number> (rev./revision <revision>)?, Ρ‚ΠΎ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠ· этой строки Π±Ρ€Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π΄ΠΎΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΅Ρ‘ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π΄Π°Ρ‚ΠΎΠΉ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ dotnet pack. Π’ отсутствиС строки β€” просто Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚.

Π”Π°Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ скрипт:

# рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для поиска строки с вСрсиСй
$rx = "releases+(v.?|ver.?|version)s*(?<maj>d+)(?<min>.d+)?(?<rel>.d+)?s*((rev.?|revision)?s+(?<rev>[a-zA-Z0-9-_]+))?"
# ΠΈΡ‰Π΅ΠΌ строку Π² сообщСнии ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΌ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· прСдопрСдСляСмых GitLab'ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…
$found = $env:CI_COMMIT_MESSAGE -match $rx
# совпадСний Π½Π΅Ρ‚ - Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ
if (!$found) { Write-Output "no release info found, aborting"; exit }
# ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΌΠ°ΠΆΠΎΡ€Π½ΡƒΡŽ ΠΈ ΠΌΠΈΠ½ΠΎΡ€Π½ΡƒΡŽ вСрсии
$maj = $matches['maj']
$min = $matches['min']
# Ссли строка содСрТит Π½ΠΎΠΌΠ΅Ρ€ Ρ€Π΅Π»ΠΈΠ·Π° - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ, ΠΈΠ½Π°Ρ‡Π΅ - Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π³ΠΎΠ΄
if ($matches.ContainsKey('rel')) { $rel = $matches['rel'] } else { $rel = ".$(get-date -format "yyyy")" }
# Π² качСствС Π½ΠΎΠΌΠ΅Ρ€Π° сборки - Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ мСсяц ΠΈ дСнь
$bld = $(get-date -format "MMdd")
# Ссли Π΅ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΏΡ€Π΅Ρ€Π΅Π»ΠΈΠ·Π½ΠΎΠΉ вСрсии - Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΈΡ… Π² Π²Π΅Ρ€ΡΠΈΡŽ
if ($matches.ContainsKey('rev')) { $rev = "-$($matches['rev'])" } else { $rev = '' }
# собираСм Π΅Π΄ΠΈΠ½ΡƒΡŽ строку вСрсии
$version = "$maj$min$rel.$bld$rev"
# собираСм ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹
dotnet pack -c Release -o . /p:Version=$version

ДобавляСм скрипт Π² Π·Π°Π΄Π°Ρ‡Ρƒ pack and deploy job ΠΈ наблюдаСм сборку ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² строго ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ строки Π² сообщСнии ΠΊΠΎΠΌΠΌΠΈΡ‚Π°.

Π˜Ρ‚ΠΎΠ³ΠΎ

ΠŸΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ полчаса-час Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° написаниС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ Π² локальном powershell ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠ°Ρ€Ρƒ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹Ρ… запусков, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€ΡƒΡ‚ΠΈΠ½Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, GitLab CI/CD Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΎΠ±ΡˆΠΈΡ€Π½Π΅Π΅ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ³Ρ€Π°Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ послС прочтСния этого руководства β€” это ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ Ρ‚Π°ΠΊ. Π’Π°ΠΌ Π΄Π°ΠΆΠ΅ Auto DevOps Π΅ΡΡ‚ΡŒ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ

automatically detect, build, test, deploy, and monitor your applications

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² ΠΏΠ»Π°Π½Π°Ρ… β€” ΡΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ для развёртывания ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Azure, с использованиСм Pulumi ΠΈ автоматичСским ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ окруТСния, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ освСщСно Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ