DevOps 是一個衆所周知的開發方法,其主要目的是自動化軟件交付。事實上,DevOps 的目標是不斷的測試,代碼質量,功能開發,更容易維護版本。所以,DevOps 的一個最終目標是爲開發者進行快速,可信賴和自動化發佈提供指導,理想化狀態是在這個過程當中不牽涉任何人工勞動。這就是所謂的持續交付。我寫這篇文章來證實,咱們如今能在 Android 平臺上達成這樣的目標,同時和你們分享一下個人想法和聽取你們的反饋。html
想要達到持續交付,持續集成必須是強制的。在安卓平臺上的持續集成已經有一段時間了,爲了更清楚的去了解,咱們先說一下它的優點。android
安卓平臺必須採用持續集成方法,是的我說過。確實,持續集成有一些在構建 Android App過程當中沒法發忽略的好處。在我看來,它的優點在於:json
自動化構建:再也不只是在個人機器,而是在全部的環境。api
早失敗:一旦代碼提交以後就立刻構建,這樣就保證錯誤能被及早的發現。性能優化
構建測試:保證每個測試用例都能正常運行。服務器
不斷打包:防止打包過程當中的人爲錯誤。網絡
快速發佈:既然咱們對於每一次構建都有信心,那麼發佈就變得簡單了app
增長信心:最後,咱們相信咱們的代碼,咱們的過程,咱們減小不良的驚喜。工具
首先,咱們須要一個集成服務器像Jenkins 或 Travis 。下面的工做是個人標準配置:性能
啓動一個監視代碼推送到咱們的代碼倉庫(Jenkins or Travis)完成事件的任務。該任務監視代碼的 dev 分支去自動的編譯、單元測試、打包或者 debug APK .
當上面的任務完成以後,另一個任務就要被啓動了。這個任務主要用來跑集成測試(經過 Espresso 或者 Robotium)。在這個過程當中,經過模擬用戶場景和檢查渲染的圖形內容的方式來保證最終的用戶體驗。
另一個任務就是一個天天晚上都會運行的執行代碼質量掃描(例如 Sonarqube )的任務。
最後還有一個任務用來檢測一旦代碼倉庫的 master/release 分支有更新就去構建發佈的APK包。
看看吧,正如你看見的,這個過程很簡單而且保證能達成我開始所說的優點。
我曾經寫過一篇關於測試的文章(testing on Android)。測試是如此的重要由於它是可以保證App按照咱們所設定的那樣去工做的惟一工具。寫單元測試有不少工具和方法,請明智的去選擇。
此外,確認一下你要在你的應用程序集成的庫。事實上,當你使用的庫有一個良好的單元測試覆蓋率的時候,就更容易測試您的App。一些被認爲恰當測試的而且用測試驅動他們的開發的類庫(例如 IMO, OkHttp and Retrofit )。極可能,你將可以在使用它的時候來測試它。
最後,像 Dagger 庫能夠幫助你提升可測試性。事實上,它會迫使你遵循單一職責原則和正確分開你的代碼,從而更容易測試。
一旦你有一個強大的持續集成,讓咱們來看看如何提升水平。
舉例來講,在 Captain Train。咱們發佈每6週一次,咱們都很是當心了。 目前每次發佈都要作:
整個過程很是消耗時間,最近咱們想,是時候去把這個過程給自動化了。即便咱們的最終目標是減小發布時間。這種感受很是好,去防止人爲的犯錯誤以及常常的發佈發佈。咱們能掌握整個過程,這樣讓咱們更加有責任心。
可是,坦白的說,安卓開發者不能控制全部的事情,只有 Google 能作到。
例如,它暴露了一個 HTTP API,使開發人員可以使用 Play 商店控制檯輕鬆互動。他們也提供了不少語言實現的語言包,例如Java ,Ruby 等。
在這篇文章,我講專一於 Java 語言,由於對於安卓開發者來講,這是最容易的。
讓咱們看看如何編寫本身的 App 發佈工具來把 APP 發佈到 Play Store 。大概有兩個步驟:首先,咱們將配置咱們的控制檯,使咱們的客戶端可以進行操做,進而咱們就會發現其中的 API。最困難的事情常常用谷歌去配置。文檔()能夠在這裏找到。請注意,這是一個有點過期。
配置
首先,若是沒有作,你必須在谷歌控制檯建立一個新的項目。而後,咱們須要啓用 Google Play Android Developer API。
一旦完成,咱們必須建立服務賬戶關鍵的憑證:
最後填寫表格,並下載一個 json 格式的憑證。你須要保存三個值:private_key_id, private_key 、 client_email. 把 private_key 的值保存在 secret.pem 中.
咱們正在與開發者控制檯交互......如今讓咱們去到第二個控制檯! O /
鏈接到您的控制檯。你必須進入 Settings > API access:
而後,你必須簡單地連接您的項目。最後,在 Service accounts,授予權限給你下的 JSON 文件中的的客戶端郵件的client_email。
到如今爲止,一切都準備好了。
API發現
如今,讓咱們深刻到 Java 客戶端 API。咱們建立了一個單獨的 Java 項目爲咱們的發佈工具,咱們添加下面的依賴(Maven的中央倉庫有):
compile 'com.google.apis:google-api-services-androidpublisher: v2-rev20-1.21.0'
下一個步驟是建立一個 AndroidPublisher。首先咱們經過提供 transport client, JSON factory,和 private_key_id 對應的 private key ID,和 client_email 對應的帳戶 ID 來實例化一個 GoogleCredential。ANDROIDPUBLISHER 是一個包含了私鑰的關鍵文件。
http = GoogleNetHttpTransport.newTrustedTransport(); json = JacksonFactory.getDefaultInstance(); Set<String> scopes = Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER); GoogleCredential credential = new GoogleCredential.Builder(). setTransport(http). setJsonFactory(json). setServiceAccountPrivateKeyId(KEY_ID). setServiceAccountId(SERVICE_ACCOUNT_EMAIL). setServiceAccountScopes(scopes). setServiceAccountPrivateKeyFromPemFile(secretFile). build(); publisher = new AndroidPublisher.Builder(http, json, credential). setApplicationName(PACKAGE). build();
AndroidPublisher 對象是Google控制檯的主入口,他有一個 Edit 方法,容許咱們編輯控制檯的數據。
要開始一個新的版本,你必須以發起插入請求,並存儲它的返回值,你會在每個後續調用中使用這個返回的 ID。
AndroidPublisher.Edits edits = publisher.edits(); AppEdit edit = edits.insert(PACKAGE, null).execute(); String id = edit.getId();
如今咱們將改變咱們的控制檯數據,舉例來講改變 listings:
Listings listings = edits.listings(); Listing listing = new Listing(). setFullDescription(description). setShortDescription(shortDescription). setTitle(title); listings.update(PACKAGE, id, "en_US", listing).execute();
你也能夠上傳截圖
Images images = edits.images(); FileContent content = new FileContent(PNG_MIME_TYPE, file); images.upload(PACKAGE, id, "en_US", "phone5", content).execute();
最後一個例子,讓咱們上傳一個 APK
// APK upload Apks apks = edits.apks(); FileContent apkContent = new FileContent(APK_MIME_TYPE, apkFile); Apk apk = apks.upload(PACKAGE, id, apkContent).execute(); int version = apk.getVersionCode(); // Assign APK to Track Tracks tracks = edits.tracks(); List<Integer> versions = Collections.singletonList(version) Track track = new Track().setVersionCodes(versions); tracks.update(PACKAGE, id, "production", track).execute(); // Update APK listing Apklistings apklistings = edits.apklistings(); ApkListing whatsnew = new ApkListing().setRecentChanges(changes); apklistings.update(PACKAGE, id, version, "en_US", whatsnew).execute();
我推薦你們使用 API,由於它很完美而且很強大。
最後一步,你必須提交你的版本。事實上,到目前爲止,谷歌記錄您所請求的每個變化,可是它只會保存您提交的變化。我也建議你嘗試提交以前驗證您的更改。
edits.validate(PACKAGE, id).execute(); edits.commit(PACKAGE, id).execute();
正如你看見的那樣,開始所獲取的 ID,就像是一個事務ID 同樣。你開始事務以後,經過 insert, update/upload 來處理變化,而且經過 validate 方法驗證 ,經過commit 方法提交。一切都如此簡單。
如今咱們能夠遵循 devOps 原則,甚至對於安卓開發來講有了比較強大的持續交付能力。在 Captain Train 咱們選擇去寫咱們本身的發佈工具以此來控制重要的每個步驟。一旦 release 任務執行成功,咱們就執行發佈工具來發布 App。固然了Jenkin 和 Gradle 也有一些相似的工具可用。
諸如此類的工具能讓你簡單的經過向 master 或者 release 分支推送代碼的方式來發布你的App。這個過程簡單、可信賴、節省時間!
很明顯,這個過程不必定適用於每一個團隊/公司/應用程序~ ,這取決於你所在團隊的具體狀況。可是,我要強調的是持續交付應該是每個團隊/公司的目標。一旦達成,它將驅動您走向成功。
原文:http://jeremie-martinez.com/2016/01/14/devops-on-android/
OneAPM Mobile Insight,監控網絡請求及網絡錯誤,提高用戶留存。訪問 OneAPM 官方網站感覺更多應用性能優化體驗,想閱讀更多技術文章,請訪問 OneAPM 官方技術博客。
本文轉自 OneAPM 官方博客