Aptly – свой репозиторий с контролем версий

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

Принцип работы таков:

  • создается зеркало локального репозитория;
  • фиксируется текущее состояие созданием снмка (snapshot);
  • cнимки могут быть объеденены между собой (merge), сравнены (diff) и прочее;
  • публикуется выбранный снимок.

Принцип работы Aptly

Очень хорошая, понятная документация на самом официальном сайте проекта: http://www.aptly.info/doc/overview/

 

Установка Aptly на Ubuntu 14.04:

Так как в основном репозитории Ubuntu нет пакета Aptly, для начала добавьте репозиторий разработчика в /etc/apt/sources.list прямым редактированием файла добавив в конец строку:

deb http://repo.aptly.info/ squeeze main

или выполнив команду:

# add-apt-repository 'deb http://repo.aptly.info/ squeeze main'

Не беспокойтесь на счет squeeze в названии репозитория: пакет Aptly будет работать на Debian squeeze+, Ubuntu 10.0+

Импортирйте ключ для репозитория:

# gpg --keyserver keys.gnupg.net --recv-keys 2A194991
# gpg -a --export 2A194991 | sudo apt-key add -

После этого можно устанавливать Aptly как любой другой пакет:

# apt-get update
# apt-get install aptly

установяться так же и зависимости: bzip2, gnupg and gpgv.

В целях безопасности команды aptly не следует выполнять из-под учетной записи root. Для этих целей создайте нового пользователя, например:

# adduser repokeeper

и залогиньтесь под ним:

# su repokeeper

Далее сгенерируйте gpg ключ для подписи своего репозитория. Делать это нужно именно из под учетной записи того пользователя, от имени которого впоследствии будут публиковаться снимки:

# gpg --gen-key

Если интропия вашкго компьютера достаточна, а именно более 800, то ключ благополучно сгенерируется. Сохраните пароль ключа в надежном месте.

Посмотреть уровень текущей интропии можно открыв еще одну консоль и выполнив:

cat /proc/sys/kernel/random/entropy_avail

Если долго ничего не происходит и вываливается ошибка:

Not enough random bytes available. Please do some other work to give the OS a chance to collect more entropy! (Need 282 more bytes)

это означает, что ваш компьютер бездействует и уровень интропии недостаточен.
Запустите какой-нибудь длительный тяжелый процесс на сервере, что бы его нагрузить или запустите в соседней консоли:

# cat /dev/urandom > randomfile

подождите пару минут, чтобы на диске создался файл приличного размера, затем прервите операцию нажав Ctrl+C.
Далее выполните:

# dd if=random of=/dev/null iflag=direct

и снова смотрите в файл /proc/sys/kernel/random/entropy_avail. В какой-то момент уровень энтропии поднимется до 800 и GPG сможет сгенерировать свой ключ.
Сохраните ключ в надежном месте. Для этого заархивируйте файл .gnupg в домашнем каталоге пользователя repokeeper и скопируте его для хранения или передачи иному пользователю.

# tar -czvf gnupg.tar.gz ~/.gnupg

На этом установка aptly закончена.

 

Настройка и работа с Aptly

Создание зеркала

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

# wget -O - http://repo.dev.domain.ru/repo.gpg.key | gpg --no-default-keyring --keyring trustedkeys.gpg –-import

Основной конфиг создайте из автосоздаваемого ~/aptly.conf в /etc/aptly.conf с указанием корневого каталога. В домашней папке конфиг удалите. Дело в том, что aptly сначала ищет конфигурационный файл в домашнем каталогк, затем в директории /etc.
Содержание файла aptly.conf:

{
  "rootDir": "/var/cache/aptly",
  "downloadConcurrency": 4,
  "downloadSpeedLimit": 0,
  "architectures": [],
  "dependencyFollowSuggests": false,
  "dependencyFollowRecommends": false,
  "dependencyFollowAllVariants": false,
  "dependencyFollowSource": false,
  "gpgDisableSign": false,
  "gpgDisableVerify": false,
  "downloadSourcePackages": false,
  "ppaDistributorID": "ubuntu",
  "ppaCodename": "",
  "S3PublishEndpoints": {},
  "SwiftPublishEndpoints": {}
}

 
Создайте зеркало нужной ветки:

# aptly mirror create -architectures=amd64 repo-precise-1-main http://repo.dev.domain.ru/repo precise-1 main

где repo-precise-1-main произвольное имя нашего зеркала.
Aply любезно сообщит, что можно сделать дальше: "You can run 'aptly mirror update repo-precise-1-main' to download repository contents."

Запустите обновление зеркала:

# aptly mirror update repo-precise-1-main

Файлы сохраняются в rootdir/.aptly/pool/ в нашем случае в /var/cache/aptly/pool

Информация о зеркале:

# aptly mirror show repo-precise-1-main

Редактировать зеркало:

# aptly mirror edit -architectures="i386,amd64" repo-precise-1-main

 

Создание снимка (snapshot)

Создайте snapshot:

# aptly snapshot create repo-precise-1-main-20150505 from mirror repo-precise-1-main

где repo-precise-1-main-20150505 произвольное имя снимка.

Снэпшот не занимает дополнительного места на диске, хранит только список пакетов.
Можно создавать снэпшот в любое время. Затем можно объеденить (MERGE) несколько снепшотов в один с разной стратегией (Flag -latest chooses merge strategy: package with latest version “wins”):

# aptly snapshot merge -latest wheezy-final-20141009 wheezy-main-7.6

Проверка:

