Сетевой дневник одного программиста

Персональный блог Константина Огородова

Версионирование контейнеризированных приложений

Ну и заголовок — язык «сломаешь»… Но как бы там ни было — тема важная и нужная. На платформе dotnet в файле проекта доступны 3 свойства для версионирования:

  • VersionPrefix — семантический номер версии в формате major.minor.patch. По умолчанию 1.0.0.
  • VersionSuffix — буквенно-числовая метка версии перед выпуском, например alpha, beta, rc1 и т.п.
  • Version — всё вышеперечисленное вместе в формате VersionPrefix[-VersionSuffix]. Другими словами: указывать можно либо только VersionPrefix, либо VersionPrefix и VersionSuffix, либо только Version в формате major.minor.patch[-prerelease].

К сожалению я не нашёл отдельной страницы с документацией посвящённой трём вышеописанным свойствам. Но на просторах интернета по этой теме есть ответ Nate McMaster‘а на stackoverflow, или статья Andrew Lock — Version vs VersionSuffix vs PackageVersion: What do they all mean?

Если вышеописанные свойства проекта определены, то они определят значения следующих атрибутов сборки при построении:

  • AssemblyVersion — версия сборки в формате major.minor.patch.build
  • FileVersion — версия файла сборки отображаемая в свойствах файла проводника. Обычно совпадает с AssemblyVersion.
  • InformationalVersion — дополнительные сведения о сборке в произвольном формате.
  • PackageVersion — версия пакета NuGet создаваемая при построении пакета при помощи команды dotnet pack. Обычно совпадает с Version.

Отмечу также, что вышеописанные атрибуты могут быть указаны явно, как свойства проекта. Вообще у проекта очень много свойств, но как было указано выше — я не нашёл полного списка где-то в документации. Однако есть другой способ: открыть файл проекта в VisualStudio и начать добавление нового свойства со знака < — тогда студия выведет список автоподстановки и контекстную подсказку.

При построении с помощью утилиты MSBuild любое свойство проекта может быть переопределено . Для этого используется параметр -property:name=value или короткий вариант -p:name=value. Упоминание об этом сделано потому, что команда dotnet build использует MSBuild для сборки проекта. При этом помимо собственных параметров dotnet build также принимает параметры MSBuild. Это позволяет задавать некоторые свойства проекта во время сборки в командной строке или при использовании подхода непрерывной интеграции. Сюда же относится команда RUN dotnet build внутри Dockerfile’а . Нужно лишь определить переменные времени сборки с помощью инструкции ARG. Например:

FROM build AS publish
ARG Version
RUN dotnet publish ...

Обращаю ваше внимание, что последние версии Dockerfile’а созданные в VS через контекстное меню используют многоэтапную сборку из четырех раздельных именованных этапов. Переменные, объявленные с помощью инструкции ARG, имеют область видимости только внутри того этапа, в котором объявлены. Если необходимо использовать значение одной и той же переменной в нескольких этапах, то каждый этап должен объявлять переменную заново.
Теперь касательно команды RUN dotnet: в Dockerfile’е эта команда используется трижды для разделения этапов восстановления пакетов, сборки и публикации, несмотря на то, что можно было бы обойтись всего лишь одной командой. В «интернетах» бытует мнение, что это сделано для кеширования результатов и последующего переиспользования. Ладно — пусть будет. Важно лишь понимать, что вместе с дублированием объявления переменной с номером версии придётся также дублировать использование этого параметра в командах dotnet build и dotnet publish. Ниже пример объявления и использования переменной Version:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["Имя-проекта.csproj", "Каталог"]
RUN dotnet restore "Имя-проекта.csproj"
COPY . .
WORKDIR "/src/Каталог"
ARG Version
RUN dotnet build "Имя-проекта.csproj" -p:Version=$Version -c Release -o /app/build

FROM build AS publish
ARG Version
RUN dotnet publish "Имя-проекта.csproj" -p:Version=$Version -c Release -o /app/publish

Вот в общем-то и всё — осталось лишь запустить сборку с помощью команды docker build передать нужное значение с помощью опции —build-arg:

docker build -f Path-to-Dockerfile --build-arg Version=0.1.0 -t ...
Версионирование контейнеризированных приложений

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пролистать наверх