Buddy Rsync Transfer

sascha fuchs
webdevs.xyz
Published in
3 min readFeb 9, 2017

Ich bin seit kurzem von Codeship auf Buddy umgestiegen, besser gesagt ich bin noch am wechseln. Ein für mich richtig störender Aspekt ist der Dateitransfer nach dem Build. FTP, SFTP oder FTPS sind zwar allbewährte Methoden, aber auch recht stumpf, es wird eben alles überschrieben, was vom Datum her älter ist. Was bei einer größeren Anzahl an Dateien recht langwierig werden kann.

So hat mich der Dateitransfer mit Codeship 7 Sekunden gekostet, während ich bei Buddy dann 12 Minuten warten konnte. Meine Git Repos können recht groß werden, wenn ich z.B. Craft Seiten Maintaine, da ich die Plugins mitschleppe (da man aktuell die Plugins nicht über das Backend updaten kann, läuft das über den Build Prozess). Heißt im Klartext, je mehr Files man neu generiert desto mehr wird es zum Problem mit FTP.

Wer kleine Repos per Deploy auf den Server schickt, oder sich die Anzahl der Deploys in Grenzen hält, dann wird das nicht so das Problem. Aber wir wissen alle wie es ist. Irgendwann kommt der Tag das muss ein Feature so schnell wie möglich auf den Server, vielleicht ein dringender Hotfix, da will man nicht „ewig“ drauf warten. Außerdem hat es mich gestört und das gewaltig, Rsync muss her! (╯°□°)╯︵ ┻━┻

Da Buddy keine Rsync Transfer Option anbietet (jedenfalls noch nicht) müssen wir uns eine Basteln. Als erstes generieren wir uns mit dem ssh-keygen auf unserem eigenen System ein neues SSH Keypair. Den Public Key können wir danach auch gleich auf den Zielserver unter den authorized_keys notieren, dann wäre der Part schon abgeschlossen.

Jetzt gehen wir bei Buddy ins das entsprechende Projekt unter die Project-Options und dort in die Environment Variables.

Bei den SSH Keys übertragen wir jetzt unseren Private Key (einfach alles in das SSH Key Feld übertragen), als Namen verwenden wir einfach id_rsa - das gilt als Default Key Name, damit ersparen wir uns das Notieren beim Rsync Aufruf.

Bevor wir hier rausspringen definieren wir noch ein paar Environment Variablen — die wir dann an den Aufruf hängen, so können wir die Pipeline in anderen Projekten wieder verwenden.

  • sshUser Euer SSH Nutzername
  • sshHost SSH Hostname eures Webservers
  • sshPath SSH Target Path
  • sshCopydir Das Verzeichnis aus dem aus alles übertragen wird

Kurz Speichern und wieder in die Pipeline. Statt eines FTP Transfers picken wir uns einen Ubuntu Server als New Action heraus, damit bauen wir die Rsync Verbindung auf. Das ganze ist relativ schmerzfrei.

Unter Packages & Setup Commands müsst ihr einmal rsync und openssh-client installieren.

apt-get update -y && apt-get install -y rsync openssh-client

Unter Run Command kommt dann der Rsync Aufruf (mit den Environment Variablen.

rsync -v -avz -e "ssh -o StrictHostKeyChecking=no" ${sshCopydir} ${sshUser}@${sshHost}:${sshPath}

Wenn alles klappt sollte euer nächster Build dann wesentlich schneller fertig sein. Ich persönlich bin mehr als zufrieden. Von 12 Minuten FTP Transfer auf 7 Sekunden mit Rsync \o/

--

--

sascha fuchs
webdevs.xyz

Software Engineer, Nerd, Code Yoda, Gamer, Star Wars Geek