Проблема с разрешениями при создании папки на удаленном хосте с Jenkins

Вопрос или проблема

У меня проблема с использованием Jenkins для создания папки на удаленном хосте.

Удаленный хост в данном случае — это стандартный EC2 сервер с Ubuntu 20.04 AMI с пользователем по умолчанию ubuntu.

Я подключаюсь к удаленному серверу с помощью пользователя ubuntu с помощью кода ниже:

sshagent(credentials : [branchConfig.SSH_CREDENTIALS_NAME]) {
    sh 'ssh -o StrictHostKeyChecking=no ' + branchConfig.SSH_USER + '@' + branchConfig.DOCKER_HOST + ' "echo \"running whoami\" && whoami && echo \"running groups\" && groups && install --directory --mode 0755 --owner ' + branchConfig.SSH_USER + ' --group ' + branchConfig.SSH_USER + ' ~/importengine"'
}

Это выводит следующую ошибку:

+ ssh -o StrictHostKeyChecking=no [email protected] echo running whoami && whoami && echo running groups && groups && install --directory --mode 0755 --owner ubuntu --group ubuntu ~/importengine
Warning: Permanently added 'x.x.x.x' (ECDSA) to the list of known hosts.

running whoami
ubuntu
running groups
ubuntu docker
install: cannot change owner and permissions of ���/home/ubuntu/importengine���: Operation not permitted

Я вижу, что папка создается, но у нее следующие права:

drwxr-xr-x 2 root   root   4.0K Oct 13 11:12 importengine

Если я удалю папку и выполню следующую команду (входя как ubuntu):

install --directory --mode 0755 --owner ubuntu --group ubuntu ~/importengine

…то папка создается с следующими правами:

drwxr-xr-x 2 ubuntu ubuntu 4.0K Oct 13 11:24 importengine

Вопрос

Почему папка создается с владельцем root с самого начала? В конце концов, я явно вижу, что whoami выводит ubuntu, а не root в выводе ошибки, так что папка должна создаваться от имени пользователя ubuntu.

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

sshagent(credentials : [SSH_CREDENTIALS_NAME]) {
    // скопировать .env файл в подпапку. Нужно использовать scp из-за странной проблемы с правами.
    sh 'mkdir -p ~/importengine && cp ' + ENV_FILEPATH + ' ~/importengine/.env'
    sh 'scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -r ~/importengine ' + SSH_USER + '@' + DOCKER_HOST + ':~/.'
}

Примечание

Эта проблема действительно сбивала с толку меня и моих коллег. Я понимаю, что это должно быть специфично для Jenkins. Я не смог воспроизвести эту проблему, выполняя любые шаги вручную с моего Linux-устройства (например, вне Jenkins).

Ответ или решение

Проблема с разрешениями при создании папки на удаленном хосте с Jenkins

Введение

В процессе работы с Jenkins для автоматизации развертывания на удаленном сервере Ubuntu 20.04 возникла сложность, связанная с созданием папки с неправильными правами доступа. Данная проблема, описанная в ваших сообщениях, может быть связана с различными аспектами, включая конфигурацию Jenkins, настройки пользователя, использующего SSH, и даже могут влиять некоторые факторы окружения.

Основная проблема

Вы указали, что папка, создаваемая с помощью команды install, получается с владельцем root и правами доступа drwxr-xr-x 2 root root. Несмотря на то, что команда whoami возвращает ubuntu, фактический результат показывает, что права на папку и её владелец являются исключительными.

Это может происходить по нескольким причинам:

  1. Суперпользы: Jenkins может работать под пользователем, который имеет привилегии суперпользователя (root), если конфигурация настроена соответствующим образом (например, через sudo). В таком случае, даже если вы подключаетесь как пользователь ubuntu, создание директории может автоматически происходить с правами суперпользователя.

  2. SSH-ключи и конфигурация: Убедитесь, что SSH-ключи, используемые Jenkins для аутентификации на удаленном сервере, соответствуют пользователю ubuntu. Неверная конфигурация SSH может привести к ошибкам прав.

  3. Ошибки с переменными окружения: Возможно, переменные окружения, связанные с пользователем Jenkins, не инициализируют вашу сессию как предполагается. Попробуйте удалить или изменить определённые опции, такие как StrictHostKeyChecking.

Решения

С учетом вышеизложенных моментов, предложим несколько возможных подходов к решению проблемы:

  1. Проверка пользователя Jenkins: Убедитесь, что Jenkins запускается от пользователя, который действительно имеет доступ и соответствует вашей конфигурации SSH. Это легко сделать, добавив временные команды whoami и echo $USER в задачу Jenkins для отладки.

  2. Использование sudo: Если вы предполагаете необходимость выполнения задачи от имени суперпользователя, попробуйте выполнить команды с использованием sudo (например, sudo install --directory ...). Не забудьте настроить sudoers файл, чтобы обеспечить выполнение без запроса пароля.

  3. Основывайтесь на SCP: Как вы уже упомянули в альтернативном решении, используя SCP для передачи уже созданных папок вместе с файлами. Это может оказаться более безопасным и простым подходом:

    sshagent(credentials : [branchConfig.SSH_CREDENTIALS_NAME]) {
        sh 'mkdir -p ~/importengine && cp ' + ENV_FILEPATH + ' ~/importengine/.env'
        sh 'scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -r ~/importengine ' + branchConfig.SSH_USER + '@' + branchConfig.DOCKER_HOST + ':~/.'
    }
  4. Логирование и вывод: Добавьте больше логирования к вашим командам, чтобы лучше понять, на каком этапе происходит ошибка. Например, добавьте вывод информации о текущих переменных окружения (env), когда выполняете команды через Jenkins.

Заключение

Изучив данную проблему, мы можем подтвердить, что ошибки в создании потенциально связаны с конфигурацией Jenkins и механизмами аутентификации при работе с удаленными серверами. Обратив внимание на вышеописанные шаги и рекомендации, вы сможете более целенаправленно устранить проблему и настроить автоматизацию без лишних задержек.

Оцените материал
Добавить комментарий

Капча загружается...