Предоставление номера сборки TFS через конечную точку .NET Core WebAPI - PullRequest
1 голос
/ 16 июня 2019

В решении у меня есть проект .NET Core 2.2 WebAPI (среди других проектов). Решение имеет соответствующий конвейер сборки, настроенный в TFS. Каждая сборка TFS имеет номер сборки, например «20190615.15». Я хотел бы предоставить этот номер сборки через конечную точку Web-API для выполнения задач сопровождения и отслеживания.

В качестве предварительного решения мне удалось установить атрибут AssemblyInformationalVersion из конвейера сборки, и с помощью следующего контроллера я могу легко получить желаемый номер сборки:

[Route("api/[controller]")]
[ApiController]
public class VersionController : ControllerBase
{
    [HttpPut(Name = "version")]
    public Task<ApplicationVersion> Version()
    {
        return Task.FromResult(new ApplicationVersion
        {
            Version = ReadVersionFromAssemblyInfo()
        });
    }

    private string ReadVersionFromAssemblyInfo()
    {
        return Assembly.GetEntryAssembly()
            .GetCustomAttribute<AssemblyInformationalVersionAttribute>()
            .InformationalVersion;
    }

    public class ApplicationVersion
    {
        public string Version { get; set; }
    }
}

То, что я сделал, довольно просто: Сначала я ввел новый ARG с именем "VERSION_NUMBER" в Dockerfile Web-API и установил InformationalVersion на последнем этапе публикации:

FROM microsoft/dotnet:2.2-sdk AS build
ARG VERSION_NUMBER
WORKDIR /src
COPY SomeAPI/SomeAPI.csproj SomeAPI/
RUN dotnet restore SomeAPI/SomeAPI.csproj
COPY . .
WORKDIR /src/SomeAPI
RUN dotnet publish SomeAPI.csproj -c Release -o /app -p:InformationalVersion=$VERSION_NUMBER

Затем в файле docker-compose.yml я задаю тот же arg:

services:
  someapi:
    image: someApi:${TAG:-latest}
    build:
      context: .
      dockerfile: SomeAPI/Dockerfile
      args:
        VERSION_NUMBER: ${VERSION_NUMBER}

И, наконец, в задаче Docker-Compose сборки TFS я установил вышеупомянутый аргумент: Docker-Compose task of TFS build

Это работает как шарм, и если я получаю доступ к своей конечной точке https://somedomain.com/api/version, тогда я получаю json с нужным номером сборки.

Проблема в том, что в моем решении я повторно использую / использую атрибут AssemblyInformationalVersion, но мне бы хотелось, чтобы этот атрибут был установлен с правильным номером версии (например, 1.0.1). Таким образом, в конечном итоге конечная точка https://somdomain.com/api/version будет возвращать a .json как:

{
    "Version": "1.0.1",
    "BuildNumber": "20190615.15"
}

Каков наилучший способ предоставления номера сборки (исходя из сборки TFS) через конечную точку Web-API? Можно ли установить пользовательское свойство (тег xml) в файле .csproj, поэтому я могу использовать AssemblyInformationalVersion по назначению? Спасибо за помощь!

1 Ответ

0 голосов
/ 18 июня 2019

Я успешно понял, как решить мою проблему. Для этого есть два хороших подхода:

Первый подход: Введите собственное свойство .csproj, к которому можно получить доступ во время выполнения. Сначала создайте класс свойств:

namespace MyNamespace
{
    /// <summary>
    /// A run-time-accessible property specified in .csproj file in order to store the build-number of the CI build-pipeline.
    /// </summary>
    [AttributeUsage(AttributeTargets.Assembly)]
    public sealed class BuildNumberAttribute : Attribute
    {
        public BuildNumberAttribute(string buildNumber)
        {
            BuildNumber = buildNumber;
        }

        public string BuildNumber { get; }
    }
}

Добавьте следующую группу элементов в файл .csproj, чтобы сделать свойство доступным:

  <ItemGroup>
    <AssemblyAttribute Include="MyNamespace.BuildNumberAttribute">
      <_Parameter1>"$(BuildNumber)"</_Parameter1>
    </AssemblyAttribute>
  </ItemGroup>

Наконец, в файле docker, передайте аргумент сборки

RUN dotnet publish SomeAPI.csproj -c Release -o /app -p:BuildNumber=$VERSION_NUMBER

Обратите внимание, что VERSION_NUMBER установлен в $(Build.BuildNumber) в задаче составления docker конвейера сборки TFS.

Чтобы получить доступ к этому вновь добавленному свойству, сделайте следующее:

private string ReadBuildNumber()
{
    return Assembly.GetEntryAssembly()
        .GetCustomAttribute<BuildNumberAttribute>()
        .BuildNumber.Trim('"');
}

Второй подход : Использование задачи «Замененные токены» в конвейере сборки TFS. При этом вы можете установить шаблон в appsettings.json, и шаблон можно заменить задачей. Для получения подробной информации, проверьте этот вопрос переполнения стека

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...