为什么 Azure DevOps Pipelines Docker Build 无法将我的提交版本正确标记到我的 dotnet 核心程序集中?



我找到了Scott Hanselman关于使用dotnet将git提交哈希添加到构建中的教程。我试图在我自己的项目中采用他的方法,该项目正在构建到 Azure DevOps 管道中的 Docker 映像中。不幸的是,git 哈希从未进入程序集。

在我的 docker 文件中,我有:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
ARG SOURCE_REVISION_ID
WORKDIR /app
RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /etc/ssl/openssl.cnf
RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /usr/lib/ssl/openssl.cnf
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
RUN dotnet restore "Project/Project.csproj"
COPY . .
WORKDIR "/src/Project"
RUN dotnet build "Project.csproj" -c Release -o /app/build /p:SourceRevisionId=${SOURCE_REVISION_ID}
FROM build AS publish
RUN dotnet publish "Project.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Project.dll"]

dotnet build "Project.csproj"的调用使用/p:SourceRevisionId=${SOURCE_REVISION_ID}参数,如斯科特的帖子中所述。

我在管道中为构建和推送 docker 代理提供了离散的步骤,因为我在其他地方发现--build-arg没有在组合的 BuildAndPush 作业中传递给 Docker。我可以看到管道正在将正确的SOURCE_REVISION_ID传递给构建作业,例如--build-arg SOURCE_REVISION_ID=7397bf9c2650e6cd9452f5c40c6e1738fbb32532.

我怀疑有几件事之一是原因,但我不确定是哪一种:

  1. 我在调用dotnet build时使用不正确的语法来检索SOURCE_REVISION_ID参数的值。
  2. 我误解了 Dockerfile 中ARGENV之间的区别,需要将我的构建参数的值复制到变量以供以后使用。如果是这样的话,我不明白为什么。
  3. 实际上它工作正常,但我的代码没有正确从程序集中提取AssemblyInformationalVersion(尽管我从 Scott 的帖子中复制并粘贴了代码!

求求你,帮忙阻止我秃顶!

您正在使用多阶段 Dockerfile 并在第一阶段指定了ARG,但实际上在第二阶段引用了它。ARG的作用域限定为它所包含的阶段。 您应该将ARG移动到第二阶段,在FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build之后。

最新更新