iOS & Android 上传代码库+持续集成+单元测试

背景

本文将介绍如何把iOS & Android项目分别上传到CocoaPods和Jitpack,并用Travis CI做持续集成,codecov做代码单元测试覆盖率的报告展示。

上传代码

创建Github代码仓库

首先需要在Github上创建代码仓库,编写好自己的代码并提交,打上一个tag标签作为版本。

iOS上传CocoaPods

对于iOS代码,首先需要编写好项目的podspec描述文件,可以参照我项目中的描述文件。下面都将以我的Applepie项目为例,你的项目需要替换为自己的项目名字。

其中有几个地方需要注意:

s.name = "Applepie"
s.version = "0.1.2"

name是CocoaPod上的项目名称,version是版本,通常和tag是一一对应的。

s.source = { :git => "https://github.com/cdtschange/ios-applepie.git", :tag => s.version.to_s }

这是项目所在的Github地址。

s.ios.deployment_target = "9.0"
s.swift_version = "4.2"

这是对应支持的最低iOS版本和Swift语言版本。

s.source_files  = "Applepie/**/*.{h,m,swift,xcdatamodeld}"
s.resource = "Applepie/Applepie.bundle"

这是项目的代码文件路径和资源文件路径。

如果项目包含一些图片等资源文件需要外部能使用,就需要把资源文件打包成bundle放在根目录,并在代码中通过bundle的方式来访问。

s.dependency "xxx", "~> 1.0.0"

这是项目依赖的其他第三方库。

有了podspec文件之后,就需要执行下面的命令来校验代码是否正确:

> pod lib lint --allow-warnings

上面步骤通过之后,就可以执行下面命令将代码打包上传到CocoaPods了

> pod trunk push Applepie.podspec --allow-warnings

这一步可能会等较长时间,成功之后就可以通过pod install Applepie来正常使用了。

以后每次升级版本,只需要按步骤执行:

  1. 修改代码并提交
  2. 打新的tag
  3. 编辑podspec文件中的tag信息
  4. pod lib lint --allow-warnings
  5. pod trunk push Applepie.podspec --allow-warnings

Android上传Jitpack

修改项目根目录build.gradle文件

de buildscript->dependencies中加入依赖:

classpath "com.github.dcendents:android-maven-gradle-plugin:2.1"

allprojects->repositories中加入:

maven { url 'https://jitpack.io' }
修改要打包的library目录build.gradle文件

顶部加入,其中group替换为com.github.自己的github账号名

apply plugin: 'com.github.dcendents.android-maven'
group='com.github.cdtschange'
根目录添加.jitpack.yml文件

因为我在使用jitpack的时候遇到了Android SDK的Licenses需要同意才能运行的问题,所以在编译项目之前我需要先运行一些命令来同意Licenses。

在项目的根目录添加.jitpack.yml文件:

language: android
jdk:
- oraclejdk8

before_install:
  - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --update && echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --licenses
Jitpack中拉取项目

将Github上的项目提交并打好tag之后,就可以在Jitpack中用Github账号登录并查看到项目了。找到项目并在Release标签下看到自己的Tag Version,如果一切正常,会在版本号右边看见绿色的Get it按钮,我们就可以通过下面的方式正常使用了。

以后每次升级版本,只需要按步骤执行:

  1. 修改代码并提交
  2. 打新的tag
  3. 在Jitpack中查看新tag的项目是否编译成功
使用Jitpack

首先在要使用的项目根目录build.gradle文件中加入下面的maven源:

allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

然后就可以在需要的module的gradle文件中添加依赖了,下面是以我的Oreo项目为例,你的项目需要替换为自己的项目名字和版本:

dependencies {
  implementation 'com.github.cdtschange:android-oreo:1.0.0'
}

集成Travis CI

Travis CI可以为我们提供方便的代码自动编译、运行单元测试的能力,把它和Github结合使用,效果更佳。

很多开源Github项目中的

图标就是用了Travis CI生成的。

iOS集成Travis CI

首先在项目的根目录添加.travis.yml文件,还是以我的Applepie项目为例:

