Integrasi Berkelanjutan iOS dengan Server Xcode Dijelaskan

Diterbitkan: 2022-03-11

pengantar

Sebelum Xcode 9, menggunakan alat integrasi berkelanjutan Apple adalah proses yang membosankan dan rumit yang memerlukan pembelian dan pemasangan aplikasi server macOS tambahan. Hal ini menyebabkan banyak pengembang mengabaikan gagasan integrasi berkelanjutan untuk proyek iOS mereka atau menggunakan solusi pihak ketiga, dengan tingkat keberhasilan yang sangat bervariasi.

Namun, setelah Xcode 9.0 dirilis pada September 2017, prosesnya sangat disederhanakan, termasuk opsi penandatanganan kode otomatis, dan sekarang sepenuhnya terintegrasi ke dalam Xcode. Oleh karena itu, tidak memerlukan aplikasi atau alat tambahan apa pun.

Sementara solusi pihak ketiga seperti Fastlane, Bluepill, dll. sangat membantu dan dapat melakukan banyak pekerjaan kasar untuk Anda, artikel ini akan mengeksplorasi kemampuan menggunakan alat Xcode dan Apple sendiri untuk kebutuhan integrasi berkelanjutan Anda. Kami juga akan menggunakan penandatanganan kode manual karena hal itu tampaknya sering menjadi masalah bagi banyak orang, dan penandatanganan otomatis juga cenderung bukan solusi optimal jika menyangkut beberapa konfigurasi build.

Catatan: Artikel ini didasarkan pada Xcode 9.4.1 dan berfokus pada pengembangan aplikasi iOS, tetapi banyak di antaranya berlaku untuk Xcode 10 (saat ini tersedia sebagai versi beta 5) dan pengembangan aplikasi macOS.

Menyiapkan Server Xcode

Selain menyederhanakan proses integrasi yang sebenarnya, Xcode 9 juga menyederhanakan proses penyiapan Server Xcode.

Luncurkan aplikasi Xcode di mesin macOS Anda yang telah ditetapkan sebagai server CI Anda dan buka Preferensi.

Arahkan ke tab terakhir, yang disebut Server & Bots .

Alat Integrasi Berkelanjutan: Tangkapan layar tab Server & Bot

Aktifkan kemampuan Xcode Server dengan mengklik tombol di sudut kanan atas. Kemudian, Anda akan diminta untuk memilih pengguna untuk menjalankan dan menjalankan skrip build di mesin ini. Mungkin ide yang baik untuk memiliki pengguna khusus hanya untuk tujuan ini, daripada menggunakan yang sudah ada sebelumnya.

Perhatikan bahwa pengguna ini harus masuk ke sistem agar bot Xcode dapat berjalan. Setelah masuk, Anda akan melihat lingkaran hijau di sebelah nama pengguna.

Server dan Bot Xcode setelah login berhasil

Itu dia! Mari kita lihat lebih dekat bot Xcode.

Cara Mengonfigurasi Bot Xcode

Sekarang Anda siap untuk mulai mengonfigurasi bot Xcode untuk dijalankan di server ini. Ini dapat dilakukan pada mesin pengembangan apa pun yang terhubung ke jaringan yang sama dengan server.

Buka Xcode di mesin pengembangan Anda dan klik Xcode > Preferences dari menu atas. Kemudian, buka tab Akun dan klik ikon + di sudut kiri bawah. Pilih Xcode Server dari dialog yang muncul.

Tangkapan layar pemilihan jenis akun

Untuk membuat bot, cukup buka proyek Anda di Xcode dan pilih opsi Produk > Buat Bot… dari menu atas. Pengaturan bot memiliki sejumlah langkah dan kami akan menjelajahinya di bagian yang akan datang.

Mengotomatiskan Distribusi Aplikasi

Salah satu aplikasi otomatisasi pembuatan aplikasi iOS yang paling sering adalah mengonfigurasi bot untuk mengunggah aplikasi ke platform distribusi iOS seperti TestFlight, Fabric, dll.

Seperti yang saya jelaskan sebelumnya, artikel ini hanya akan mengeksplorasi mengunggah ke App Store Connect dan mengunduh langsung dari Server Xcode Anda, karena itu adalah alat asli Apple untuk distribusi aplikasi iOS.

Distribusi App Store Connect Menggunakan Xcode

