Continuous Integration untuk pengembangan iOS app dengan jenkins dan xcpretty
Dalam pengembangan iOS app saat, untuk kebutuhan Continuous Integration (CI), sebetulnya sudah ada support native dari Apple yang terintegrasi di dalam XCode IDE dan XCode Server. Tapi dalam percobaan kami banyak hal yang masih membuat solusi yang diberikan Apple tersebut belum cukup nyaman untuk dipakai, terutama untuk developer yang membutuhkan fleksibilitas. Salah satu isu penting adalah minimnya, bahkan hampir tidak ada, integrasi dengan Cocoapods yang merupakan package manager yang banyak dipakai developer.
Karena itu kami kembali menggunakan jenkins. Dan untuk membuat XCode bisa bekerjasama denhan baik dengan alur kerja jenkins, kami menggunakan beberapa fiture dari xcpretty untuk hal tersebut seperti akan diterangkan di bawah nanti.
Sekilas tentang XCPretty
XCPretty adalah tools untuk membuat keluaran dari xcodebuild (XCode command line tool) lebih nyaman di lihat dan memungkinkan untuk di export dalam format yang bisa diproses dengan tool lain. Ini memungkinkan hasil eksekusi di xcodebuild bisa di parse dan ditampilkan di tools seperti Jenkins.
Persiapan awal
Sebagai persiapan awal, kebutuhan di bawah ini perlu dipasang dan disiapkan di CI server :
- XCode
- Cocoapods
- XCPretty
Setelah repository dan trigger untuk build sudah disiapkan, kita bisa siapkan task-task berikutnya di Jenkins.
Pre-build : install paket yang dibutuhkan dengan cocoapods
Tambahkan task pod install berikut untuk mengunduh semua paket yang dibutuhkan project
[code lang=text]export LANG=en_US.UTF-8pod install — verboserm -f build/reports/junit.xml[/code]
Pembersihan dan eksekusi build
Kita bersihkan dulu sisa build sebelumnya untuk menjamin kebersihan workspace. Kita pipe ke xcpretty agar tampilan di log displaynya juga lebih mudah/nyaman dibaca
[code lang=text]/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -workspace myproject.xcworkspace-scheme myscheme clean | xcpretty -c[/code]
lalu akhirnya eksekusi build dan menjalankan test dengan task di bawah :
[code lang=text]/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -workspace myproject.xcworkspace-scheme myscheme-sdk iphonesimulator-destination ‘platform=iOS Simulator,name=iPhone 6s,OS=9.0’ test | xcpretty -c -r junit[/code]
task di atas selain membuat tampilan log enak dilihat juga mengeluarkan output dalam format junit yang nanti bisa diparse oleh Jenkins
Post-build : parse hasil test untuk ditampilkan di jenkins
Akhirnya, tambahkan post-build task Publish JUnit Test Result untuk mem-parse hasil keluaran test ke tampilan hasil build dengan output path di bawah.
[code lang=text]build/reports/junit.xml[/code]
Output log
Seperti disinggung di atas, selain output test yang bisa diintegrasikan dengan jenkins, dengan xcpretty kita juga bisa mendapatkan output log yang lebih mudah dibaca dan direview dibandingkan hasil mentah dari perangkat build. Di bawah ini adalah cuplikan dari output log hasil dari xcpretty yang tampil di log jenkins :
Dengan setup di atas kita bisa mendapatkan Continuous Integration dalam ekosistem yang lebih terbuka dan fleksibel dibandingkan apa yang ditawarkan Apple saat ini.