În această serie de tutori vom explora un proces discutat foarte rar (dar foarte valoros) de dezvoltare a unui software care este dezamăgitor de absent în lumea iOS și mobil: Integrare continuă.
În partea a 1-a, am discutat conceptul de Integrare continuă și modul în care ne poate ajuta să dezvoltăm mai rapid software-ul. Partea a 2-a trecut prin instalarea Apache Tomcat, serverul web care rulează software-ul serverului nostru CI. În partea a treia, am instalat și configurat Hudson pentru a monitoriza proiectul nostru și pentru a începe procesul de construire ori de câte ori actualizăm depozitul nostru de proiecte. În partea a patra, am scris un script de bază care a compilat proiectul nostru și a generat un fișier IPA.
Chiar acum avem un scenariu de funcționare funcțional, dar putem face mult mai mult! Acest tutorial este puțin diferit de celelalte. În loc să vă treceți printr-o serie de pași, va fi o colecție de adăugări utile pe care le puteți adăuga la scenariul dvs. și, în funcție de circumstanțele dvs., puteți alege să le adăugați sau nu.
Scripturile Bash pot folosi funcții la fel ca alte limbi. Scripturile de construcție mari pot ajunge destul de mult, deci este important să o organizați cât mai mult posibil. Funcțiile reprezintă o modalitate excelentă de a face acest lucru.
Să punem tot codul nostru existent într-o funcție numită "buildApp". Deschideți scriptul și introduceți următorul cod:
function buildApp cod existent există aici
Pentru a apela funcția "buildApp", introduceți pur și simplu următoarele sub declarația funcției:
buildApp
Pe măsură ce adăugați mai multe funcționalități scriptului, le puteți plasa în funcții diferite, cum ar fi "distributeApp" sau "signApp".
Una dintre cele mai populare servicii pe care dezvoltatorii le utilizează pentru a-și testa aplicațiile este TestFlight. TestFlight este un serviciu online excelent (gratuit!) Care permite dezvoltatorilor să încarce cu ușurință IPA ad-hoc și TestFlight se ocupă de distribuție.
TestFlight oferă un API de încărcare pe care îl putem apela din scriptul nostru bash. Aceasta înseamnă că, de fiecare dată când finalizăm o construcție nouă, putem să o încărcăm imediat pentru a încerca zborul și să ne informăm pe testere că există o nouă construcție.
Mai întâi, asigurați-vă că aveți un cont și obțineți jetonul API și jetonul echipei. Odată ce acest lucru a fost făcut, adăugați cheia API și echipă în partea de sus a scriptului ca variabile.
În al doilea rând, trebuie să pregătim fișierul * .dysm pentru încărcare. Dacă nu vă aduceți aminte ce este fișierul * .dysm, consultați articolul 4 pentru o reîmprospătare. Fișierul * .dysm trebuie să fie ferm înainte de a putea fi încărcat la TestFlight sau Apple, deci este o idee bună să faceți acest lucru ca parte a procesului de construire.
Adăugați următorul cod după comanda "xcodebuild":
#zip fișier dYSM pentru distribuție cd "$ build_location / sym.root / $ configuration- $ sdk /" || "nu există un astfel de director" rm -f "$ appname.app.dSYM.zip" zip -r "$ appname.app.dSYM.zip" "$ appname.app.dSYM"
Codul de mai sus schimba pur și simplu directorul în locația fișierului * .dysm și elimină orice fișiere zip care ar fi existat înainte. Apoi, creează un ZIP al fișierului * .dysm.
După ce a fost adăugat, adăugați următoarea funcție în scriptul de construire:
Funcția deployToTestFlight / usr / bin / curl "http://testflightapp.com/api/builds.json" \ -F file = @ "$ build_location / $ appname.ipa" \ -F dsym = @ "$ build_location / sym .root / $ configuration- $ sdk / $ appname.app.dSYM.zip "\ -F api_token =" $ TESTFLIGHT_APIKEY "\ -F team_token =" $ TESTFLIGHT_TEAM "\ -F notes =" $ appname încărcat prin API-ul de încărcare testflight "-F notificare =" False "
Acum, dacă trebuie să vă deplasați la TestFlight, tot ce trebuie să faceți este să apelați funcția "deployToTestFlight" după ce a fost generată o construcție.
Pentru informații complete despre API-ul de upload al TestFlight, consultați https://testflightapp.com/api/doc/.
Uneori, este posibil să fie necesar să modificăm sau să citim valori din fișierul * .plist. De exemplu, am putea dori să stocăm versiuni pentru fiecare versiune a aplicației. Putem citi versiunea aplicației din fișierul PLIST și să o stocăm într-un dosar corespunzător. De asemenea, am putea dori să editați pictograma utilizată pentru o construcție specifică sau, uneori, pentru identificatorul pachetului.
Pentru a seta ID-ul pachetului (adică suprascrie valoarea inițială), comanda este:
/ usr / libexec / PlistBuddy -c "Set: CFBundleIdentifier $ bundle_id" Info.plist
După cum puteți vedea din imaginea de mai sus, "CFBundleIdentifier" este cheia pentru valoarea pachetului ID, așa că pur și simplu "setăm" $ bundle_id
valoarea este.
Dacă vrem să citim o valoare din PLIST și să o setăm ca variabilă în scenariul nostru, este puțin mai complicată. Trebuie să facem un pic de trickery:
app_version_number = $ (/ usr / libexec / PlistBuddy -c "Imprimare: CFBundleVersion" Info.plist)
Codul de mai sus din paranteze imprimă pur și simplu valoarea pentru "CFBundleVersion", iar scriptul bash captează această valoare ca variabilă și o atribuie variabilei "app_version_number".
În Xcode puteți utiliza diferite configurații pentru proiectul dvs. Fiecare configurație poate utiliza diferite setări de construire, opțiuni de semnare a codului, chiar compilați în mod diferit pe baza macrocomenzilor pre-procesoare. Deși crearea de noi configurații, ajustarea setărilor de construire și adăugarea macrocomenzilor pre-procesoare este dincolo de scopul acestui tutorial, vă pot arăta cum să le construiți.
Configurația implicită când construiți este "Release", dar acest lucru poate fi setat cu un steag special atunci când apelați comanda "xcodebuild".
În acest exemplu, avem o configurație numită "Testare". Pentru a construi pentru această configurație, ne adaptăm pur și simplu scriptul de construire bazat pe următoarele:
Configurație = "Testarea" xcodebuild -target "$ appname" -configurare "$ configuration" OBJROOT = "$ build_location / $ app_version / $ configuration / obj.root" SYMROOT =
Aici construim proiectul Xcode bazat pe o configurație specifică și îl punem în propriul dosar, împreună cu propriul număr de versiune (pe care îl putem obține accesând info.plist, a se vedea adăugarea 3).
Dacă lucrați pentru o organizație de dimensiuni medii sau mari, este posibil să utilizați mai mult de un certificat de dezvoltare / distribuție pentru a semna aplicațiile. Dacă nu aveți controlul asupra creării acestor certificate, există și o șansă ca toate certificatele să aibă numele companiei dvs. undeva în ea.
Aceasta este o problemă, deoarece brelocul nu permite semnarea unui certificat atunci când este "ambiguu". Din fericire, putem folosi comanda "securitate" pentru a adăuga și a șterge certificate în timpul procesului nostru de construire.
În primul rând, va trebui să exportați certificatele relevante și cheile lor private din cheia de breloc și să le adăugați în directorul de script-uri. Când exportați certificatul și cheia, brelocul vă va cere să introduceți o expresie de acces. Introduceți o expresie de acces și apoi salvați fișierul * .p12 în directorul de scripturi din depozitul dvs. Setați fișierul * .p12 ca nume de variabil în scriptul dvs..
În al doilea rând, ștergeți toate certificatele de pe serverul de construcție care ar putea intra în conflict cu certificatul de utilizat.
În cele din urmă, adăugați următoarea linie pentru a importa certificatul:
import de securitate "$ WORKSPACE / Scripts / $ CERTIFICATE_FILE.p12" -P "$ password" -A -k ~ / Bibliotecă / Brelocuri / login.keychain
Această linie importă * .p12 desemnat în cheia de introducere a cheii de conectare folosind parola "$ password".
După ce ați terminat construirea, eliminați-o din chenar ca:
certificat de ștergere de securitate -c "$ certificate"
Folosind metoda de mai sus, puteți să vă construiți aplicația de mai multe ori folosind mai multe certificate care altfel ar fi fost ambigue între ele.
În timp ce acestea sunt adăugiri utile pentru orice script de construire, vor exista întotdeauna căi specifice care vă pot face să funcționeze mai bine pentru dvs. Am făcut tot posibilul pentru a vă învăța elementele de bază și pentru a oferi o fundație suficientă pentru a avea o bază solidă pe care să experimentați și să vă dezvoltați în continuare.
Un script care conține toți pașii descriși mai sus poate fi găsit la adresa https://gist.github.com/1404526
Sper că vă bucurați de această serie de tutori și că sunteți capabil să implementați procesele CI și automate în fluxul de lucru pentru dezvoltare. Poate aveți multe lumini de construcție albastră! :)