Debian Repository mit GitLab Pages

Ein einfaches Debian-Repository selbst gestrickt…

Manchmal braucht man ein eigenes Debian-Repository, z.B. um Electron-Anwendungen mit rpi-image-gen zu installieren.

Auch wenn GitLab ein experimentelles Feature dafür hat, ist es nicht auf jeder Instanz aktiviert.

Repository erstellen

Grundsätzlich gibt es zwei Wege bzw. Werkzeuge um statische Debian-Paketquellen zu erzeugen, dpkg-scanpackages und reprepro. Die folgenden Beispiele gehen davon aus, dass es unterhalb des Arbeitsverzeichnisses ein weiteres mit dem Namen debian gibt. Darin befinden sich eine oder mehrere “.deb"-Dateien.

dpkg-scanpackages

Dies ist die einfachere Variante. Zunächst muss das Paket dpkg-dev installiert werden (apt install -y dpkg-dev). Anschließend kann das Programm mit dem folgenden Befehl ausgeführt werden:

dpkg-scanpackages -m debian /dev/null | gzip -9c > debian/Packages.gz

Danach kann dann das Verzeichnis debian auf einem Web Speicherbereich zur Verfügung gestellt werden.

reprepro

Dies ist die Variante, die mehr Möglichkeiten bietet, zuerst muss das Paket reprepro installiert werden (apt install -y reprepro). Diese Variante hat den Vorteil, dass man auch GPG Schlüssel bereitstellen kann…

Da hier auch Konfigurationsdateien erzeugt werden müssen, empfielt es sich ein zusätzliches Shellscript im Repository anzulegen:

REPO_DIR=$1

mkdir -p $REPO_DIR/{conf,incoming,debian}

RELEASE_NAME=bookworm

echo "Using $REPO_DIR as local repository"

cat <<EOF >> $REPO_DIR/conf/distributions
Origin: My Electron App
Label: My Electron App
Suite: stable
Codename: $RELEASE_NAME
Architectures: arm64 armhf
Components: main
Description: Personal Electron App software repository
EOF

cd $REPO_DIR
reprepro createsymlinks
reprepro export

for DEB in `find $REPO_DIR/debian/ -name "*.deb" -type f`; do
    echo "Adding $DEB"
    reprepro -b $REPO_DIR includedeb "$RELEASE_NAME" "$DEB"
done

reprepro bietet auch noch weitere Parameter und Optionen.

Verzeichnis-Index erzeugen

Dieser Schritt ist optional und erfordert die Programme treeund find (apt install -y tree findutils). tree kann Verzeichnislisten im HTML Format erstellen, find wird genutzt um tree rekursiv auszuführen:

find . -type d -print -exec sh -c 'tree "$0" -H "." -L 1 --noreport --houtro "" --dirsfirst --charset utf-8 -I "index.html" --timefmt "%d-%b-%Y %H:%M" -s -D -o "$0/index.html"' {} \;

Bereitstellung im Web - Beispiel für GitLab

Dieses einfache Beispiel erzeugt ein Debian-Repository auf GitLab Pages.

# This collects all *.deb files from the workdir and creates the package index
packages:
  stage: deploy
  image: debian:bookworm
  artifacts:
    paths:
      - repo
  before_script:
    - apt-get update
    - apt-get install -y dpkg-dev tree findutils
  script:
    - mkdir -p repo/debian
    - find . -name '*.deb' -print -exec cp {} repo/debian/ \;
    - cd repo
    - find . -type d -print -exec sh -c 'tree "$0" -H "." -L 1 --noreport --houtro "" --dirsfirst --charset utf-8 -I "index.html" --timefmt "%d-%b-%Y %H:%M" -s -D -o "$0/index.html"' {} \;
    - dpkg-scanpackages -m debian /dev/null | gzip -9c > debian/Packages.gz

# This depends on the artifacts of the `packages` step and deploys them on GitLab pages
pages:
  stage: deploy
  needs:
    - packages
  script:
    - mkdir -p public
    - cp -r repo/debian public/
  artifacts:
    paths:
      - public