app自动化编译及持续集成(一)

什么是持续集成?

持续集成指的是,频繁地(一天多次)将代码集成到主干,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

为什么要做持续集成?

  • 每天都有很多重复性的工作,比如打包,由人工来完成占用开发时间且单调无聊。交给机器来做,把人释放出来,去做更有意义的工作。
  • 开发中的代码需要尽早的测试,以发现问题,特别是主流程上的问题。
  • 已经发布的版本需要实时监控,发现问题及时通知。

    主要工具

  • Jenkins
    • Jenkins是Java 写的一个持续集成工具,可以持续监控代码变化,并调用外部组件实现相关功能。
    • Gitlab插件,为了从gitlab仓库拉取代码,我们使用了Gitlab插件,该插件需要在系统设置中配置好host地址和ssh鉴权用的密钥、帐号等,然后在各个任务中再进行相应配置。
    • multipleSCMs插件,适用于多仓库构建。
  • Xcodebuild
    • Xcodebuild是iOS平台上的构建工具,有单独命令行和Xcode插件两种形式,需要依赖Xcode。类似工具还有xcrun,xctools。
  • Gradle
    • Gradle是基于JVM的构建工具,可以打包Android的apk,本身不依赖于Android SDK,但我们的gradle脚本中需要用到Android SDK。
  • Xcode7/Xcode8
    • Xcode7用于UI自动化测试,Xcode8用于自动化编译ipa
  • Android Studio
    • 对应SDK版本为21(Android5.0)

注意!

  • 系统权限
    • 由于Jenkins与管理员不在同一个帐号组内,为了避免因权限问题无法操作对应文件,将源代码、测试脚本、打包工具和对应的配置文件都设为了全部用户可读写。

Jenkins仓库配置

  • ios仓库配置
    • iOS juanpi的代码只有一个工程,只需要配置一个仓库,即xxx.git,分支选择develop(提测时为对应版本的release分支)
  • Android仓库配置
    • 假如Android 的代码有多个工程,需要配置多个仓库,其中xxxx.git为主工程,依赖于其他几个仓库, 为了保持代码的一致性,我们用了jenkins的multipleSCMs这个插件,注意要设置代码checkout到子目录,否则不同仓库的代码会相互覆盖,比如Local subdirectory for repo : test,则代码会checkout到test这个子目录下。

构建触发器

通过Poll SCM对话框里设置构建触发的定时器,比如”H/30 “,表示每半小时检查一次代码。

Jenkins系统配置参考

Environment variables

  • ANDROID_HOME
    • /Users/Shared/Jenkins/Library/android-sdk
  • CLASSPATH
    • .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  • JAVA_HOME
    • /Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home
  • NODE_BINARY
    • /usr/local/bin/node
  • PATH
    • $PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools

Xcode Builder

  • xcodebuild executable path
    • /usr/bin/xcodebuild
  • agvtool executable path
    • /usr/bin/agvtool
  • xcrun executable path
    • /usr/bin/xcrun

Extended E-mail Notification

  • Default Subject
    • $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!
  • Default Content

    • $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS:

      Check console output at $BUILD_URL to view the results.