DEV Community

Cover image for Add build version using GitHub Actions
ohalay
ohalay

Posted on • Edited on

2

Add build version using GitHub Actions

Коли реліз все ближче і потрібно підтримувати кілька середовищ, а потім кілька версій, то постає питання: "Як можна додати версійність до програмного продукту?".

Semantic Versioning

Semantic Versioning (SemVer) - стандарт схеми версіювання, який не прив'язаний до жодної з мов програмування. Він описується наступною моделлю major.minor.patch-pre-release.build, до прикладу 0.1.0-rc.44. Коли ми робимо зміни в нашій аплікації/бібліотеці нам необхідно збільшувати цифровий ідентифікатор. Наступні правила описують зміну цифрового ідентифікатора:

  • major - архітектурні зміни, несумісний API
  • minor - новий функціонал, додали зворотну сумісність до API
  • patch - виправлення помилок чи проблем безпеки
  • pre-release - опційний аргумент, щоб ідентифікувати версію яка ще не готова до production - alfa, beta, rc(release candidate)
  • build - опційний аргумент, що визначає версію збірки продукту.

Add version to solution

Ми вже знаємо як створювати семантичну версію продукту. Щоб додати її до нашого рішення необхідно обрати *.csproj або Directory.build.props до якого ми будемо додавати версійність і додати атрибут VersionPrefix. Відповідно цей атрибут буде доданий до нашої збірки.

<PropertyGroup>
  <VersionPrefix>0.1.0</VersionPrefix>
</PropertyGroup>
Enter fullscreen mode Exit fullscreen mode

Тут важливо використовувати атрибут VersionPrefix, а не Version, бо ми ще хочемо додавати pre-release опційний атрибут до нашої кінцевої версії.

Add API for versions

Для того, щоб створити API, який буде повертати версію продукту необхідно створити контролер, який буде з атрибутів assembly отримувати версію. Код нижче описує як це можна зробити

[HttpGet]
public string GetVersion()
    => Assembly
      .GetExecutingAssembly()
      .GetCustomAttribute<AssemblyInformationalVersionAttribute>()
      .InformationalVersion;
Enter fullscreen mode Exit fullscreen mode

Add build version

Для завершення рішення залишилось додати білд версію. Для цього нам необхідно знати дві речі:

  1. Команда dotnet build підтримує параметр --version-suffix який додає суфікс до версії під час збору аплікації.
  2. GitHub Actions надає набір визначених змінних про контекст виконання одиниці автоматизації. Для нас є цікавим змінна github.run_number - унікальний ідентифікатор запуску одиниці автоматизації, який збільшується на одиницю під час кожного запуску і починається також з одиниці.

Зібравши попередні два пункти, ми можемо описати команду збору проекту наступним чином:

dotnet build -c Release --version-suffix rc+${{github.run_number}}
Enter fullscreen mode Exit fullscreen mode

Додаємо цю команду в крок одиниці автоматизації і все готово.

Summary

SemVer є стандартизованим підходом до версіювання, який спрощує інтеграцію аплікації з іншими системами; також з допомогою версіювання можна легко відслідкувати помилки в аплікації (ми розуміємо в якій версії помилка з'явилась і в якій її виправили).
Описаний вище підхід дозволяє досить швидко додавати версійність до аплікації, також його можна використовувати з іншими CI платформами. І ще одне, коли продукт/бібліотека використовує стандарт SemVer, то легко налаштувати dependabot, про який я описував тут, що буде автоматично апдейтити patch версії. Приклад GitHub проекту можна глянути нижче

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (5)

Collapse
 
olesmartyniuk profile image
Oleksandr Martyniuk
rc+${{github.run_number}}
Enter fullscreen mode Exit fullscreen mode

Ти використовуєш run_number як build секцію чи частину patch? Можливо, тут потрібна крапка?

Collapse
 
ohalay profile image
ohalay

Я тут використовую run_number як build секцію. І тут цікаво, що стандарт SemVer, описує наступні правила

<valid semver> ::= <version core>
                 | <version core> "-" <pre-release>
                 | <version core> "+" <build>
                 | <version core> "-" <pre-release> "+" <build>

Enter fullscreen mode Exit fullscreen mode

і допустимо run_number=44, то версії 0.1.0-rc+44 та 0.1.0-rc.44 - обидві коректні.

Collapse
 
der_gopher profile image
Alex Pliutau

Great write-up, we do it similarly but with release branches - packagemain.tech/p/github-actions-...

Collapse
 
olesmartyniuk profile image
Oleksandr Martyniuk

До речі, я міг би переглянути статтю на граматичні помилки. Просто надійшли файл, якщо цікаво. Зараз в статті вони зустрічаються. Я розумію, що свій текст важко вивірити, око замилюється.

Collapse
 
ohalay profile image
ohalay

Дякую Саша, ще раз переглянув і побачив кілька граматичних помилок, правки вже додані до тексту. Наступного разу з радістю скористаюсь твоєю допомогою.

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay