我正在尝试使用Jenkins构建.NET应用程序。 Jenkins实例在Docker容器中运行。
我的Jenkins文件如下:
pipeline {
agent {
docker {
image 'microsoft/dotnet:2.1-sdk'
registryUrl 'https://index.docker.io/v1/'
}
}
stages {
stage('Build') {
steps {
sh 'dotnet build MyApplication/Application.csproj -c Release -o /app'
}
}
stage('Test') {
steps {
sh 'dotnet test MyApplication/Application.csproj -c Release -r /results'
}
}
}
}
当我尝试构建时,我在Jenkins构建输出中看到以下错误:
System.UnauthorizedAccessException: Access to the path '/.dotnet' is denied. ---> System.IO.IOException: Permission denied
--- End of inner exception stack trace ---
at System.IO.FileSystem.CreateDirectory(String fullPath)
at System.IO.Directory.CreateDirectory(String path)
at Microsoft.Extensions.EnvironmentAbstractions.DirectoryWrapper.CreateDirectory(String path)
at Microsoft.DotNet.Configurer.FileSentinel.Create()
at Microsoft.DotNet.Configurer.DotnetFirstTimeUseConfigurer.Configure()
at Microsoft.DotNet.Cli.Program.ConfigureDotNetForFirstTimeUse(INuGetCacheSentinel nugetCacheSentinel, IFirstTimeUseNoticeSentinel firstTimeUseNoticeSentinel, IAspNetCertificateSentinel aspNetCertificateSentinel, IFileSentinel toolPathSentinel, Boolean hasSuperUserAccess, DotnetFirstRunConfiguration dotnetFirstRunConfiguration, IEnvironmentProvider environmentProvider)
at Microsoft.DotNet.Cli.Program.ProcessArgs(String[] args, ITelemetry telemetryClient)
at Microsoft.DotNet.Cli.Program.Main(String[] args)
似乎'.dotnet'文件夹在Docker容器中受到保护。有没有办法获得对此的读写权限,或者改变它的位置? bash进入容器时,似乎找不到该文件夹。
感谢您的帮助。
答案 0 :(得分:1)
该问题似乎与尝试将数据写入Docker容器('/')的顶层有关。
在Jenkins文件中添加以下内容可确保设置主目录,并可以在具有正确权限的位置创建.dotnet文件夹。
environment {
HOME = '/tmp'
}
答案 1 :(得分:1)
您可以按照@colmulhall的建议设置HOME
环境变量,然后将docker容器主目录设置为/tmp
。
要以"dotnet"
的方式进行设置,请设置环境变量DOTNET_CLI_HOME
:
environment {
DOTNET_CLI_HOME = "/tmp/DOTNET_CLI_HOME"
}
或在致电dotnet
之前运行:
export DOTNET_CLI_HOME="/tmp/DOTNET_CLI_HOME"
答案 2 :(得分:1)
如果满足以下条件,则此选项很好。
如果您使用的是自定义docker镜像,请基于dotnet sdk docker镜像。您可以使用以下命令创建一个Docker文件。
FROM mcr.microsoft.com/dotnet/core/sdk:2.2
WORKDIR /
# Setup default nuget.config, useful for custom nuget servers/sources
# Set Project-specific NuGet.Config files located in any folder from the solution folder up to the drive root. These allow control over settings as they apply to a project or a group of projects.
COPY nuget.config .
# Set the Environment Variable for the DOTNET CLI HOME PATH
ARG dotnet_cli_home_arg=/tmp/
ENV DOTNET_CLI_HOME=$dotnet_cli_home_arg
在与docker文件相同的目录中创建映像。
docker build -t jenkins-dotnet:latest .
为您要推送到的服务器设置标签。
docker tag jenkins-dotnet:latest some.docker.registry/jenkins-dotnet
将您的 jenkins-dotnet 图片推入
docker push some.docker.registry/jenkins-dotnet
然后您对所有项目的 Jenkinsfile 可能如下所示。
pipeline {
agent {
docker {
image 'some.docker.registry/jenkins-dotnet'
registryUrl 'https://some.docker.registry'
}
}
stages {
stage('Build') {
steps {
sh 'dotnet build MyApplication/Application.csproj -c Release -o /app'
}
}
stage('Test') {
steps {
sh 'dotnet test MyApplication/Application.csproj -c Release -r /results'
}
}
}
}