Новые технологии проекта Sisyphus: жизненный цикл пакета

Алексей Гладков

Проверка пакетов, поступающих в репозиторий Sisyphus, является одной из важнейших задач. С момента создания проекта Sisyphus был предпринят ряд шагов по автоматизации проверки поступающих пакетов на соответствие общим требованиям, предъявляемым к пакетам Sisyphus. В частности, была создана программа sisyphus_check. Для гарантии пересобираемости пакета была создана система hasher, позволяющая осуществить пересборку пакета в «чистом» окружении, созданном из текущего состояния Sisyphus. Следующим шагом в автоматизации прохождения пакета в репозиторий стало создание системы автоматизированной проверки входящих пакетов — проекта incominger.

Целью этой системы является выполнение стандартных действий над пакетами для осуществления входного контроля. Incominger основывается на трёх других проектах: osec, hasher и sisyphus_check.

На вход этой системы подаются пакет(или пакеты). На выходе из неё эти пакеты сортируются по двум директориям: для проходящих и не проходящих в Sisyphus пакетов. В целом работу программы можно разбить на 3 стадии:

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

local folder

возможность забирать пакеты из локальной директории;

package list

возможность задать файл со списком файлов;

folder over ssh

возможность получать пакеты через ssh;

rsync

возможность получать пакеты через rsync.

На следующей стадии производятся быстрые проверки, которые позволяют заключить, что пакет содержит грубые ошибки и дальнейшие проверки проводить не следует (например, можно даже не пробовать пересобирать пакет, если у поступившего исходного пакета отсутствует gpg-подпись). Так как любой из приходящих пакетов может нести угрозу безопасности системы, то работа с ними не должна проводится в реальой (рабочей) системе. Для обеспечения безопасности проверка пакетов имеет следующий порядок:

  1. Создаеётся «пустой» chroot.

  2. В chroot устанавливаются пакеты необходимые для осуществления проверки на этой стадии.

  3. В chroot копируется первый из очереди и проверяется. Далее копируется и проверяется следующий пакет. Этот этап повторяется для всех поступивших пакетов.

Любой не нормальный код возврата программ в chroot считается ошибкой и пакет — не прошедшим проверку. В идеале для каждого пакета должен создаваться новый chroot, но на данный момент этого не делается.

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

Пересборка пакетов производится с помощью hasher. К сожалению, очень трудно выяснить, в каком порядке нужно пересобирать пакеты, потому что в исходном пакете не содержится явного списка бинарных пакетов, которые могут быть из него собраны. Поэтому все пакеты выстраиваются в единую очередь. На данный момент она формируется по дате сборки исходных пакетов. Пакеты, имена которых начинаются с префикса lib переносятся в начало очереди.

Пакеты в очереди пересобираются циклически. Удачно пересобравшиеся и не пересобравшиеся пакеты удаляются из очереди. Каждый удачно собравшийся пакет помещается во временный репозиторий. Этот репозиторий используется при каждой новой попытке сборки из очереди. Если пакет не пересобрался по причине того, что для его сборки не хватает каких-либо пакетов или не хватает пакетов определённой версии, то пересборка пакета не считается неудачной и откладывается. После того как достигается конец очереди, процесс пересборки начинается сначала. Пересборка останавливается тогда, когда на очередном цикле очередь не уменьшится ни на один пакет.

После стадии пересборки в hasher становится не важно, откуда был получен пакет. И можно считать, что все пакеты, попавшие в систему incominger, правильно пересобираются.

Далее выполняется последующая проверка удачно пересобравшихся пакетов. В неё входит проверка с помощью sisyphus_check и проверка на корректную устанавливаемость. Для этого создаётся новый chroot, в нем устанавливаются все необходимое для установки проверяемого пакета. После этого запускается программа osec, затем в chroot устанавливается проверяемый пакет и снова запускается osec. Затем пакет удаляется и опять запускается osec. Таким образом можно узнать, какие файлы были созданы и изменены после установки бинарного пакета и какие были удалены после его удаления. Если после установки пакета меняются права у файлов, ему не принадлежащих, или после удаления пакета остаются какие-нибудь принадлежащие ему файлы, то считается, что пакет содержит ошибки и он не пропускается в репозиторий Sisyphus.

На последнем этапе формируется детальный отчёт о проверке пакетов. По этому отчёту можно вынести решение, пропускать или нет пакеты в Sisyphus и если не пропускать, то по какой причине.