【问题标题】:.NetCore CI pipeline error on docker tasksdocker任务上的.NetCore CI管道错误
【发布时间】:2020-04-28 04:00:58
【问题描述】:

我正在 Azure 中为 .NetCore 3.1 应用程序创建 CI 管道并添加 Docker“buildandpush”任务。我有 2 种情况,如果我只运行 .Netcore 任务(恢复、构建、测试、发布)我的构建成功没有任何错误,如果我禁用上述 .NetCore 任务并且只运行 docker(buildAndpublish) 任务我的构建成功和图像推送进入我的 ACR,但如果我启用上述 .NetCore 任务和 Docker 任务,则会抛出错误 here。
谁能告诉我 .netCore 任务的构建定义,我在做正确的事情吗?

错误

C:\Program Files\dotnet\sdk\3.1.100\NuGet.targets(123,5): 错误: 访问路径'C:\src\RINWeb\obj\RINMVC.csproj.nuget.dgspec.json' 被拒绝。 [C:\src\RINWeb\RINMVC.csproj]

构建失败。

C:\Program Files\dotnet\sdk\3.1.100\NuGet.targets(123,5): 错误: 访问路径'C:\src\RINWeb\obj\RINMVC.csproj.nuget.dgspec.json' 被拒绝。 [C:\src\RINWeb\RINMVC.csproj]

0 Warning(s)
1 Error(s)

经过时间 00:00:01.34 命令 'cmd /S /C dotnet build "RINMVC.csproj" -c Release -o /app/build' 返回一个非零代码:1

[错误]进程 'C:\Program Files\Docker\docker.exe' 失败,退出代码为 1

我的 docker 文件是:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1809 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1809 AS build

WORKDIR /src
#####COPY ["RINWeb/RINMVC.csproj", "RINWeb/"]
COPY ["RINMVC.csproj", "RINWeb/"]

RUN dotnet restore "RINWeb/RINMVC.csproj"
#####COPY . .
COPY . RINWeb/
WORKDIR "/src/RINWeb"
RUN dotnet build "RINMVC.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "RINMVC.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "RINMVC.dll"]

【问题讨论】:

  • 嗨。请不要为命令输出添加图像。它使您的帖子的可读性和信息量降低。此外,没有人可以从错误中复制/粘贴文本(例如,如果需要搜索),并且无法被内部或外部搜索引擎索引。请编辑您的问题并将相关的 docker build 阶段输出粘贴到代码块中。
  • dotnet restore 将对您的源文件夹进行更改。您可以尝试将 docker buildAndpublish 任务移动到构建管道的顶部,以便在 dotnet 任务之前运行它。
  • @Levi Lu-MSFT 是的,当我在没有 docker 任务的情况下运行构建时,我的构建成功了,但是与 Docker 一起抛出了一个错误,如果我禁用了所有 .net 任务并运行 docker任务其成功。但我想同时运行 .Netcore 任务和 docker 任务这两个任务,以便所有 .Netcore 构建成功,而不是将我的应用映像移动并推送到 Azure 容器注册表(ACR)
  • 我认为您可以将 docker 任务分离到另一个代理作业中。这样docker和dotnet任务就不会互相影响了。

标签: docker azure-devops continuous-integration


【解决方案1】:

您可以使用两个代理作业来运行您的管道。在代理作业上运行 dotnet 任务,第二个运行 docker 任务。

如果您使用的是经典视图构建管道。您可以单击 Pipeline 上的 (...) 来添加代理作业。请查看下面的截图。

然后在agent job2中运行docker任务,配置agent job2依赖agent job1的成功运行。请查看下面的截图。

如果您使用的是 yaml 管道。您可以定义多个作业。您可以查看here了解更多信息。

更新:

这是一个在 Microsoft 中构建和推送到 ACR 的示例。您不需要使用 dotnet 任务来构建和发布您的项目,只是为了检查构建是否成功,因为您的停靠文件只是重复相同的 dotnet 命令。您只能使用 docker 任务来构建停靠文件。

或者您可以修改您的 dockerfile,使其只有最后一个复制步骤,以从 dotnet 发布任务的输出文件夹复制已发布的文件(从 dockerfile 中删除 dotnet restore、build、publish 步骤),对于您的 dotnet 任务,已经完成了恢复构建和发布任务。

【讨论】:

  • 是的!我已经按照您建议的代理 1 和代理 2 的任务,它的工作,感谢您的帮助,但我的小问题是,这是专业的方法还是我需要对任务进行一些修改,我的意思是我的任务是否适合我的我正在实现的目标。
  • 这是一个example,用于在 Microsoft 中构建和推送到 ACR。您不需要使用 dotnet 任务来构建和发布您的项目,只是为了检查构建是否成功,因为您的 dockfile 运行相同的 dotnet 命令。你只能使用一个docker任务来构建dockfile,或者你可以修改你的dockerfile只有最后一步COPY --from=publish /app/publish(去掉dotnet restore, build, publish步骤),因为你的dotnet任务已经做了构建和发布任务.
  • @Saad Awan 如果以上答案对您有帮助并且对您有用,您可以接受,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2021-05-10
  • 1970-01-01
  • 2019-07-15
  • 2022-10-05
  • 2021-04-17
  • 2023-03-05
相关资源
最近更新 更多