Door Koen Vervloesem

Freelanceredacteur

Linux-services packagen met Snap

Aan de slag met Canonicals pakketformaat

14-09-2022 • 06:00

92

Singlepage-opmaak

Recept om je software te bouwen

Daarna komen in je YAML-bestand sleutelparts waarin je opgeeft op basis van welke stukjes code je pakket wordt opgebouwd. De snap voor Theengs Gateway bestaat uit twee onderdelen:

parts:
  theengs-gateway:
    plugin: python
    source: https://github.com/theengs/gateway.git
    source-commit: 085eb4753fdd4fab2ceb2453af19a64ad984eabb  # Temporary workaround
    override-pull: |
      craftctl default
      sed -i "s/version_tag/$SNAPCRAFT_PROJECT_VERSION/g" $CRAFT_PART_SRC/setup.py
      rm $SNAPCRAFT_PART_SRC/pyproject.toml  # Use pre-built system-site requirements
    build-packages:
      - build-essential
      - python3-skbuild
    build-environment:
      - PARTS_PYTHON_VENV_ARGS: "--system-site-packages"
    stage-packages:
      - bluez  # Needed by Bleak for the bluetoothctl command
  scripts:
    plugin: dump
    source: scripts

We maken eerst een part 'theengs-gateway' aan waarin we Theengs Gateway bouwen op basis van de broncode. Het bouwen van onderdelen van een snap gebeurt in vier stappen: pull, build, stage en prime.

In de eerste stap 'pull', downloadt Snapcraft de code. We geven hier als bron voor de code de GitHub-repository op. Normaal geef je met source-tag een specifieke tag op die je wilt bouwen, maar omdat we Theengs Gateway hebben moeten aanpassen om in de snap te kunnen draaien en er nog geen nieuwe release uit is, verwijzen we hier met source-commit naar de specifieke commit. Snapcraft downloadt standaard ook alle submodules van een Git-repository. Dat is handig hier, omdat Theengs Gateway de repository van Theengs Decoder als submodule heeft.

Met override-pull kunnen we deze stap aanpassen. Als eerste opdracht in de stap zetten we snapcraftctl pull, wat betekent dat de stap gewoon gebeurt zoals normaal. Daarna voegen we een opdracht toe om met sed het versienummer in setup.py in te stellen. We gebruiken hier omgevingsvariabelen voor het versienummer dat we in de metadata hebben gedefinieerd en voor de locatie van setup.py. Tot slot verwijderen we pyproject.toml omdat deze build dependency’s bevat die we op de armhf-architectuur niet gebouwd kregen.

Je kunt in je Snapcraft-stappen enkele omgevingsvariabelen gebruiken.
Je kunt in je Snapcraft-stappen enkele omgevingsvariabelen gebruiken.

In de volgende stap wordt het onderdeel gebouwd. De belangrijkste parameter hiervoor is de plug-in die het bouwproces beheert. Snapcraft kent diverse plug-ins, bijvoorbeeld voor buildtools zoals autotools, cmake, qmake en make, en voor programmeertalen zoals Python, Go en Rust. Theengs Gateway is Python-software met een buildscript setup.py, en de Python-plug-in kan dit dus bouwen.

Omdat Theengs Gateway in zijn submodule Theengs Decoder een C-bibliotheek moet bouwen, hebben we ook een compiler nodig. Die buildtimeafhankelijkheid duiden we in build-packages aan: we installeren build-essential vóór het bouwen, en ook python3-skbuild omdat dit de afhankelijkheden bevat die in pyproject.toml stonden. En in build-environment specificeren we omgevingsvariabelen in de buildstap. In dit geval zorgen we hiermee dat Python de systeempakketten, waaronder python3-skbuild, gebruikt in zijn virtuele omgeving.

In de stap 'stage' worden de bestanden van het gebouwde onderdeel in de stagingarea geplaatst, waar alle onderdelen bij elkaar komen. Omdat de Python-bibliotheek Bleak die gebruikt wordt door Theengs Gateway het programma bluetoothctl nodig heeft, geven we in stage-packages aan dat het pakket bluez, dat dit programma bevat, in de snap geïnstalleerd moet worden.

Er is nog een laatste stap, prime, die op stage lijkt, maar waarin je nog bestanden kunt opruimen. Daarvan maken we hier geen gebruik.