mysql-parse og hamstr, to brukervennlege terminalprogram

Her om dagen kasta eg meg ut i det og lagde to kommandolinjeprogram, mysql-parse og hamstr. Begge er inspirert av reelle utfordringer eg har møtt i min arbeidskvardag ved Netlife Bergen. Problemet handler om at det burde vere lett å laste ned ein databasekopi.

Når me hopper fra ein kodebase til ein annen så har me ofte ein produksjonsserver med kundedata, som me trenger å kopiere ned for å kunne videreutvikle lokalt.

Det er ikkje vanskeleg å hente ned ein databasekopi, men prosessen inneheld gjerne nokre manuelle steg før du får starta nedlastingen. Og da er det fort nokre snubletråder som kan dukke opp. I sum, er dette ein tidstyv.

I Netlife bruker me skytenesta Heroku som plattform for mange av våre tenester. Heroku leverer også eit kommandolinjeprogram der du kan køyre heroku config for å hente ned konfigurasjonen til ein applikasjon.

heroku config:get DATABASE_URL gir deg til dømes ein tilkoplingsurl (ei slags nettaddresse) til applikasjonsdatabasen der brukernavn, passord og databasenavn er innebakt. Men! Problemet er at det er ikkje berre å mate denne teksten til mysqldump kommandoen som tar seg av sjølve nedlastingen. Ein må ganske manuelt bryte tilkoplingsurlen opp i parameterar som gis til mysqldump. Eit manuelt og kjedelig steg.

«Dette må det jo vere lagd ei løysing på,» tenkte eg.

Eg søkte vidt og bredt etter løysinger. Men eg fann ikkje ei løysing som låg klart i dagen. Ein kollega hadde ein kodesnutt liggande på ein gammel laptop. Det var litt hjelp i det, men eg ville ha ei løysing som var lett å installere. Et voilà, mysql-parse, denne kommandoen tar ein tilkoplingsurl og bryter den opp i parameterar som mysqldump aksepterer. Verken meir eller mindre.

Det var viktig for meg at kommandoen ikkje skulle gape over for mykje, men faktisk berre møte det uløste behovet.

# Tro det eller ei, men dette er ekte utviklerergonomi.
$ mysqldump $(mysql-parse $(heroku config:get DATABASE_URL)) > prod-copy.sql

Denne kommandoen vil nå kunne være ein standardisert nedlastningskommando for mange av våre løysinger.

HAMSTR: mysqldump + tunnel

I tillegg til problemet beskrevet over så var det også eit beslekta problem. Ikkje alle serverar lar deg få kommunisere direkte med databasen som bor inni den. Om du prøver å logge deg inn i databasen utenfor serveren så hjelper det lite sjølv om du har riktig innlogging, serveren lar ikkje databasen få svare på hendvendelser som kjem «frå utsida.»

Standardløysinga på dette er å opprette ein SSH tunnel inn i serveren som lar deg kommunisere med den eksterne databasen som om databasen kjørte lokalt på din maskin. Da har du gjerne to kommandoer og to passord å holde styr på.

# Oppretting av ssh tunnel, krev eige passord
ssh -N -L 127.0.0.1:3306:127.0.0.1:3306 username@someserver.no

# mysqldump kommandoen slik den ofte skrives i dag, krev eige passord.
mysqldump -u username -psomepassword -h 127.0.0.1 -P 3306 dbname > prod-copy.sql

For å gjere nedlastingsprosessen lettare så har me lagd hjelpekodesnutter som bor i mange av våre prosjekter, deriblant craft-starteren vår som mange av våre prosjekter bygges på (se package.json for mer om kodesnuttene). Men desse hjelpekodesnuttene har vist seg å vere eit uintuitivt plaster på eit brukervennlighetsproblem.

Dette burde vere lettare.

Så, etter å ha brukt ein kveld på mysql-parse så brukte eg den påfølgande dagen på å mekke hamstr. Nå kan me gjere slik.

# Laster ned produksjonsdatabasen definert i ein  konfigurasjonsfil
# som bor lokalt på pcen.
$ hamstr mysqldump --tunnel prod

Hamstr bygger på mysql-parse og tar i bruk mysqldump kommandoen internt. Nøkkelfinnessen er at kommandoen kan sømløst opprette ein ssh tunnel mot serveren før den går i gang med nedlastningen. Videre kan du definere ubegrenset antall nedlastbare databaser med og uten behov for tunnelering.

PS. Dersom du er ein programmererer med sans for å gjere din, dine kolleger sin og kundene sin arbeidskvardag meir brukervennleg, vurder gjerne Netlife som arbeidsplass.