Sebelum mengonfigurasi bot, pastikan Anda memiliki catatan aplikasi App Store Connect yang cocok dengan ID bundel proyek pengembangan aplikasi Anda. Perlu juga dicatat bahwa setiap build harus memiliki pengenal unik yang terdiri dari versi build dan nomor build. Kami akan mengeksplorasi bagaimana memastikan kondisi ini terpenuhi ketika kami membahas pengaturan bot Xcode nanti.

Langkah 1: Menyiapkan konfigurasi build yang benar adalah langkah penting untuk mendapatkan apa yang Anda inginkan. Pastikan Anda memilih skema dan konfigurasi yang menghasilkan aplikasi yang ingin Anda unggah ke App Store Connect. Ini termasuk memastikan bahwa konfigurasi build menggunakan id bundel yang sesuai yang terdaftar di portal Pengembang Apple tim Anda (ini digunakan untuk penandatanganan kode) serta di portal App Store Connect Anda (ini digunakan untuk mengunggah aplikasi secara otomatis) .

Langkah 2: Saat masih di tab "Konfigurasi", kita perlu menentukan opsi ekspor. Kami akan menjelajahi daftar properti opsi ekspor, jadi pastikan "Gunakan Daftar Opsi Ekspor Kustom" dipilih.

Langkah 3: Sekarang saatnya kita membuat daftar properti opsi ekspor. Daftar lengkap kunci yang akan digunakan dalam file ini tersedia jika Anda memasukkan xcodebuild --help , tetapi kami akan menjelajahi yang digunakan dalam konfigurasi bot ini di sini:

  • compileBitcode – Bitcode adalah format keluaran sementara Apple untuk kode sumber aplikasi. Dengan kata lain, ini adalah format di mana kode sumber Anda diubah sebelum dikompilasi menjadi kode mesin untuk arsitektur tertentu. Ini bertujuan untuk memiliki wadah kode tunggal yang dapat dioptimalkan lebih lanjut jika pengoptimalan dibuat dalam set instruksi, dan juga untuk dapat mengompilasinya ke arsitektur masa depan dari format yang sama ini. Namun, ini tidak berpengaruh pada aplikasi Anda. Terserah Anda untuk memutuskan apakah Anda ingin mengaktifkannya atau tidak.
  • method – Argumen ini menentukan jenis produk yang Anda ekspor. Apple membedakan produk berdasarkan audiens yang ditunjuk— pengembangan hanya memungkinkan Anda untuk menginstalnya pada perangkat yang ditentukan dalam profil penyediaan, perusahaan mengizinkan semua orang untuk menginstalnya, tetapi mereka harus secara eksplisit memercayai profil pengembangan ini sebelum menjalankan aplikasi, dan toko aplikasi adalah untuk mendistribusikannya ke App Store atau App Store Connect, jadi kami akan menggunakan nilai ini.
  • provisioningProfiles – Ini cukup jelas. Tetapi ada beberapa hal yang perlu diperhatikan di sini: Profil penyediaan dalam daftar properti opsi ekspor adalah kamus di mana kunci sesuai dengan id bundel produk dan nilai sesuai dengan nama profil penyediaan yang digunakan untuk menandatangani kode.
  • signingCertificate – Argumen lain yang cukup jelas. Nilai bidang ini dapat berupa nama sertifikat lengkap atau hash SHA-1.
  • teamID – Argumen lain yang cukup jelas. Ini adalah pengidentifikasi sepanjang 10 karakter yang dikeluarkan Apple untuk organisasi Anda saat Anda mendaftar ke program Pengembang Apple.
  • uploadBitcode – Mengunggah bitcode atau tidak (jika Anda memilih untuk mengkompilasinya) sehingga dapat digunakan di AppStore Connect untuk menghasilkan build baru yang dioptimalkan atau build untuk arsitektur masa depan.
  • uploadSymbols – Mengunggah simbol debug Anda sehingga Anda bisa mendapatkan laporan kerusakan yang berarti daripada hanya tumpukan memori dan tumpukan rakitan.

Jadi sekarang, daftar properti opsi ekspor Anda mungkin terlihat seperti ini:

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>compileBitcode</key> <false/> <key>method</key> <string>app-store</string> <key>provisioningProfiles</key> <dict> <key>com.bundle.id</key> <string>ProvisioningProfileName</string> </dict> <key>signingCertificate</key> <string>Signing Certificate Exact Name or SHA-1 hash value</string> <key>teamID</key> <string>??????????</string> <key>uploadBitcode</key> <false/> <key>uploadSymbols</key> <true/> </dict> </plist>

Langkah 4: Pilih .plist yang Anda buat sebagai daftar properti opsi ekspor.

Langkah 5: Selanjutnya adalah tab “Jadwal”—atur sesuai dengan preferensi Anda.

Langkah 6: Pada tab Penandatanganan, pastikan Anda menghapus centang pada opsi "Izinkan Server Xcode untuk mengelola sertifikat dan profil saya" dan unggah sendiri sertifikat penandatanganan yang cocok dan profil penyediaan, pada halaman Sertifikat & Profil .

Langkah 7: Tab Perangkat harus dibiarkan apa adanya karena kami mengunggah aplikasi daripada mengujinya.

Langkah 8: Tab Argumen memungkinkan Anda untuk secara eksplisit mengatur argumen xcodebuild atau variabel lingkungan yang dapat digunakan dalam skrip build atau pra-integrasi dan pasca-integrasi Anda.

Langkah 9: Akhirnya, kita mencapai tab Pemicu , yang juga merupakan tab terakhir dalam mengonfigurasi bot integrasi berkelanjutan Xcode. Ini adalah alat yang paling kuat di gudang Xcode Server. Sebagai permulaan, saya ingin menambahkan dua perintah berikut sebagai skrip pra-integrasi:

 #!/bin/sh set printenv

Yang pertama mencetak semua variabel yang digunakan Xcode Server dan nilainya dalam menjalankan integrasi saat ini. Yang kedua mencetak semua variabel lingkungan dan nilainya. Seperti yang diharapkan, ini dapat membantu dalam men-debug skrip Anda, jadi saya menamakannya "info debug."

Ingat bahwa kami menyebutkan bahwa kami perlu memastikan bahwa setiap build yang diunggah ke App Store Connect harus memiliki versi build yang unik dan pasangan nomor build. Kita dapat menggunakan alat PlistBuddy bawaan, tetapi kita juga membutuhkan cara untuk memiliki nomor build yang unik. Satu hal yang selalu ada selama integrasi Xcode Server—dan juga unik—adalah nomor integrasi, karena otomatis bertambah. Kami akan membuat skrip pra-integrasi lain, bernama "set build number" dengan konten berikut untuk memastikan bahwa kami memiliki nomor build unik setiap kali:

 #!/bin/sh buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}") buildNumber=$XCS_INTEGRATION_NUMBER /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Jika Anda menggunakan CocoaPods dan memilih untuk tidak memasukkan direktori Pods ke DVCS Anda, Anda juga harus menyertakan skrip praintegrasi dengan konten berikut:

 #!/bin/sh cd $XCS_PRIMARY_REPO_DIR pod install

Langkah 10: Kami hampir selesai, tetapi kami belum menentukan di mana pun kami ingin mengunggah build ke AppStore Connect atau ke akun mana. Untuk tujuan ini, kami akan menambahkan skrip pascaintegrasi dan alat bawaan lainnya, yang disebut Application Loader. Masukkan yang berikut ini ke dalam skrip:

 #!/bin/sh /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Support/altool --upload-app -f $XCS_PRODUCT -u $TESTFLIGHT_USERNAME -p $TESTFLIGHT_PASSWORD

$XCS_PRODUCT adalah variabel Server Xcode dan berisi jalur ke aplikasi yang dibuat dalam proses integrasi saat ini. Namun, $TESTFLIGHT_USERNAME dan $TESTFLIGHT_PASSWORD bukanlah variabel sistem atau Server Xcode. Ini harus diatur oleh Anda dan memiliki nilai ID Apple dan kata sandi Anda. Sayangnya, Apple telah menghentikan dukungan untuk membuat kunci API untuk pengunggahan build AppStore Connect. Karena ini adalah informasi rahasia, praktik terbaik adalah mengaturnya langsung di server Mac (dengan asumsi itu milik Anda sendiri) sebagai variabel lingkungan daripada di konfigurasi bot Server Xcode.

Distribusi Server Xcode

