Піднімаємо власний репозиторій пакетів для Ubuntu (Debian)

В житті будь-якої розвивається проекту рано чи пізно (і краще рано) настає момент, коли експлуатація багатозначно дивиться на розробку і пропонує оформити стосунки. Подальший розвиток подій, як водиться, залежить від обох сторін. Про погане сьогодні не будемо, розглянемо відразу випадок, коли розробка готова використовувати нехитрий інструментарій складання пакетів, підготовлений для неї експлуатацією (шаблони debian/rules і debian/control, команди fakeroot, debuild, і так далі). Залишилася сама малість: підняти для зібраних пакетів власний репозиторій.
Оскільки вивчення інтернетів раптово показали, що тема, хоч і висвітлювалася, і навіть на Хабре, навряд чи може вважатися виразно розкритою, спробуємо заповнити цю прогалину.
Для початку нам буде потрібно ключ, яким буде підписаний репозиторій. У даному прикладі ми створюємо RSA-ключ довжиною 4096 біта, який не має терміну давності:
$ sudo apt install gpg
$ gpg --gen-key
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 4

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits

Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 0

Key does not expire at all
Is correct this? (y/N) y

You need a user ID to identify your key; the software constructs the user ID from the Real Name, and Comment Email Address in this form:
"Zaphod Beeblebrox (Galactic President) <zbeeblebrox@pres.galaxy.com>"

Real name: SnakeOil Admin
Email address: admin@snakeoil.org
Comment:

You selected this USER-ID:
"SnakeOil Admin <admin@snakeoil.org>"

Change (N)ame, ©omment, (E)mail or (O)kay/(Q)uit? O

Оскільки передбачається підписувати репозиторій при кожній зміні, пароль від ключа краще залишити порожнім, інакше скриптом репозиторій не обновишь, але якщо хочеться повного контролю, можна і поставити. Далі ключ потрібно експортувати у файл і надалі помістити в корінь репозиторію для подальшого імпорту на клієнтах.
$ export PUBKEY_ID=`gpg --list-keys | awk '( $1 == "pub" ) { print $2 ; exit }' | cut -f 2 -d /`
$ gpg --output keyFile --armor --export $PUBKEY_ID

Пора підготувати дерево репозиторію. У нас є тільки один дистрибутив Ubuntu, тільки Intel x86_64 і немає пакетів з вихідним кодом, тому про створення інших елементів дерева ми не турбуємося. Якщо пакети збираються під різні дистрибутиви і мають різні залежності, дерево вийде більш розлогим, так і помянутые нижче правила складання ускладняться.
$ sudo mkdir -p /var/www/repo
$ sudo mv keyFile !$
$ cd !$
$ sudo mkdir -p conf contrib/binary-amd64 dists/xenial

Створимо файл конфігурації репозиторію:
$ sudo cat > /var/www/repo/conf/distributions <<EOF
Origin: SnakeOil
Label: SnakeOil private Ubuntu repo
Codename: xenial
Architectures: amd64
Components: contrib
Description: Our own and 3rd party software packaged internally
EOF
$ sudo echo SignWith: $PUBKEY_ID >> /var/www/repo/conf/distributions

настав Час настроїти автоматичне оновлення репозиторію при появі в ній нових пакетів. Файл InRelease з вбудованою підписом запитується новими пакетними менеджерами, а зв'язка з двох файлів Release і Release.gpg потрібна старим. Залежно потрібно продублювати для всіх дистрибутивів, які ви плануєте підтримувати.
$ sudo cat > /var/www/repo/Makefile <<EOF
#!/usr/bin/make
#
# Update the repository every time when a new package arrives

all: repo

repo: dists/xenial/InRelease dists/xenial/Release.gpg

dists/xenial/InRelease: dists/xenial/Release
gpg --clearsign --digest-algo SHA512 -o dists/xenial/InRelease.new dists/xenial/Release
mv dists/xenial/InRelease.new dists/xenial/InRelease

dists/xenial/Release.gpg: dists/xenial/Release
gpg -abs -o dists/xenial/Release.gpg-new dists/xenial/Release
mv dists/xenial/Release.gpg-new dists/xenial/Release.gpg

dists/xenial/Release: conf/distributions contrib/binary-amd64/Packages.gz
cat conf/distributions > dists/xenial/Release
apt-ftparchive release . >> dists/xenial/Release

contrib/binary-amd64/Packages.gz: contrib/binary-amd64/Packages
gzip --keep --force -9 ../../contrib/binary-amd64/Packages

contrib/binary-amd64/Packages: contrib/binary-amd64/*.deb
dpkg-scanpackages contrib/binary-amd64 > contrib/binary-amd64/Packages.new
mv contrib/binary-amd64/Packages.new contrib/binary-amd64/Packages
EOF

Репозиторій готовий, залишилося налаштувати потрапляння всіх новостворюваних пакетів у /var/www/repo/dists/xenial/contrib/binary-amd64 (за рамками даної статті). Однак чи багато користі від репозиторію, якщо він суто локальний? Треба забезпечити його доступність HTTP:
$ sudo apt install nginx
$ sudo cat > /etc/nginx/sites-available/repo.conf <<EOF

server {
listen 80;
server_name repo repo.snakeoil.org;

location ~ /(.*)/conf {
deny all;
}

root /var/www/repo;
}
EOF
$ sudo ln -s /etc/nginx/sites-available/repo.conf /etc/nginx/sites-enabled/
$ sudo service nginx restart

І, нарешті, прописуємо свій репозиторій на клієнтах:
$ wget -O - http://repo/keyFile | sudo apt-key add -
$ sudo echo 'deb [arch=amd64] http://repo/ xenial contrib' > /etc/apt/sources.list.d/mylovelyrepo.list
$ sudo apt update

Сеанс чорної магії з викриттям закінчено, дякую всім за увагу.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.