为什么 Azure Devops Pipelines Docker Build 不能将我的提交版本正确标记到我的 dotnet 核心程序集中?
Why won't Azure Devops Pipelines Docker Build stamp my commit version into my dotnet core assembly correctly?
我发现 Scott Hanselman's tutorial 将 git 提交哈希添加到使用 dotnet 的构建。我尝试在我自己的项目中采用他的方法,该项目正在构建到 Azure Devops Pipelines 中的 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}
参数,如 Scott 的 post 中所述。
我在构建和推送 docker 代理的管道中有离散的步骤,因为我在其他地方发现 --build-arg
不会在组合的 BuildAndPush 作业中传递给 Docker。我可以看到管道正在将正确的 SOURCE_REVISION_ID
传递给构建作业,例如--build-arg SOURCE_REVISION_ID=7397bf9c2650e6cd9452f5c40c6e1738fbb32532
.
我怀疑是以下原因之一,但我不确定是哪一个:
- 我在调用
dotnet build
. 时使用了不正确的语法来检索 SOURCE_REVISION_ID
参数的值
- 我误解了 Docker 文件中
ARG
和 ENV
之间的区别,需要将我的构建参数的值复制到一个变量以备后用。如果是这样,我不明白为什么。
- 实际上它工作正常,但我的代码没有正确地从程序集中提取
AssemblyInformationalVersion
(尽管我复制并粘贴了 Scott 的 post 中的代码!)
拜托,帮我阻止秃头吧!
您使用的是多阶段 Dockerfile,并在第一阶段指定了 ARG
,但实际上在第二阶段引用了它。 ARG
的范围仅限于它所在的阶段。您应该将 ARG
移动到第二阶段,在 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
.
之后
我发现 Scott Hanselman's tutorial 将 git 提交哈希添加到使用 dotnet 的构建。我尝试在我自己的项目中采用他的方法,该项目正在构建到 Azure Devops Pipelines 中的 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}
参数,如 Scott 的 post 中所述。
我在构建和推送 docker 代理的管道中有离散的步骤,因为我在其他地方发现 --build-arg
不会在组合的 BuildAndPush 作业中传递给 Docker。我可以看到管道正在将正确的 SOURCE_REVISION_ID
传递给构建作业,例如--build-arg SOURCE_REVISION_ID=7397bf9c2650e6cd9452f5c40c6e1738fbb32532
.
我怀疑是以下原因之一,但我不确定是哪一个:
- 我在调用
dotnet build
. 时使用了不正确的语法来检索 - 我误解了 Docker 文件中
ARG
和ENV
之间的区别,需要将我的构建参数的值复制到一个变量以备后用。如果是这样,我不明白为什么。 - 实际上它工作正常,但我的代码没有正确地从程序集中提取
AssemblyInformationalVersion
(尽管我复制并粘贴了 Scott 的 post 中的代码!)
SOURCE_REVISION_ID
参数的值
拜托,帮我阻止秃头吧!
您使用的是多阶段 Dockerfile,并在第一阶段指定了 ARG
,但实际上在第二阶段引用了它。 ARG
的范围仅限于它所在的阶段。您应该将 ARG
移动到第二阶段,在 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
.