Flutter学习 ---- TravisCI加持

1,199 阅读4分钟

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。

  1. 准备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中忽略

  1. 加密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文件也是一样的操作。

  1. 上传到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自动打包、发布啥的,国内也有蒲公英提供类似的服务。

效果

image

项目地址: Chic

参考