我找到了Scott Hanselman 的关于使用 dotnet 将 git commit hashes 添加到构建的教程。我尝试在我自己的项目中采用他的方法,该项目正在构建到 Azure Devops Pipelines 中的 Docker 映像中。不幸的是,git hash 永远不会进入程序集。
在我的 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}
Scott 帖子中描述的参数。
我在构建和推送 docker 代理的管道中有离散步骤,正如我在其他地方发现--build-arg
的那样,在组合的 BuildAndPush 作业中没有传递给 Docker。我可以看到管道正在将正确的内容传递SOURCE_REVISION_ID
给构建作业,例如--build-arg SOURCE_REVISION_ID=7397bf9c2650e6cd9452f5c40c6e1738fbb32532
.
我怀疑有几件事之一是原因,但我不确定是哪一个:
- 我使用不正确的语法来检索
SOURCE_REVISION_ID
调用中的参数值dotnet build
。 - 我误解了 Dockerfile 和 Dockerfile 之间的区别
ARG
,ENV
需要将我的 build 参数的值复制到一个变量中以备后用。如果是这种情况,我不明白为什么。 - 实际上它工作正常,但是我的代码没有
AssemblyInformationalVersion
正确地从程序集中提取(尽管我从 Scott 的帖子中复制和粘贴了代码!)
请帮助阻止我秃头!