Jenkins 詹金斯管道公司';s deleteDir()失败,出现java.nio.file.AccessDeniedException异常

Jenkins 詹金斯管道公司';s deleteDir()失败,出现java.nio.file.AccessDeniedException异常,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我有一份Jenkins管道工作,负责构建我的Android项目。 基本步骤是签出项目的存储库,运行docker容器(将主机的存储库文件夹映射到容器中相应的文件夹),在容器中执行脚本并提取工件 第一步使用以下函数删除工作区: node("jenkins-slaves") { deleteDir() // <-------------- HERE stage('checkout repo') { // REDACTED } // REDACT

我有一份Jenkins管道工作,负责构建我的Android项目。
基本步骤是签出项目的存储库,运行docker容器(将主机的存储库文件夹映射到容器中相应的文件夹),在容器中执行脚本并提取工件

第一步使用以下函数删除工作区:

node("jenkins-slaves") {
    deleteDir() // <-------------- HERE

    stage('checkout repo') {
        // REDACTED
    }

    // REDACTED
}

此问题的根本原因是什么?如何解决此问题?

删除错误通常是由于权限不足或某人/某物锁定了文件而导致的

我注意到Jenkins试图删除但未成功的文件夹是由构建脚本在容器中动态创建的。文件夹和下面的所有文件都是使用root/root(用户/组)创建的

这有助于我了解此问题的根本原因-管道正在与jenkins/jenkins(用户/组)一起运行,无法删除与其他用户(在我的情况下为root/root)创建的文件/文件夹

我提出的解决方案是使用主机系统使用的相同用户(属于相同组)创建docker映像(我的容器操作系统基于):

请注意,GID和UID(在上面的示例中都等于6002)必须与主机中的ID匹配。要查找它们,可以使用以下命令:

id -u jenkins  
id -g jenkins  
发件人:

用户指令设置用户名(或UID)和可选的 运行映像和任何运行时要使用的用户组(或GID),CMD 以及Dockerfile中的入口点说明

执行此步骤后,容器中由生成脚本创建的任何文件/文件夹都将使用匹配的主机用户-这允许主机操作系统在没有任何问题的情况下操作/删除它们

RUN addgroup -S -g 6002 jenkins
RUN adduser -S -u 6002 -G jenkins jenkins
USER jenkins
id -u jenkins  
id -g jenkins