Bot distribusi Xcode Server sebenarnya menggunakan konfigurasi yang sama dengan yang digunakan untuk distribusi App Store Connect, dengan pengecualian skrip Pasca-integrasi. Namun, mengunduh aplikasi dan menginstalnya masih bisa rumit. Anda masih harus memastikan bahwa profil penyediaan yang Anda gunakan untuk menandatangani aplikasi memungkinkan aplikasi dipasang di perangkat yang Anda gunakan.

Dengan itu, Anda harus membuka Safari di perangkat iOS Anda dan menavigasi ke dasbor web Server Xcode server Anda. Misalnya, jika nama server Anda adalah "Server Mac", Anda dapat menemukannya di "nama-server-mac.local/xcode" jika Anda berada di jaringan yang sama dengan server. Di sana, Anda akan menemukan daftar semua bot Xcode Anda dan statistik integrasi terbaru mereka.

Pilih salah satu yang telah membangun aplikasi yang ingin Anda unduh. Pada layar berikut, Anda akan memiliki dua tombol— Instal dan Profil . Jika ini adalah pertama kalinya Anda mengunduh dari server ini, Anda harus mengklik Profil untuk menambahkan sertifikatnya ke daftar sumber tepercaya. Setelah itu, klik tombol Instal di halaman yang sama dan Anda akan disambut dengan dialog konfirmasi iOS “Apakah Anda yakin ingin menginstal * di perangkat Anda?” Konfirmasikan dengan mengklik Ya , dan aplikasi Anda akan diinstal dan dapat dijalankan dari layar beranda.

Tangkapan layar opsi penginstalan aplikasi

Untuk iOS 10.3 dan yang lebih baru , alasan kegagalan dengan "Tidak dapat terhubung ke *.local" adalah karena sertifikat yang ditandatangani sendiri harus dipercaya secara manual di Pengaturan pada perangkat uji.

Ikuti langkah ini:

Langkah 1: Instal sertifikat yang ditandatangani sendiri dari halaman bot server Xcode di iPhone Anda.

Langkah 2: Buka Pengaturan iPhone > Umum > Tentang > Pengaturan Kepercayaan Sertifikat .

Langkah 3: Temukan sertifikat yang ditandatangani sendiri oleh server Anda di bawah bagian AKTIFKAN KEPERCAYAAN LENGKAP UNTUK SERTIFIKAT ROOT , dan nyalakan sakelar.

Langkah 4: Kembali ke halaman integrasi bot di Xcode Server, klik Install .

Pengujian Aplikasi Otomatis Server Xcode

Penggunaan hebat lainnya dari Xcode Server adalah pengujian aplikasi otomatis, baik itu pengujian unit atau UI. Untuk melakukan ini, Anda harus memiliki target yang sesuai untuk proyek Anda. Artinya, Anda harus memiliki target yang menjalankan pengujian unit atau UI, tergantung pada tujuan Anda.

Proses penyiapannya sama dengan yang sebelumnya, tetapi kami akan memilih opsi yang berbeda. Perbedaan utama pertama adalah pada tab Konfigurasi . Jelas, kita akan mencentang kotak “Analyze” dan “Testing” karena itulah tujuan utama kita. Saya juga menyarankan untuk tidak mengarsipkan atau mengekspor produk dengan bot ini. Dimungkinkan untuk mencapai pengujian dan distribusi dengan konfigurasi bot yang sama. Namun, kedua skenario ini berbeda dalam output dan jadwalnya. Distribusi sering dijalankan pada akhir siklus.

Baik Anda bekerja di Scrum atau Kanban atau kerangka kerja lain, harus ada siklus yang digerakkan oleh waktu atau peristiwa yang telah ditentukan sebelumnya di mana Anda harus mengekspor dan produk yang dapat digunakan. Di sisi lain, Anda harus menjalankan bot pengujian pada setiap komit, karena ini adalah garis pertahanan pertama Anda terhadap regresi. Karena bot pengujian jelas lebih sering dijalankan, menggabungkan kedua bot tersebut menjadi satu dapat dengan cepat menghabiskan ruang disk di server Anda. Dan setiap integrasi juga akan membutuhkan lebih banyak waktu untuk diselesaikan.

