Оптимальный способ создания и развертывания веб-сайта в виде пакета.deb

В течение некоторого времени я боролся с развертыванием (главным образом, PHP) веб-сайтов в виде файлов.deb и удивляюсь, есть ли лучший способ, чем мой довольно запутанный метод. Моя цель - непрерывная интеграция на моем промежуточном сервере, и развертывание одним щелчком на реальном сервере изнутри Jenkins.

Мой вариант использования сейчас:

  • Разработка кода для OSX
  • Контроль версий в Git
  • Исходный код содержит папку debian/ с сценариями control, postinst и prerm
  • Скрипт сборки phing запускается локально в среде fakeroot
    • копирует файлы в папку сборки /tmp, отражая структуру файловой системы
    • устанавливает владельца файла как root / www-data в зависимости от ситуации
    • запускает dpkg-deb --build ${build.dir} ${working.dir}
    • копирует пакет в закрытое хранилище deb в моей локальной сети

Я попытался настроить CI-сервер Jenkins, чтобы наблюдать за репозиторием Git для коммитов и автоматически выполнять сборку. Проблема в том, что Jenkins работает как собственный пользователь, у которого нет прав для установки прав доступа к файлу, как указано выше. Я также не вижу очевидного способа запуска сборки Phing в среде fakeroot из Jenkins.

Мои вопросы:

  • Есть ли лучший способ установить правильное владение файлом и разрешения, а не копировать все во временную директорию и иметь шаг Phing для chmod всего?
    • Команде dpkg-deb действительно нужны все права доступа к файлам, настроенные в файловой системе заранее? Есть ли что-то, что я мог бы поместить в папку debian/, чтобы настроить эти разрешения при установке.deb?
  • Как я могу заставить Дженкинса запустить скрипт сборки, который имеет правильные права для настройки владельца файла?

Возможно, я неправильно понял, как работает.debs, но кажется довольно неудобным, что владение файлом в исходном коде вашей локальной файловой системы должно отражать место назначения!

Я открыт для предложений по любым другим системам сборки и CI, которые люди используют для выполнения аналогичной задачи.

2 ответа

Кажется, что вы создаете двоичный пакет debian практически вручную, используя команду dpkg-deb. Хотя этот подход не так уж и плох, вы лучше справитесь со многими вещами, если попытаетесь создать пакеты, создав пакеты с исходным кодом, а затем создавая двоичные пакеты из них (даже если это файлы, не зависящие от архитектуры, такие как PHP), Это требует одноразовой настройки нескольких файлов в debian/ каталог.

Есть специальный debian/rules файл, который решает, что запускать, чтобы собирать пакеты Debian разных версий (то есть исходный, двоичный, независимый от двоичного кода) и поддерживать сам каталог сборки. Вы можете запустить все инструменты сборки из этого файла, а не вызывать их один за другим. Чтобы решить проблему с настройкой владельцев / разрешений во время сборки от непривилегированного пользователя, вам нужно будет запустить весь процесс сборки пакетов Debian под fakeroot обертка. Для официальных пакетов Debian это может быть достигнуто путем запуска fakeroot debian/rules binary, Однако это вызывается из dpkg-buildpackage так что просто беги fakeroot dpkg-buildpackage,

Debian хорош своими инструментами для разработчиков (см. Пакеты debhelper, devscripts и связанные), и кажется, что вы их тоже не используете (очевидно, потому что вы собираете пакеты под другой операционной системой). Они сэкономят вам много времени. Например, есть dh_fixperms которая исправит права доступа и проблемы с правами собственности для вас, dh_install разместить файлы в правильных местах, dh_link создать необходимые символические ссылки и др. dh_подобные сценарии. Возможно, вы захотите посмотреть, как это работает в реальном мире, поэтому вот список программного обеспечения, реализованного на PHP и упакованного в Debian.

Другим хорошим инструментом для вас будет git-buildpackage, который является оболочкой для инструментов сборки Debian, предназначенных для сборки пакетов, поддерживаемых в Git DVCS.

Возможно, вы захотите посмотреть общую информацию по сборке с помощью Git на вики-странице Debian.

К сожалению, в Debian нет phing, поэтому вы можете попросить кого-нибудь упаковать его для Debian (чтобы у вас был полный стек сборки в Debian) или просто подготовить chroot Debian с debootstrap и установить phing вручную в нем.

Если вы придерживаетесь пакетов Debian в качестве основного механизма развертывания вместе с некоторой системой CI, вот несколько моментов:

  1. Получите весь стек сборки в Debian, если это возможно. Это даст вам возможность собрать ваше программное обеспечение в чистом chroot Debian, используя такие инструменты, как pbuilder или же cowbuilder, В противном случае приготовьте коробку Debian для сборки. Возможно, вы захотите создать виртуальную машину и передать ее другим разработчикам.
  2. Организовать ограниченный репозиторий Debian (достаточно создать ключ GPG для автоматической подписи репозитория, чтобы уменьшить количество предупреждений, поступающих от apt) и поместить туда пакеты. Добавьте его в целевые поля /etc/apt/sources.list.d/my-repository.list конфигурационный файл. Не забудьте импортировать ваш ключ. Это даст вам информацию о зависимостях, которые вы не знали бы, если бы вы установили пакет только с dpkg -i *.deb до самой фазы установки.
  3. Возможно, вы захотите устанавливать свои сайты из пакетов на регулярной основе (например, release /nightly/etc), а не устанавливать их при каждой сборке, чтобы сэкономить время и пропускную способность. Я использую в основном rsync и некоторый Makefile для обновления базы данных (идея заимствована из миграции схемы базы данных ruby).
  4. Возможно, вы захотите запустить некоторые административные команды из агента CI без пароля (например, перезагрузить конфигурацию веб-сервера, когда он обновляется с помощью sudo invoke-rc.d nginx reload, Если это так, ограничьте выполнение точных команд, изменив /etc/sudoers файл соответственно.

Пакет Debian - это многокомпонентный архив, содержащий данные и управляющую информацию. /debian, Архив данных в основном извлекается как есть. Контрольный архив извлечен и в основном перемещен в /var/lib/dpkg/info и сценарии pre|post-inst|rm вызываются при необходимости. Если вы хотите что-то изменить после извлечения файлов, сделайте это в своем постинсте.

но кажется довольно неудобным, что владение файлом в исходном коде вашей локальной файловой системы должно отражать место назначения!

Обычно люди создают chroot или виртуальную машину, которая отражает архитектуру, для которой они собирают пакет. Попытка собрать пакет для системы Debian из OSX довольно редка.

Команде dpkg-deb действительно нужны все права доступа к файлам, настроенные в файловой системе заранее?

Это нормальный способ обработки разрешений. Изменение разрешений postinstall является исключением, а не правилом.

Другие вопросы по тегам