组件化开发之-基于Jenkins搭建iOS持续集成开发环境

原创 2017-03-06

关键点

  • Jenkins安装及配置
  • Pipeline创建及配置
  • ruby的版本管理工具rbenv安装
  • fastlane安装
  • 常见构建问题
  • 相关工具及技术网站推荐

CI持续集成

什么是持续集成 ?

持续集成: 是一种软件开发实践,团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。
参考文章阮一峰日志

Jenkins安装及配置

  • 通过pkg包安装
       在 Mac 环境下,我们需要先安装 JDK,然后在 jenkins 的官网 下载最新的 pkg 包,双击安装即可。安装好后在浏览器中输入 localhost:8080 会出现如图则表示安装成功:

    启动页面

  • 通过war包安装
    如果Mac/windows上安装了Tomcat 可以直接将war包拷贝到tomcat/webapps,进入到war包所在目录启动Jenkins:

        java -jar jenkins.war --httpPort=8080
    
  • 通过 [homebrew] (http://brew.sh/) 方式安装

    brew install jenkins
    
  • 通过Docker安装
       首先在Docker官网下载安装配置Docker, 然后参考此网站介绍在Docker环境下安装Jenkins

  • 默认配置
    安装好Jenkins后,选择安装推荐的插件即可:

    安装默认插件

  • 创建登录用户

    创建登录用户

  • Manage Jenkins

    Manage Jenkins

    Jenkins URL

  • 创建Node节点
       分布式构建(在Jenkins的配置中叫做节点),分布式构建能够让同一套代码在不同的环境(如:Windows和Linux系统)中编译、测试等。
    Master节点:相当于Server的概念
    Slave节点:相当于Agent的概念
    更多介绍请查看Jenkins Master/Slave

    创建Node

    创建Node

    配置Node

配置Node时几个重要参数介绍

  • Name:节点名称
  • Description:节点描述,支持中文
  • Remote root directionary:节点的根目录
    (注意:如果目录不存在,会自动创建目录。但是必须对该目录有读写权限,否则会报错:hudson.util.IOException2: Failed to copy xxxx)
  • Labels:标记(又叫做标签)用来对多节点分组,标记之间用空格分隔.例如'iOSMobile AndrodMobile',将会把一个节点标记上'iOSMobile'和'AndrodMobile'.
  • Launch method:运行方式有四个选项。建议选择第1、2种方式配置。详细如下:
    【推荐】Launch slave agents on Unix machines via SSH 在Unix(包括Linux)机器上通
    过SSH通道连接节点 (适用于Unix和Linux)
    Host:节点主机的ip地址
    Credentials:凭据(如果为空或者不可选择,请在系统管理→Manage Credentials中配置。
    Port:端口默认22

ruby环境安装

在mac上计算机已经安装了ruby,在终端下输入命令:ruby --version
为了能更好的管理ruby版本,我们使用rbenv工具

$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv  
$ cd ~/.rbenv && src/configure && make -C src

安装成功后执行 rbenv init 按照终端输出的提示将 eval "$(rbenv init -)" 拷贝到指定文件(注意: 如果你是使用的iterm2 则拷贝至~/.zshrc 否则拷贝至./bash_profile


配置好以后,重新开启一个终端,我们安装ruby 2.4.0版本

$ rbenv install -l       # 查看ruby可用版本  
$ rbenv install 2.3.0   # 安装ruby2.3.0  
$ gem install bundler  # 安装ruby gems  
$ rbenv rehash           # 成功操作后,执行rehash操作  
$ rbenv global 2.3.0   # ruby 系统全局环境  
$ rbenv local 2.3.0     # ruby 本地环境  
$ rbenv shell 2.3.0     # ruby作用于当前终端环境  

注意: 由于rbenv可能与另一个ruby环境管理工具rvm发生冲突,可以使用rvm implode 彻底删除rvm

Pipeline 创建及配置

Pipeline创建
  1. 设置Pipeline名称
  2. 选择单线程Pipeline (在现目前项目中创建单线程已能够满足条件,多线程Multibranch Pipeline暂不知如何使用,后续补上)
  3. 创建Pipeline时,可以根据一个已有的Pipeline创建
    创建Pipeline
Pipeline配置
  • General配置
    General配置
  • Build Trggers配置
    Build Trggers配置
  • Pipeline scripts
       配置如下,包含了:
    • 代码检出
    • 单元测试
    • 生成测试报告
    • 修改版本号
    • 功能测试
    • 构建
    • 发布App
node('Mobile') {
    stage('SVN Checkout') {
        checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[credentialsId: 'sclocman', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'svn://svn地址信息']], workspaceUpdater: [$class: 'CheckoutUpdater']])
        sh "svn upgrade #{HOME}/.JenkinsAgent"
    }  
    stage('Unit Testing') {
        dir('./fastlane') {
            // sh 'source ~/.bash_profile && bundle exec fastlane ios test'
        }
    }  
    stage('Generate Test Report') {
        dir('./fastlane') {
            // sh 'source ~/.bash_profile && bundle exec fastlane ios test_report'
        }
    }
    stage('Update the Version NO.') {
        dir('./fastlane') {
            sh 'source ~/.bash_profile && bundle exec fastlane ios update_version'
        }
    }  
    stage('Functional Testing') {
        dir('./fastlane') {
            sh 'source ~/.bash_profile && bundle exec fastlane ios function_test'
        }
    }  
    stage('Build') {
        dir('./fastlane') {
            sh 'source ~/.bash_profile && bundle exec fastlane ios build config:Debug'
        }
    }  
    stage('Release Version') {
        dir('./fastlane') {
            sh 'source ~/.bash_profile && bundle exec fastlane ios deploy config:Debug' 
        }
    }
}

