個人Github:github.com/BzCoderhtml
GitLab-CI的相關語法:fennay.github.io/gitlab-ci-c…linux
歡迎各位留言討論android
爲了優化工做流程,解放開發人員雙手,不成天被【幫我打一個測最近的包】這種瑣碎的事兒打亂工做的節奏,這兩天就研究了下有關於Android持續集成的東西,特此記錄。咱們項目是存放在GitHub的私有倉庫,如今有三個持續集成自動化打包的方案:c++
本着薅資本主義羊毛的原則,咱們來介紹下這個方案。git
簡單地瞭解了工具,接下來咱們就開始持續集成之旅。 程序員
首先要將GitHub上的代碼轉移一份到GitLab上,而且保持同步。萬幸的是,這最關鍵的一部,貼心的GitLab已經搞定了。 【登陸Gitlab】【New project】 【CI/CD for external repo】【GitHub】,只要通過受權,GitLab就能夠獲取到你GitHub賬號下全部的倉庫。選擇【Connect】後便可同步你的GitHub項目到GitLab。 github
配置GitLab-CI其實十分簡單,咱們只要將GitLab-CI的持續集成腳本文件.gitlab-ci.yml
加入到咱們工程的根目錄便可,若是你是想即拿即用,那麼你只須要複製粘帖如下代碼,替換相關Key值與SDK,JDK版本便可。web
image: openjdk:8-jdk
variables:
ANDROID_COMPILE_SDK: "28"
ANDROID_BUILD_TOOLS: "28.0.2"
ANDROID_SDK_TOOLS: "4333796"
before_script:
- apt-get --quiet update --yes
- apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
- wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip
- unzip -d android-sdk-linux android-sdk.zip
- echo y | android-sdk-linux/tools/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null
- echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" >/dev/null
- echo y | android-sdk-linux/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null
- export ANDROID_HOME=$PWD/android-sdk-linux
- export PATH=$PATH:$PWD/android-sdk-linux/platform-tools/
- chmod +x ./gradlew
# temporarily disable checking for EPIPE error and use yes to accept all licenses
- set +o pipefail
- yes | android-sdk-linux/tools/bin/sdkmanager --licenses
- set -o pipefail
stages:
- build
assembleDebug:
stage: build
only:
- master
script:
- ./gradlew assembleDebug
- curl -F "file=@app/build/outputs/apk/debug/app-debug.apk" -F "uKey=蒲公英uKey" -F "_api_key=蒲公英api_key" https://qiniu-storage.pgyer.com/apiv1/app/upload
- curl "釘釘WebHook地址" -XPOST -H 'content-type:application/json' -d '{"msgtype":"text","text":{"content":"@135xxxxxxx@135xxxxxxx@135xxxxxxx【xxxx】打包完成,下載地址:https://www.pgyer.com/xxxx"},"at":{"atMobiles":["135xxxxxxx","135xxxxxxx","135xxxxxxx"],"isAtAll":false}}'
artifacts:
paths:
- app/build/outputs/apk/debug/app-debug.apk
複製代碼
這邊地解釋下經常使用的幾處配置項的含義,畢竟咱們的要求是快速簡單配置,過多的就不贅述了。json
根據項目實際SDK版本狀況修改。api
image: openjdk:8-jdk
variables:
ANDROID_COMPILE_SDK: "28"
ANDROID_BUILD_TOOLS: "28.0.2"
ANDROID_SDK_TOOLS: "4333796"
複製代碼
此處根據須要更改打包命令,示例中打的是Debug包。
./gradlew assembleDebug
複製代碼
第一個參數爲你打包後文件的路徑,「@」符號不能丟。第二個第三個參數能夠在蒲公英官網查詢。
curl -F "file=@app/build/outputs/apk/debug/app-debug.apk" -F "uKey=蒲公英uKey"
-F "_api_key=蒲公英api_key" https://qiniu-storage.pgyer.com/apiv1/app/upload
複製代碼
固然你也能夠配置其餘參數來知足你的需求。
參數 | 類型 | 說明 |
---|---|---|
uKey | String | (必填) 用戶Key |
_api_key | String | (必填) API Key |
file | File | (必填) 須要上傳的ipa或者apk文件 |
installType | Integer | (選填)應用安裝方式,值爲(1,2,3)。1:公開,2:密碼安裝,3:邀請安裝。默認爲1公開 |
password | String | (選填) 設置App安裝密碼,若是不想設置密碼,請傳空字符串,或不傳。 |
updateDescription | String | (選填) 版本更新描述,請傳空字符串,或不傳。 |
curl "釘釘WebHook地址" -XPOST -H 'content-type:application/json' -d '釘釘消息json'
複製代碼
釘釘WebHook地址能夠在【羣聊】【添加機器人】【自定義】中獲取。
釘釘消息中的Json能夠參考如下格式{
"msgtype": "text",
"text": {
"content": "@135xxxxxxx@135xxxxxxx@135xxxxxxx【xxxx】打包完成,下載地址:https://www.pgyer.com/xxxx"
},
"at": {
"atMobiles": [
"135xxxxxxx",
"135xxxxxxx",
"135xxxxxxx"
],
"isAtAll": false
}
}
複製代碼
參數 | 參數類型 | 必須 | 說明 |
---|---|---|---|
msgtype | String | 是 | 消息類型,此時固定爲:text |
content | String | 是 | 消息內容 |
atMobiles | Array | 否 | 被@人的手機號(在content裏添加@人的手機號) |
isAtAll | bool | 否 | @全部人時:true,不然爲:false |
@後面爲你所須要通知的同事的釘釘綁定的手機號碼,更多用法能夠參考釘釘機器人文檔。
固然你也能夠在蒲公英後臺中設置webhook直接設置通知釘釘:
蒲公英應用下載地址,能夠在後臺查看。
##5.指定分支 咱們並不須要每次提交都觸發持續集成。因此咱們須要指定觸發持續集成的分支。only:
- master
複製代碼
參數 | 說明 |
---|---|
only | 定義一列git分支,進行集成 |
except | 定義一列git分支,不進行集成 |
##6.上傳artifacts文件路徑
- app/build/outputs/apk/debug/app-debug.apk
複製代碼
能夠在Gitlab中下載打出來的包。
到此流程所有結束,只要你提交代碼到Github,Gitlab-CI就會幫你自動打包,你能夠在【GitLab】【對應工程】【CI/CD】中查看打包的進程。
打包成功後就會發送通知到你的釘釘,並同步至蒲公英,固然你也能夠到GitLab中從附件中下載安裝包,若是你的微信綁定了蒲公英,在你的微信裏也會有相應的提示。 可是有一點要注意。因爲在GitlLab上打包,它並不會緩存倉庫,因此每次都須要從新下載工程中全部被依賴的庫。從圖中也能夠看到,一箇中型工程的集成時間在25-30分鐘左右。打包速度異常緩慢,但已經足夠知足平常的一些需求。固然若是能利用Jenkins把環境部署在本地將是一個更好的選擇。