Dengan itu, kami pindah ke tab "Jadwal", dan kami telah membahas ini di paragraf sebelumnya. Jadi, topik menarik berikutnya adalah penandatanganan kode. Perhatikan bahwa, meskipun target pengujian Anda mungkin menyatakan bahwa itu tidak memerlukan profil penyediaan di halaman pengaturan proyek Anda, Anda harus mengaturnya untuk menggunakan tim yang sama dan menandatangani sertifikat sebagai aplikasi host. Ini diperlukan jika Anda ingin menguji aplikasi Anda di perangkat iOS, bukan hanya di simulator. Jika ini kasus Anda, Anda juga perlu memastikan bahwa perangkat iOS yang digunakan untuk pengujian tidak akan terkunci karena tidak aktif karena hal ini dapat menyebabkan proses integrasi Anda macet tanpa batas waktu tanpa memberi tahu Anda.

Sekarang kita berada di tab "Perangkat" yang tidak memerlukan penjelasan khusus. Cukup pilih satu, beberapa, atau semua perangkat (iOS dan simulator) yang ingin Anda uji kodenya. Anda juga dapat memeriksa apakah akan menjalankan pengujian pada beberapa perangkat secara paralel atau berurutan. Untuk menyiapkan ini, Anda harus mempertimbangkan kebutuhan proyek Anda (apakah Anda menargetkan perangkat tertentu atau semua perangkat iOS yang didukung) dan juga sumber daya perangkat keras server.

Pada tab Argumen . tidak perlu menentukan apa pun secara eksplisit, karena kami hanya akan menggunakan variabel lingkungan bawaan.

Terakhir, pada tab Pemicu , kami akan memperkenalkan satu skrip praintegrasi dan satu skrip pascaintegrasi. Yang pertama hanya ada untuk membantu kami men-debug jika kami mengalami beberapa masalah. Ini sebenarnya yang sudah kami gunakan:

 #!/bin/sh set printenv

Yang kedua adalah yang akan memberi tahu kami jika satu atau lebih pengujian kami gagal dalam integrasi saat ini. Pastikan itu diatur untuk berjalan hanya pada kegagalan pengujian. Dan masukkan berikut ini:

 #!/bin/sh echo "$XCS_TEST_FAILURE_COUNT test(s) failed for $XCS_BOT_NAME bot on build $XCS_INTEGRATION_NUMBER" echo "You can see bot integration at:" echo "https://$HOSTNAME/xcode/bots/$XCS_BOT_TINY_ID/integrations/$XCS_INTEGRATION_TINY_ID"

Ada beberapa hal yang harus dijelaskan di sini. Pertama-tama, variabel $HOSTNAME menyimpan nilai dari format berikut: nama-komputer.local. Jelas, tautan hanya akan berfungsi jika Anda dapat menjangkau server itu melalui jaringan lokal. Selain itu, kemungkinan besar Anda akan mendapatkan peringatan keamanan dari browser saat mengunjungi tautan ini, karena ini adalah sambungan https ke tujuan yang tidak dapat dipercaya. Akhirnya, ini hanyalah titik awal untuk skrip "Kegagalan pengujian" Anda. Anda dapat mengirim email ke seluruh tim pengembangan, atau membuka masalah JIRA melalui permintaan API atau apa pun yang menurut Anda paling tepat dan produktif.

Membungkus

Semoga artikel ini mendorong Anda untuk meluangkan waktu untuk menjelajahi kemampuan Server Xcode di luar sekadar membangun aplikasi. Meskipun posting ini mungkin tidak membantu Anda persis seperti yang Anda inginkan atau harapkan, tujuannya adalah untuk memperkenalkan Anda pada cara berpikiran terbuka dalam menggunakan lingkungan bawaan dan variabel Server Xcode untuk mencapai tingkat otomatisasi yang lebih tinggi.

Ada banyak layanan pihak ketiga di luar sana yang memungkinkan lebih banyak fungsionalitas dan dapat melakukan lebih banyak pekerjaan untuk Anda, termasuk Fabric, Bluepill, dan Fastlane. Namun, mau tidak mau, mengandalkan pihak ketiga menimbulkan ketergantungan baru pada proyek Anda dan terkadang memerlukan penyiapan dan konfigurasi yang terkadang sederhana, terkadang rumit. Teknik yang dijelaskan di sini hanya memerlukan alat yang sudah diinstal pada setiap Mac, sehingga tidak memerlukan waktu penyiapan selain mengonfigurasi bot yang akan menjalankan pembuatan otomatis Anda!