Show notes
Remote-Episode mit Flo von Codeship.io über Serverautomatisierung und UXUnser Gast (00:00:00)Florian MotlikCTO und Co-Founder von https://codeship.ioCodeship ist ein Continuous Integration/Deployment ServiceIst 2011 als Neben-dem-Studium-Projekt gestartet2012 dann die Entscheidung das ganze Vollzeit zu verfolgen: Studium hinschmeißen und alle ziehen nach BerlinNach Berlin dann 2013 nach BostonHauptsitz in Boston und ein Büro WienWachsen erstmal "nur" vor Ort in Boston/Wien, Remote erst später; Ziel: gesunder WachstumUsability ist wichtig (00:05:45)Usability war von Anfang im FokusGeführter Einstieg in das Produkt und FeaturesNoch vor der Anmeldung eines Nutzers sollen Screencasts und Blogposts Interessenten in die Thematik einführenBei Anmeldung weiß man dann schon im Grunde worum es geht und kann schneller startenTour durch Codeship.io (00:10:46)Erster Schritt: Anmeldung über GitHub (https://github.com/) oder Bitbucket (https://bitbucket.org/)Anschließend die Wahl des RepositoriesEinrichtung der Test-Befehle, dazu gibt Templates für die unterschiedlichsten Sprachen und UmgebungenSolange der Exit-Status eines Befehls 0 ist wird der nächste Schritt ausgeführtNach dem Testing kommt das DeploymentAuch hier lässt sich aus fertigen Anbindungen wählen, oder ein eigenes Skript wird verwendetDas Deployment ist dabei eher als Pipeline zu verstehen:Deploye erst auf StagingLasse dann gegen Staging einige Tests laufenDeploye dann auf ProduktionPrüfe auch hier mit einem SkriptAm Ende des Tages kann Ablauf beliebig komplex oder sehr einfach sein, was immer gebraucht wirdGenauso wird im übrigen auch Codeship selbst getestet und deployed"Eat your own dog food" ist vor allem für Developer-Produkte extrem wichtigInfrastruktur (00:14:10)Website läuft auf Heroku (https://www.heroku.com/home)Sidekiq (http://sidekiq.org/) als Worker Queue mit externem Redis (https://openredis.com/)Die interessanten Dinge passieren bei AWS (https://aws.amazon.com/): Die Ausführung der JobsZu AWS ist man von Hetzner über Rackspace gekommen. Die Erklärung warum haben wir dann später leider vergessen zu erwähnen :/AWS-SetupEigenes Auto-Scaling: Mehr Builds -> mehr ServerDie größten Compute-Instanzen (c3.8xlarge) als Basis, Unterteilung mit LXC (https://linuxcontainers.org/)Ein Container mit einem vollständigen Ubuntu inkl. aller möglichen AbhängigkeitenLearning 1: Container eignen sich besser als dedizierte kleine Maschinen, weil mehr Speicher und CPULearning 2: Einfach alles hochfahren treibt den Speicherverbrauch hoch, macht aber das Handling sehr viel leichterJeder Push auf das Repo erzeugt eine neue virtuelle Maschine auf der man im Grunde tun und lassen kann was man willEs gibt aus Sicherheitsgründen kein sudoEs lässt sich alles nach installieren was ohne sudo gehtEs sind die gängigen Sprachen in unzähligen Versionen enthalten + HaskellDas gleiche gilt für DatenbankenSupport ist sehr wichtigEin Dienst für Developer fordert Developer als Support, daher muss jeder Entwickler auch einen Tag Support machen und zwar 7 Tage die WocheEs gibt einen Cache-Layer (wo zum Beispiel auch Rubygems gecached werden) in den sich eigene Erzeugnisse ebenfalls cachen lassenBuild-Artefakte (00:20:50)Keine Integration in Codeship: Build-Artefakte müssen per Skript woanders hinkopiert werdenHintergrund: Nach jedem Build wird der Container vollständig zerstörtDeployment muss kein "Deployment" auf einen Server sein, sondern kann auch ein Script sein, welches z.B. Artefakte auf S3 kopiertvon Codeship vordefinierte Deployments sind vorgefertigte Abläufe, machen aber sonst nichts speziellesim Wesentlichen gibt es keine Unterscheidung zwischen Setup, Test und Deploymentphasen: Es werden lediglich Kommandos ausgeführtIm Environment werden alle möglichen Informationen exportiertEin spezieller Schutz für "geheime" Informationen (wie Access Keys) können aktuell noch nicht verschlüsselt in die Build-Umgebung gereicht werdenPrivate Installations (00:28:10)Konkrete Pläne gibt es für On-Premise Installationen gibt es aktuell nichtCodeship will sich nicht in Unternehmen rein verkaufen, sondern die Teams sollen Codeship haben wollenServer in der EU und Datenschutz? (00:31:30)Aktuell benutzt Codeship AWS EC2 Instanzen in us-eastInstanzen in der EU werden irgendwann wichtig sein (Datenschutzgesetz und auch Ausfallsicherheit)Aber: Die Kunden haben aktuell ihren Code ohnehin auf Github oder Bitbucket, und deren Code liegt dann ohnehin nicht in der EUProduktentwicklung & Fokus behalten (00:33:45)Wie behält man den Fokus bei der Entwicklung?Der Fokus war bei Codeship notwendig, weil Flo der einzige Entwickler warTech-only Start-Ups "bauen sich gerne in den Markt", was nicht funktioniertBlogposts und Screencast (00:37:30)20% der Entwicklerzeit geht in Marketing: z.B. Blogposts und ScreencastsDer Aufwand für einen Blogpost: 4-8 Stunden, wenn man nicht zu viel Research machen muss...und bei Screencasts: Aufnahme 2-3 Stunden, Schneiden noch mal 1-1,5 TageAuch in den 20%: Meetups organisieren, Konferenzbesuche, User Groups...Flo's Pro Tip: Sticker!!!Hosting bei Heroku (00:42:40)Codeship selber läuft auf Heroku mit 8 Add-OnsPostgres: https://addons.heroku.com/heroku-postgresql#premium-ikaLogentries: https://addons.heroku.com/logentriesNew Relic: https://addons.heroku.com/newrelicNew Relic Alternative: Skylight: https://www.skylight.io/Pricing bei Codeship (00:49:15)Codeship Preise: https://codeship.io/pricingKostenfrei (keine: 50 Builds, ein Concurrent Build49 USD: ein Concurrent Build, sonst keine Limitsje 50 USD mehr, +1 Concurrent BuildAWS (00:51:50)EC2 Reserved Instances: https://aws.amazon.com/ec2/purchasing-options/reserved-instances/AWS Trusted Advisor: https://aws.amazon.com/premiumsupport/trustedadvisor/Immutable Servers (00:54:40)Server sind immutableServer werden gebaut mit Packer (http://www.packer.io/)Aus einer JSON Konfiguration und Skripten zur Provisionierung wird eine Amazon Machine Image (AMI) erstelltWorklfow bei Codeship.io:Code-Änderungen auf GitHubAutomatische TestsErstellung des AMI (Laufzeit ~ 90 Minuten)Austausch eines AMIAlte Server werden ausgemacht wenn keine Jobs mehr laufenScaling-System fährt nur noch neue Maschinen hochWichtig: Laufende Server werden nicht mehr angefasst!Vorteil:Alle Server sind immer gleichServer sind getestet bevor ein AMI überhaupt gebaut wirdZiel bei der Automatisierung: Fokus der Entwickler auf die Entwicklung, alles nach dem Push muss automatisch geschehenAutomatisierung (01:00:56)Weiteres wichtiges Tool ist Librato (https://metrics.librato.com/) zur Erfassung und Auswertung von sämtlichen DatenNeben Betriebsdaten von Heroku und Amazon laufen dort auch Businessdaten reinAlerts auf unterschiedlichen EbenenWenn was ist, dann wird man benachrichtigtÜber Health-Checks werden sogar die Build-Server automatisch deaktiviert und neue Instanzen hochgefahrenWenn alles automatisiert ist, dann können sich die Entwickler stärker auf ihre Arbeit konzentrierenKeine dedizierte Ops-Abteilung, sondern gute Sys-Admins, die in die Entwicklungsabteilung und deren Prozesse integriert sind (aka: DevOps)Am Ende haben alle Beteiligten (Frontend, Backend, Ops) den gleichen WorkflowWie kommen auf die Jobs auf die Build-Server (01:05:00)Auf jedem Build-Server läuft ein Sidekiq-JobDie Web-App schiebt neue Jobs in die QueueDie Build-Server schieben Ergebnisse zur Anzeige auf der Webseite auch wieder in eine QueueSidekiq-Pro kommt zum EinsatzProvisionierung der LXC-Container (01:08:12)Provisionierung via BashAktuelles Projekt: Migration auf Ansible (http://www.ansible.com/home)Ansible erscheint für die Anforderungen als die sinnvollste LösungTrotz LXC ist Docker (http://www.docker.com/) aktuell keine AlternativeFrüher oder später werden sie auf Docker umstellen, da es sich als das Tooling für LXC entwickeltAktuell würde es aber mehr Arbeit machen als Benefit bringenUX (01:12:59)Die Komplexität liegt bei Codeship.io in der Feinabstimmung aller beteiligten KomponentenTechnisch ist es kein HexenwerkWie bereits mehrfach angesprochen: UI/UX war und ist eine der großen HerausforderungenDaher: Dedizierte Menschen, die sich um dieses Thema kümmernInterviews mit KundenUser-Tracking spielt auch eine wichtige RolleKommunikation mit den Usern über Intercom (https://www.intercom.io/)grundsätzlicher SupportAuf Basis von Metriken Identifikation von möglichen Problemen bei KundenIn der UI werden unterschiedliche Fehler unterschieden: Bundle Install, Tests nicht gelaufen, etcMatching der Fehlermeldung auf Reguläre AusdrückeNicht nur die Fehlermeldung sondern entsprechender Hinweis auf die FehlerursacheNext-Steps: Unterschiedliche Benachrichtigungen für unterschiedliche Fehlertypen

