's Picture

My way is the highway

Postad av Pär Strindevall under fastlane, objective-c, ios development, travis, app development

Illusionen

Man skulle kunna tro att Expressens utvecklingsavdelning bygger Expressens digitala produkter. Det är egentligen bara en del av sanningen då vi även bygger GTs och KvPs digitala produkter. Teamet jag tillhör, Device, tillhandahåller sammanlagt tio appar till plattformarna iOS, tvOS och Android. För iOS har vi gjort utveckligen enklare genom att basera allt som apparna har gemensamt på samma kodbas och vid app-uppdateringar skapa nya releaser av kodbasen. Denna kodbas tillsammans med det som är specifikt för varje applikation mynnar sedan ut i olika targets vilket byggs till binärer som sedan distribueras.

Kodbasflödet
Kodbasflödet

Att modularisera på det här viset gör utvecklingsprocessen än drägligare men när vi bygger fler appar samtidigt blir distributionen en avsevärd flaskhals. Att lansera en av dem manuellt kan ta en halv dag och om man ska lansera alla var annan vecka behöver en utvecklare i värsta fall spendera halva sin arbetstid på enbart lansering. Det luktar oacceptabelt på flera mils avstånd så vi löste det med magi i stället.

Magi

Okej, nej, det är inte magi. Även om vi faktiskt råkar vara trollkarlar så valde vi att lösa problemet med automatisering. Alla iOS-utvecklare i hela kosmos har bråkat med provisioning profiles, certifikat och iTunes Connect. I Xcode (det vanligaste IDE man använder för utveckling till iOS) finns en ökänd knapp med etiketten Fix Issue som dyker upp när den känner för det.

Den ökända knappen
Den ökända knappen

Den är ökänd för att den gör raka motsatsen till funktionaliteten den indikerar. Klicka aldrig på den. Titta inte ens på den. Hitta närmaste nödutgång (Cancel-knappen eller i värsta fall ⌘ + Q) och lös problemet i stället.

I stället för att rusta en generell krisberedskap, lösa en miljard olika problem (strul med provisioning profiles, utdaterade eller obefintliga certifikat, etc) för hand och över lag sänka vår produktivitet under distribution har vi letat efter ett verktyg som fungerar med vår befintliga utrustning.

Sedan tidigare använder vi en uppsättning verktyg som bland annat består av:

När vi ska testa tillskott i vår kodbas bygger vi appen och distribuerar den genom Crashlytics för intern testning. Det är en tjänst som Twitter tillhandahåller och det är även hit vi får rapporter om krascher när något går fel.

Travis CI är ett continuous integration-verktyg. Varje gång vi skapar en pull request på GitHub, commitar till vår huvud-branch eller skapar en release bygger Travis åt oss och kör våra tester så att vi kan sova bättre om nätterna och mergea om Travis ger oss tummen upp. Travis skickar även binärer till Crashlytics så att vi kan testa bygget skarpt på ett smidigt sätt.

På gatan beskrivs Slack ofta som dagens IRC. Vi använder Slack för all kommunikation som inte sker ögon emellan och snålar inte med kanaler vi stoppar botar i som skriker när saker vi är intresserade av händer.

CocoaPods är en modulhanterare vi använder för de moduler från första och trejde part vi använder i våra appar.

Expressenutvecklaren utvecklar testdrivet och Codecov petar på oss när vi glömmer att testa kod. Codecov körs automatiskt tillsammans med Travis när vi skapar en pull request och med rätt plugin i din webbläsare visar den tydligt var som är testat och vad som kan bli bättre.

Ett krav på vårt påtänkta distributionsflöde var att det skulle fungera med våra befintliga verktyg.

Vänsterfilen

Lösningen vi fastnade för heter Fastlane.

Fastlane är inte bara ett verktyg. Fastlane är också en svit av verktyg som var och en löser ett väldigt specifikt problem. Bökigt att fixa rätt provisioning profiles? Använd sigh. Jobbigt med att skapa och underhålla kodsigneringscertifikat? Kör cert. Vissa av dessa verktyg har vi intregrerat i vårt distributionsflöde innan vi knöt ihop säcken med paraplyverktyget Fastlane.

Fastlane tillåter att man konfigurarar olika flöden, så kallade lanes, som var och en anropar vad de behöver för att utföra det man skapat dem för. Idag har vi följande lanes:

Travis är den lane som används vid automatiska byggen. Dessa triggas av att vi skapar en pull request eller gör en kodbasrelease. Denna lane anropar i sin tur en av de andra beroende på vilken branch man gör pull request på eller om bygget triggades av en kodbadrelease. Vid en kodbasrelease förbereder vi först en lansering i iTunes Connect och låter Travis med hjälp av Fastlane bygga med rätt konfiguration och ladda upp binären.

Test Or Build testar bygget om det är Expressen-appen som byggs. Annars bygger den bara appen. Detta för att våran svit av tester är kopplat till Expressen-appen.

In-house använder vi för att skicka binärer till Crashlytics för att distribuera för intern testning.

App Store använder vi för att ladda upp binärer till App Store så att vi kan lansera eller testa genom Test Flight.

Det som tidigare kunde ta en halv dag att göra är nu så enkelt som att plocka fram sin främsta terminalemulator och köra:

$ fastlane upload_appstore

Har man glömt att skapa en release skrivs följande ut i Slack:

Oh no!
Oh no!

Om allting går bra ser det ut så här:

Success!
Success!

Produkt

Distributionsflödet är inte ett projekt. Precis som våra appar är flödet en produkt. Det blir aldrig klart och förändras ständigt då vi hela tiden kommer på saker vi vill förbättra. Många byggen gör att Travis blir en flaskhals då han ständigt har så mycket att göra och minst sagt inte alltid presterar optimalt. Codecov visar hur mycket av koden vi testar men vi saknar fler analysverktyg som OCLint och data som rader kod över tid så att vi kan se om vår kodbas växer sig olämpligt stor. Vi gör hela tiden avvägningar för att spara tid genom att optimera flöden. Den sparade tiden blir till spännande funktionalitet i vår flora av appar och ibland ett blogginlägg eller två. Det tar dock lite väl lång tid så nästa gång kör vi nog bara:

$ fastlane blogpost

Toppbild: Henrik Schnabel från Flickr (CC)

PS. Missa inte vår nästa bloggpost, följ oss på Twitter!

Till startsidan