Flutter号称统一Android端和IOS端开发,做到一份代码同时运行在两个平台上,从实际效果来看,流畅的体验、完善的文档,还是很值得一试的。不过其中却藏了一个神坑(对我来说),那就是你的Flutter应用要在IOS上运行,必须在macOS主机上打包才可以,吃着苹果的童鞋自然不用担心了。然而本人一台y400征战多年,目前资金池也处于资源紧缩状态,换苹果机这种高消耗的任务基本是排在优先级队列尾端(求土豪公司“包养” ?)。不过好在,还有线上自动构建工具TravisCI帮忙,打两个平台的安装包也不是梦。
通过TravisCI为Flutter项目 Chic 生成Android和IOS的安装包。
把安装包放到Github Release供下载。
怎么把Github项目接入TravisCI这里就不再介绍了,网上已经有很多相关教程,接入工作非常的简单。我们要实现持续集成,说白了就是提供一个yml文件,让CI照着它跑一遍,至于它的语法,可以参考TravisCI官方文档介绍,其实跟Gitlab的CI差不多,说起来,目前工作中用的就是Gitlab,感觉界面、使用逻辑等比Github方便很多,尤其是WebIDE简直牛逼,线上就能做很多事,省去了把项目clone下来的麻烦。言归正传,因为是要打包APK和IPA,所以Chic里写的.travis.yml应该适用于大部分Flutter项目。我把CI分成三个阶段:test、打包APK、打包IPA。下面就这三个阶段分别介绍一下:
# jobs 用于执行不同的build stage
jobs:
include:
- stage: test
- stage: deployAPK
- stage: deployIPA
复制代码
Test 阶段
- stage: test
os: linux
language: generic
sudo: false
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
# Flutter依赖
- libstdc++6
- fonts-droid
before_script:
- git clone https://github.com/flutter/flutter.git -b beta --depth 1
script:
- "./flutter/bin/flutter upgrade"
- "./flutter/bin/flutter test"
复制代码
测试主要是运行一下flutter test,跑一下测试用例,这个没啥好说的,根据官网的例子来写就可以。
打包APK
- stage: deployAPK
os: linux
language: android
licenses:
- android-sdk-preview-license-.+
- android-sdk-license-.+
- google-gdk-license-.+
android:
components:
- tools
- platform-tools
- build-tools-27.0.3
- android-27
- sys-img-armeabi-v7a-google_apis-25
- extra-android-m2repository
- extra-google-m2repository
- extra-google-android-support
jdk: oraclejdk8
sudo: false
# 以上都是在安装AndroidSDK
env: APK_OUTPUT=build/app/outputs/apk/release/app-release.apk
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- libstdc++6
- fonts-droid
#以上为Flutter环境搭建
before_script:
# 用你自己的解密命令替代
- openssl aes-256-cbc -K $encrypted_faf484425141_key -iv $encrypted_faf484425141_iv -in key.properties.enc -out android/key.properties -d
- openssl aes-256-cbc -K $encrypted_a1a476bece9a_key -iv $encrypted_a1a476bece9a_iv -in feng.jks.enc -out android/feng.jks -d
- git clone https://github.com/flutter/flutter.git -b beta --depth 1
script:
- "./flutter/bin/flutter upgrade"
- "./flutter/bin/flutter -v build apk --release"
deploy:
provider: releases
skip_cleanup: true
# 用你的api_key替代
api_key:
secure: uDRE0d3gZ5JYhl/jBiDp5z...
file: $APK_OUTPUT
on:
tags: true
复制代码
首先是安装AndroidSDK,这个TravisCI已经有很多现成的例子了,主要关注script阶段我们如何利用flutter build apk --release生成签名APK。
- 准备key.properties和.jks 搞过Android开发的应该对这两个文件不陌生,如何生成jks网上有很多教程,这里就不再赘述了,key.properties其实就是jks中的密码等参数,文件内容如下
storePassword=yourpass
keyPassword=yourpass
keyAlias=alias
storeFile=../your.jks
复制代码
把这两个文件放在Flutter项目的android目录下,修改app中的build.gradle:
// -- New --
def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
...
// -- New --
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
// -- Change --
buildTypes {
release {
signingConfig signingConfigs.release
}
}
...
}
复制代码
注意:key.properties和jks文件必须在Git中忽略
- 加密key.properties和jks 利用TravisCI提供的cli工具,可以对单个文件进行加密:
travis encrypt-file [文件名].jks
复制代码
会生成一个加密文件*.jks.enc,和解密命令
openssl aes-256-cbc -K $encrypted_faf484425141_key -iv $encrypted_faf484425141_iv -in key.properties.enc -out android/key.properties -d
复制代码
把这个enc文件放在android下并加入Git,解密命令可以替换上面的示例代码中的标记部分。key.properties文件也是一样的操作。
- 上传到GithubRelease 上传到Release就很简单了,利用TravisCI提供的命令行工具,执行 travis setup releases 就会自动在你的.travis.yml中添加deploy语句,我们主要需要api_key那块,替换示例代码的标记部分。 经过以上步骤,你应该就能在Github Release上看到打包好的app_release.apk,可以直接下载安装。
如果碰到问题,建议多查看TravisCI官方文档,和蒲公英的持续集成介绍。对照Chic的.travis.yml文件修复问题。
打包IPA
- stage: deployIPA
os: osx
language: objective-c
osx_image: xcode9.2
before_script:
- pip2 install six
- brew update
- brew install libimobiledevice
- brew install ideviceinstaller
- brew install ios-deploy
# 以上安装xcode环境
- git clone https://github.com/flutter/flutter.git -b beta --depth 1
script:
- "./flutter/bin/flutter upgrade"
- gem install cocoapods
- pod setup
- "./flutter/bin/flutter -v build ios --release --no-codesign"
- mkdir Runner
- mkdir Runner/Payload
- cp -r build/ios/iphoneos/Runner.app Runner/Payload/Runner.app
- cd Runner
- zip -r Runner.ipa Payload
deploy:
provider: releases
skip_cleanup: true
#跟Android的api_key是一致的
api_key:
secure: uDRE0d3gZ5JYhl/jBiDp5zv32fH...
file: Runner.ipa
on:
tags: true
复制代码
打IOS平台的安装包相对Android麻烦了很多,主要是证书不好搞,个人开发者证书一年99美元。网上一些的证书服务也不便宜,所以目前虽然打了一个IPA包,但是没有签名,不能安装。等以后有条件了再更新使用方法,有条件的童鞋可以在这个IPA包的基础上继续探索,比如fastlane自动打包、发布啥的,国内也有蒲公英提供类似的服务。
效果
项目地址: Chic
参考
- posse_gallery TravisCI
- Flitter TravisCI
- 蒲公英文档 -- 使用 Travis CI 实现持续集成
- TravisCI 文档