Он отлично работает в командной строке, когда я делаю

xhost +  
su - jenkins  
emulator -avd myAVD.avd  

но

emulator -avd myAVD.avd

исполняется Дженкинс демон с

"SDL init failure: No available video device"  

Как я могу ослабить ограничения безопасности X для демона jenkins,
чтобы он мог сделать emulator -avd myAVD.avd без сбоев ?

1 ответ1

1

Наиболее вероятная причина возникновения ошибки - emulator не знает, где находится ваш дисплей. Программы X11 используют переменную среды $DISPLAY для определения местоположения сервера X11, и при запуске большинства демонов они не получают переменную окружения. (Большинству демонов не требуется [и не нужно] X11 для запуска.)

Вам нужно будет найти способ передать текущее значение $DISPLAY демону - обратите внимание, что оно может меняться между входами в систему.

Что касается безопасности, никогда не используйте xhost + - он дает полный доступ каждому 1. Вместо этого предоставьте другой учетной записи доступ к вашим данным Xauthority .

$ xauth extract /dev/stdout $DISPLAY | su -c "xauth merge /dev/stdin" jenkins

Один из возможных способов автоматизировать все это - поместить несколько команд в ваш ~/.xprofile ... вам потребуется поддержка ACL, чтобы сработало следующее:

# your .xprofile
if [ "$DISPLAY" ]; then
    touch /tmp/jenkins-display
    setfacl -m u::rw,u:jenkins:r,g::-,o::- /tmp/jenkins-display
    { echo $DISPLAY; xauth nextract /dev/stdout $DISPLAY; } > /tmp/jenkins-display
fi

и сделать сценарий emulator-wrapper для запуска инструмента emulator

#!/bin/sh
# a wrapper script for 'emulator'
{ read -r DISPLAY; export DISPLAY; xauth nmerge /dev/stdin; } < /tmp/jenkins-display
exec emulator "$@"

Несколько некрасиво.


1 "Каждый" обычно означает любого пользователя, который может запускать программы на компьютере, но если ваш сервер X11 прослушивает TCP-соединения, это будет означать "весь Интернет", хотя в современных дистрибутивах это встречается редко.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .