Samuel Dirksz

System · Internt

PyRunner-integrasjonen

Internt verktøy

Automatiseringsverten min tar imot én flat Python-fil per skript. Ingen mapper, ingen argumenter, ingen delt kode. Dette er hvordan tjue skript med felles bibliotek likevel kjører der.

Fakta

Status
I daglig bruk, ikke et produkt
Stack
Python · MCP · httpx
Verten
PyRunner, selvhostet. Tredjepart, ikke mitt.
Skript i drift
Rundt tjue
Nøkler
I vertens hemmelighetslager, aldri i en samtale

Begrensningen

Verten er enkel med vilje, og det er stort sett en fordel. Ett skript er én fil. Pakker installeres per skript. Hemmeligheter sprøytes inn som miljøvariabler. Planlegging er cron, uten mulighet for å sende inn parametre.

Det fungerer fint til ett skript. Ved skript nummer åtte hadde jeg den samme funksjonen for å matche merkevarenavn limt inn fem steder, i fem litt ulike versjoner. Det er slik man får feil som bare rammer én kunde.

Kildepakkeren

Løsningen ble et lite verktøy som flater ut et helt prosjekt til én fil. Det leser hovedskriptet og de delte modulene, og legger hver modul inn som en ferdig registrert oppføring før den første importen kjøres. Importsetningene i koden trenger ikke å endres.

Resultatet er én fil som oppfører seg nøyaktig som prosjektet gjorde lokalt, med samme kommandolinjeflagg. Jeg utvikler i et vanlig flerfilsprosjekt med tester, og pakker det ned først når det skal opp.

Skallet mellom cron og kommandolinje

Planlagte kjøringer kan ikke sende argumenter, men de kan sette miljøvariabler. Så skallet oversetter: en variabel med merkevarenavn blir til flagget skriptet allerede forstår, det samme med grenser, tørrkjøring og datoperioder.

Det betyr at det samme skriptet kjører identisk når jeg tester det på maskinen min og når det går klokka seks om morgenen. Jeg slipper en egen sti for produksjon, som er stien man aldri får testet.

Nøkler som aldri havner i en samtale

Verten svarer på en webhook med at jobben er lagt i kø, ikke med resultatet. Så skriptene skriver til et datalager, og den som spurte leser derfra. Datalageret er i praksis en asynkron resultatbuss.

Tilgangen til det går gjennom en liten MCP-server der API-nøkkelen ligger i serverens eget oppsett. Jeg kan be om et resultat uten at nøkkelen noen gang blir en del av samtalen. Det kom etter at en av ferdighetene mine hadde en nøkkel skrevet rett inn i seg, og den nøkkelen ble utdatert uten at noe sa fra.

Hver ferdighet kjenner nå bare én adresse. Alt annet henter den derfra ved oppstart.

Hva dette ikke er

Selve verten er ikke mitt arbeid. Den er et selvhostet tredjepartsprodukt. Det jeg har bygget er integrasjonen rundt, og den finnes bare fordi verten har de begrensningene den har.

Det er personlig infrastruktur. Ingen testdekning å snakke om, ingen overvåking av selve pakkeren, og dokumentasjonen er notater til meg selv. Skulle noen andre overta i morgen, ville de brukt en dag på å forstå den.

Et ekte køsystem ville løst dette penere. Jeg valgte å bygge rundt begrensningen i stedet for å bytte plattform, fordi bytte koster mer enn skallet gjorde.

Tilbake til oversikten