# aptly package show -with-references 'Name (nginx)'

Посмотреть список снепшотов:

# aptly snapshot list

Сравнить снепшоты:

# aptly snapshot diff -only-matching repo-precise-1-main-20150505 repo-precise-1-main-20150506

-only-matching - display diff only for matching packages (don't display missing packages)

 

Публикация снепшота

Опубликовать репозиторий из снепшота:

# aptly publish snapshot -architectures="i386,amd64" repo-precise-1-main-20150506

Указание -architectures="i386,amd64" обязательно, несмотря на то, что в документации сказано, что по умолчанию публикуются все доступные архетектуры.

При запросе ввести пароль (2 раза) от ключа GPG созданного ранее.
Если публикуется объедененный снепшот, то имя ветки нужно указать явно, например:

# aptly publish snapshot -distribution=wheezy wheezy-final-20141009

Посмотреть какой снепшот опубликован на текущий момент:

# aptly publish list

Сравнить с предыдущим снепшотом:

# aptly snapshot diff repo-precise-1-main-20150505 repo-precise-1-main-20150506-1

При наличии изменений опубликовать новый снепшот вместо предыдущего:

# aptly publish switch precise-1 repo-precise-1-main-20150506-1

При запросе ввести пароль (2 раза) от gpg ключа.

Удалить снепшот:

# aptly snapshot drop repo-precise-1-main-20150506

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

Поместите публичный ключ в public:

# gpg --export --armor > /var/cache/aptly/public/repo.gpg.key

 

Доступ к репозиторию по протоколу HTTP

Для того, что наш репозиторий был доступен из браузера по http нужно установить и настроить вебсервер Apache.

# apt-get install apache2

Теперь нужно настроить вебсеревер так, что бы опубликовать директорию с нашим репозиторием '/var/cache/aptly/public' с опцией autoindexing.

Для этого создайте файл /etc/apache2/sites-available/aptly.conf следующего содержания:


     ServerAdmin you@domain.ru  # укажите вашу почту
     ServerName repo.domain.ru  # имя вашего репозитория. Должно резолвится в ваш IP адрес.
     ServerAlias www.repo.domain.ru
     DocumentRoot /var/cache/aptly/public
     
        # We want the user to be able to browse the directory manually
        Options +Indexes +FollowSymLinks +Multiviews
        #Order allow,deny #раскоментируйте для версии Apache 2.2 (Ubuntu 12.04)
        #Allow from all   #раскоментируйте для версии Apache 2.2 (Ubuntu 12.04)
        Require all granted  #для версии Apache 2.4 (Ubuntu 14.04)
     

     ErrorLog /var/log/apache2/aptly-error.log
     CustomLog /var/log/apache2/aptly-access.log combined

Файлы логов должны быть созданы заранее и доступны для записи пользователю, от имени которго запускается Apache. В ubuntu это www-data:

# touch /var/log/apache2/aptly-error.log
# touch /var/log/apache2/aptly-access.log

Находясь в директории /etc/apache2/sites-available/ выполните:

# a2ensite aptly.conf

эта команда создаст алиас для файла конфигурации в /etc/apache2/sites-enabled/.

Перезапустите Apache:

# service apache2 reload

Теперь репозиторий будет доступен из браузера по адресу: http://your-server
Не забудьте проверить настройки файрвола.

 

Настройки на стороне клиента

Что бы подключить к нашему репозиторию новую машину и устанавливать из него пакеты добавьте в /etc/apt/sources.list прямым редактированием файла строку:

deb http://your-server/ precise-1 main

или выполнив команду:

# add-apt-repository 'deb http://your-server/ precise-1 main'

И импортируйте ключ репозитория:

# wget -O - http://repo.domain.ru/repo.gpg.key | sudo apt-key add -

или добавить ключ локально:

# apt-key add repo.gpg.key

 

Прочие дополнения

Для удобства пользователей можно разместить напоминание в виде html странички о том, как установить GPG ключ. Для этого в корне директории /var/cache/aptly/public/ создайте файл readme.html:

<html>
<head>
<title>
Your packages
</title>
</head>
<body>
<p>This is repository for Your packages.</p>
<p>Для установки пакетов добавьте новый репозиторий в <code>/etc/apt/sources.list</code>:</p>

<pre>
deb http://repo.domain.ru/ precise-1 main
deb http://repo.domain.ru/ trusty main
</pre>

<p>И импортируйте ключ репозитория:</p>

<pre>
$ wget -O - http://repo.domain.ru/repo.gpg.key | sudo apt-key add -
</pre>

<p>Установка пакетов:</p>

<pre>
$ apt-get update
$ apt-get install packagename
</pre>

</body>
</html>

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

 

Формирование картинки:

# aptly graph

Созданный .png файл скопируйте к себе на рабочий стол, например с помощью WinSCP.

Вот, что может получиться:
График репозитория
 

Troubleshooting

Ошибка при смене снэпшота:

# aptly publish switch trusty repo-trusty-1-main-20150904-01

Loading packages...
Generating metadata files and linking package files...
ERROR: unable to publish: unable to process packages: error linking file to /var/cache/aptly/public/pool/main/a/activiti/activiti.deb: file already exists and is different

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

# aptly publish switch trusty repo-trusty-1-main-20150904-01

 

Публикации по теме:
Об Aptly: http://habrahabr.ru/post/225825/
Генерация gpg ключа: https://debian.pro/1424

 

 

 

Метки: . Закладка Постоянная ссылка.

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

Ваш e-mail не будет опубликован.

*