fastlane

$ xcode-select --install    #确保安装了最新的xcode command line tools  
$  sudo gem install fastlane -NV   # 安装fastlane
  • fastlane使用
    首先进入你所在工程的目录下,然后执行:
$ fastlane init

按照提示进行即可。成功后你的目录工程下会多出一个fastlane目录,更多fastlane使用请参考。

构建故障排查

  • 构建版本error #1

找不到打包的ipa,造成不能上传蒲公英,couldn't open file "/Users/apple/.JenkinsAgent/workspace/locmanYZY-Test/fastlane/fastlane_build/fastlane/result/archive/Debug/ipa/Debug.ipa
原因:未在Pipeline配置打包stage

#27
  • 构建版本error #2

打包未签名,Code signing is required for product type 'Application' in SDK 'iOS 10.2
原因:Agent机器为配置对应证书及Profile

  • 构建版本error #3

Could not find lane 'ios build_app_for_simulator'. Available lanes: ios test, ios build_ipa, ios build_simulator_app, ios deploy_to_pgyer, ios update_build_number
原因:stage配置执行的lane找不到,直接参考提示修改即可

![](http://upload-images.jianshu.io/upload_images/2010692-84a3e4a957aaaf3a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  • 构建版本error #4

    Runnning script '[CP] Embed pods Frameworks'
    原因:需要证书授权

  • 构建版本error #5

curl error SSLRead
配置curl ssl:

        $ php -i |grep "SSL Version"  #看看SSL Version的信息
        SSL Version => SecureTransport
        
        // 执行下面命令
        $ brew tap homebrew/dupes
        $ brew tap homebrew/versions
        $ brew tap homebrew/php
        
        $ brew install --with-openssl curl
        
        $ brew install \
                --with-apache \
                --with-homebrew-curl \
                --with-homebrew-openssl \
                --without-snmp php55
        $ php -i | grep "SSL Version"  #如果看到以下,则操作成功
        SSL Version => OpenSSL/1.0.1j

结后语

  • 相关工具推荐

  • 相关技术网站推荐

    • Thoutworks技术雷达 同时可以参考Thoutworks公司逸言的博客
    • infoQ 实践驱动的社区资讯站点,致力于促进软件开发领域知识与创新的传播,包含有:架构、移动、运维、云计算、AI、大数据、容器等技术新闻,有中文版面
    • 有问题上 stackoverflow
    • ruby 了解学习相关ruby技术
    • iOS 测试相关技术学习
    技术框架 单元测试 截屏测试 功能测试
    Quick ✅ Swift(BDD)
    Nimble ✅ Swift(断言)
    KIWI ✅ OC(BDD/断言/Mock)
    FBSnapshotTestCase
    Calabash
    Appium

本文参考了很多blog、github、stackoverflow的文章及问题,感谢作者的分享!特别感谢ThoughtWorks的周教练耐心指导!本文提到的后续补充问题及深入详解将会持续更新,也欢迎各位修改文档使其更加丰富细致。

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

推荐阅读更多精彩内容