Использование приложений Snap с Jenkins

Я пытаюсь настроить непрерывное развертывание сайта hugo с помощью Jenkins на сервере Ubuntu 16.04. Я установил Hugo с помощью snap, как было рекомендовано на их сайте. Мне удалось заставить сайт работать с моей основной учетной записью пользователя, но когда я пытаюсь заставить Дженкинса сделать это, возникает эта ошибка:

cannot create user data directory: /var/lib/jenkins/snap/hugo/1766: Permission denied

Что кажется немного странным, потому что у Дженкинса есть права на запись в эту папку, если я правильно читаю разрешения:

jenkins@computer: ~$ ls -al /var/lib/jenkins/snap/hugo/1766
total 8
drwxr-xr-x 2 jenkins jenkins 4096 May 11 01:33 .
drwxr-xr-x 4 jenkins jenkins 4096 May 11 01:33 ..

Я что-то упустил здесь? Есть ли другие вещи, которые мне нужно сделать?


person theodinspire    schedule 11.05.2018    source источник


Ответы (2)


когда я пытаюсь заставить Дженкинса сделать это

Убедитесь, что задание Jenkins на самом деле выполняется как jenkins: добавьте шаг в задание для печати id -a.
Скорее всего: оно выполняется не как Jenkins, а как ваша основная учетная запись, которая не имеет права писать в этом папка.


"невозможно создать каталог данных пользователя": возможно, 1766 – это идентификатор учетной записи пользователя, созданной в качестве пользователя.
Проверьте, создаете ли (в качестве основной учетной записи) эту папку 1766 с chmod 777 (для тестирования) помогает.

Обратите внимание, что в hugo issue 3143 упоминается:

Снапы доступны только для чтения в целях безопасности. Мы хотим, чтобы враждебная сторона не смогла незаметно изменить программное обеспечение на вашем компьютере, чтобы вы не могли изменить оснастку, установленную в вашей системе. Это также означает, что вы всегда можете проверить подпись на снапе, даже спустя много времени после его установки, чтобы убедиться, что это именно то программное обеспечение, которое вы планировали. Если вы хотите изменить оснастку, вы обычно можете создать свою собственную версию, особенно если она с открытым исходным кодом.

Итак, куда снап может записывать данные? Каждая оснастка получает собственный набор доступных для записи каталогов, которые имеют определенные свойства. Есть два каталога, в которые snap может писать независимо от пользователя. Один из них версионный — каждый раз при обновлении снапа данные сохраняются, и новая версия снапа может обновить свою копию. Другой «общий» каталог данных не имеет версии и используется для больших блоков данных, которые вы не хотите дублировать в разных версиях снапа:

/var/snap/<name>/current/  ← $SNAP_DATA is the versioned snap data directory
/var/snap/<name>/common/   ← $SNAP_COMMON will not be versioned on upgrades

Как правило, в одном из них хранится конфигурация вместе с общесистемными данными для Snap.

Также существуют эквивалентные два каталога с возможностью записи для каждого снимка в доме пользователя, которые можно использовать для хранения данных снимка, специфичных для того или иного пользователя, отдельно:

~/snap/<name>/current/      ← $SNAP_USER_DATA that can be rolled back
~/snap/<name>/common/       ← $SNAP_USER_COMMON unversioned user-specific data

Вы можете использовать snap-версию Hugo для записи (т. е. запуска hugo new site и т. д.) в любом месте вашего каталога $HOME, скажем, ~/tmp/htest, но не в общесистемном каталоге /tmp.

Это соответствует разделу "Hugo Install from snap":

Hugo-as-a-snap может записывать только в каталог $HOME пользователя — и каталоги, смонтированные через gvfs, принадлежащие пользователю — из-за модели ограничения и безопасности Snaps.

Используйте sudo snap install hugo --classic, чтобы отключить модель безопасности по умолчанию, если вы хотите, чтобы hugo мог иметь доступ на запись по другим путям, кроме пользовательского каталога $HOME.

person VonC    schedule 11.05.2018
comment
Сценарий в значительной степени запускается из учетной записи Jenkins. Я сделал id -a вещь, но когда я впервые устранял неполадки, я запускал ее из консоли от имени пользователя Jenkins. - person theodinspire; 11.05.2018
comment
@theodinspire, так что вы подтверждаете, что в вашей работе с Дженкинсом id -a, выполненный непосредственно перед командой Hugo (кстати, какую команду Hugo вы используете?), действительно возвращает Дженкинса? - person VonC; 11.05.2018
comment
К сожалению, это не сработало для меня. Хотя это дало мне идею, которая в конце концов нашла ее. Хотел бы я дать половину кредита. - person theodinspire; 13.05.2018
comment
@theodinspire Отлично! Опубликуйте свой ответ (и вы тоже можете его принять) - person VonC; 13.05.2018

Я решил это в конечном итоге:

  • удаление Дженкинса с помощью sudo apt-get remove --purge jenkins
  • создание стандартной учетной записи пользователя с именем jenkins
  • переустановка Дженкинса и
  • установка корневого каталога рабочей области Jenkins на /home/jenkins/workspace/${ITEM_FULL_NAME}

Вероятно, также можно вылечить, создав каталог /home/jenkins, принадлежащий профилю Jenkins.

person theodinspire    schedule 12.05.2018
comment
Важно было создать пользовательскую папку для Jenkins, чтобы ему было куда писать. Думаю, я тоже мог бы подделать его: создать для него домашний каталог и передать право собственности на учетную запись Jenkins. - person theodinspire; 13.05.2018
comment
Именно это я и предполагал в начале своего собственного ответа: процесс выполнялся с использованием стандартной учетной записи Jenkins со своей собственной папкой. - person VonC; 13.05.2018