Функция deleteDir () в конвейере Jenkins завершается с ошибкой java.nio.file.AccessDeniedException - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть задание Jenkins Pipeline для создания моего проекта Android.
Основными шагами являются извлечение хранилища проекта, запуск контейнера Docker (сопоставление папки хранилища хоста с соответствующей папкой в ​​контейнере), выполнение сценария в контейнере иизвлечь артефакты.

Самый первый шаг удаляет рабочее пространство с помощью функции deleteDir () :

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

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

    // REDACTED
}

Однако, во время одной из первых попыток запустить его, я получилследующая ошибка:

[Pipeline] node
Running on jenkins-slave14 in /home/jenkins/workspace/REDACTED
[Pipeline] {
[Pipeline] deleteDir
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.nio.file.AccessDeniedException: /home/jenkins/workspace/REDACTED/app/all-apk/apks
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    at sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:244)
    at sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(AbstractFileSystemProvider.java:108)
    at java.nio.file.Files.deleteIfExists(Files.java:1165)
    at hudson.Util.tryOnceDeleteFile(Util.java:290)
    at hudson.Util.deleteFile(Util.java:245)
    at hudson.FilePath.deleteRecursive(FilePath.java:1211)
    at hudson.FilePath.deleteContentsRecursive(FilePath.java:1220)
    at hudson.FilePath.deleteRecursive(FilePath.java:1202)
    at hudson.FilePath.deleteContentsRecursive(FilePath.java:1220)
    at hudson.FilePath.deleteRecursive(FilePath.java:1202)
    at hudson.FilePath.deleteContentsRecursive(FilePath.java:1220)
    at hudson.FilePath.deleteRecursive(FilePath.java:1202)
    at hudson.FilePath.access$1000(FilePath.java:197)
    at hudson.FilePath$14.invoke(FilePath.java:1181)
    at hudson.FilePath$14.invoke(FilePath.java:1178)
    at hudson.FilePath$FileCallableWrapper.call(FilePath.java:2750)
    at hudson.remoting.UserRequest.perform(UserRequest.java:208)
    at hudson.remoting.UserRequest.perform(UserRequest.java:54)
    at hudson.remoting.Request$2.run(Request.java:360)
    at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:68)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused: java.io.IOException: Unable to delete '/home/jenkins/workspace/REDACTED/app/all-apk/apks'. Tried 3 times (of a maximum of 3) waiting 0.1 sec between attempts.
    at hudson.Util.deleteFile(Util.java:250)
    at hudson.FilePath.deleteRecursive(FilePath.java:1211)
    at hudson.FilePath.deleteContentsRecursive(FilePath.java:1220)
    at hudson.FilePath.deleteRecursive(FilePath.java:1202)
    at hudson.FilePath.deleteContentsRecursive(FilePath.java:1220)
    at hudson.FilePath.deleteRecursive(FilePath.java:1202)
    at hudson.FilePath.deleteContentsRecursive(FilePath.java:1220)
    at hudson.FilePath.deleteRecursive(FilePath.java:1202)
    at hudson.FilePath.access$1000(FilePath.java:197)
    at hudson.FilePath$14.invoke(FilePath.java:1181)
    at hudson.FilePath$14.invoke(FilePath.java:1178)
    at hudson.FilePath$FileCallableWrapper.call(FilePath.java:2750)
    at hudson.remoting.UserRequest.perform(UserRequest.java:208)
    at hudson.remoting.UserRequest.perform(UserRequest.java:54)
    at hudson.remoting.Request$2.run(Request.java:360)
    at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:68)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at ......remote call to jenkins-slave14(Native Method)
    at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1654)
    at hudson.remoting.UserResponse.retrieve(UserRequest.java:311)
    at hudson.remoting.Channel.call(Channel.java:905)
    at hudson.FilePath.act(FilePath.java:987)
Caused: java.io.IOException: remote file operation failed: /home/jenkins/workspace/REDACTED at hudson.remoting.Channel@16d096ce:jenkins-slave14
    at hudson.FilePath.act(FilePath.java:994)
    at hudson.FilePath.act(FilePath.java:976)
    at hudson.FilePath.deleteRecursive(FilePath.java:1178)
    at org.jenkinsci.plugins.workflow.steps.DeleteDirStep$Execution.run(DeleteDirStep.java:77)
    at org.jenkinsci.plugins.workflow.steps.DeleteDirStep$Execution.run(DeleteDirStep.java:69)
    at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution$1$1.call(SynchronousNonBlockingStepExecution.java:49)
    at hudson.security.ACL.impersonate(ACL.java:260)
    at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution$1.run(SynchronousNonBlockingStepExecution.java:46)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Finished: FAILURE

В чем основная причина этой проблемы и как я могу ее решить?

1 Ответ

0 голосов
/ 10 февраля 2019

Ошибка удаления обычно возникает из-за недостаточных разрешений или из-за того, что кто-то / что-то блокирует файл.

Я заметил, что папка, которую Дженкинс безуспешно пытался удалить, динамически создавалась в контейнере сценарием сборки.Папка и все файлы ниже были созданы с помощью root / root (пользователь / группа).

Это помогло мне понять основную причину этой проблемы - конвейер работает с jenkins / jenkins (пользователь / группа) и не может удалить файлы / папки, созданные другим пользователем (root / root в моем случае),

Решение, которое я придумал, состояло в том, чтобы создать образ докера с тем же пользователем (принадлежащим к той же группе), который используется хост-системой (моя контейнерная ОС основана на Alpine ):

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

Обратите внимание, что GID и UID (оба равны 6002 в приведенном выше примере) должны совпадать с идентификаторами на вашем хост-компьютере.Чтобы найти их, вы можете использовать следующие команды:

id -u jenkins  
id -g jenkins  

Из документации :

Инструкция USER устанавливает имя пользователя (или UID) и, необязательно, группу пользователей (или GID) для использования при запуске образа и для любых инструкций RUN, CMD и ENTRYPOINT, которые следуют за ним в Dockerfile.

После выполнения этого шага любые файлы / папкисоздаваемые сценарием сборки внутри контейнера, используют соответствующего пользователя хоста, что позволяет операционной системе хоста манипулировать / удалять их без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...