language: objective-c
osx_image: xcode10
cache: cocoapods
# xcode_workspace: ApplepieDemo/ApplepieDemo.xcworkspace
# xcode_scheme: ApplepieDemo
# xcode_sdk: iphonesimulator12.0
# podfile: ApplepieDemo/Podfile

branches:
  only:
  - master

before_install:
    - gem install xcpretty -N --no-ri --no-rdoc
    - pod repo update
    - pod install --project-directory=ApplepieDemo

script:
- |
    set -o pipefail
    xcodebuild clean test -workspace ApplepieDemo/ApplepieDemo.xcworkspace -scheme ApplepieDemo -destination 'platform=iOS Simulator,name=iPhone XS Max,OS=12.0' -enableCodeCoverage YES | bundle exec xcpretty
after_success:
    - sleep 5
    - bash <(curl -s https://codecov.io/bash)

branches only: master表示只有master分支有变化的时候才会触发自动编译,因此每次我们将代码合并到master分支,Travis CI就会为我们自动编译整个项目,并输入结果,带来的变化就是这个图标


会随着每次编译的结果不同而不同。

before_install描述的是在编译之前我们需要做的一些准备工作,例如我们的项目如果也有一些依赖的第三方库,就要先执行pod install命令来安装。

script就是编译命令了,我们指定用iOS Simulator,name=iPhone XS Max,OS=12.0环境来进行编译,并且运行单元测试和输出代码覆盖率报告enableCodeCoverage

after_success是描述执行成功之后需要做的事,我们在等待5秒之后,把单元测试报告上传到codecov,为后面的代码覆盖率工作做准备。

项目中有了这个文件之后,每次提交了master代码,我们都可以去我们项目所在的Travis CI查看编译的结果。

Android集成Travis CI

首先在项目的根目录添加.travis.yml文件,还是以我的Oreo项目为例:

language: android
android:
  components:
  - tools
  - build-tools-28.0.3
  - android-22
  - android-28
  - extra-android-m2repository
  - extra-android-support
  - sys-img-armeabi-v7a-android-22

branches:
  only:
  - master

script:
#- ./gradlew assembleRelease
- ./gradlew build connectedCheck

before_script:
# 修改你的 gradlew的权限,默认gradlew没有权限执行的
- chmod +x gradlew
# Emulator Management: Create, Start and Wait
- echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a
- emulator -avd test -no-audio -no-window &
- android-wait-for-emulator
- adb shell input keyevent 82 &

after_success:
- sleep 5
- bash <(curl -s https://codecov.io/bash)

内容基本和iOS的差不多,运行环境我是用的android-22版本跑的单元测试,版本高于22的好像都有些问题。

集成Codecov代码覆盖率报告

单元测试和代码覆盖率能直观地体现出一个项目质量好坏,代码覆盖率高的项目质量一定是不低的。Codecov为我们提供了代码覆盖率友好的展现形式,很多Github开源项目中的

这个图标就是用Codecov生成的。

iOS集成Codecov

首先在项目的根目录添加.codecov.yml文件,还是以我的Applepie项目为例:

comment:
  layout: header, changes, diff
coverage:
  ignore:
  - ApplepieDemo

ignore中可以添加我们不想测试的project。

Codecov网站上登录自己的Github,找到自己的项目,在Setting中找到一串密钥,复制下来。

在Travis CI网站上,找到自己项目,Setting的Environment Variables中加入环境变量:

CODECOV_TOKEN: 刚才复制的密钥

这样就可以在Travis CI每次自动编译并运行完单元测试,生成测试报告之后,自动上传到Codecov中了。

图标也会随着每次编译后覆盖率不同而变化。

Android集成Codecov

首先在项目的根目录添加.codecov.yml文件,还是以我的Oreo项目为例:

comment:
  layout: header, changes, diff
coverage:
  ignore:
  - app

ignore中可以添加我们不想测试的module。

其他接下来的部分就和iOS一样了,不再赘述。

总结

以上就是iOS & Android代码打包上传、持续集成、单元测试报告的详细步骤,大家可以在自己项目中动手试试了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容