zoukankan      html  css  js  c++  java
  • iOS可持续化集成: Jenkins + bundler + cocoapods + shenzhen + fastlane + pgyer

    工具介绍

    1. bundler

    bundler用于管理ruby gem的工具,我们用来管理cocoapods以及fastlane的版本。直接sudo gem install bundler就可以。然后在project的根文件夹下,加入Gemfile文件:
    source 'http://ruby.taobao.org'
    source 'http://ruby.taobao.org'
    gem 'cocoapods', '~>0.37.2'
    gem 'fastlane', '~>1.4.0'
    然后运行,bundle install就可以,运行完同一时候会生成一个Gemfile.lock文件,把这个和Gemfile文件一起加入到git中管理,用这个我们能够非常方便大家一起同步gem source和cocoapods以及fasten的版本。


    2. cocoapods

    这个不用多说,各方面參考资料已经太多了,这个不了解的话。在iOS开发方面真的是属于比較薄弱了。

    Command Line

    1). 我是选择fastlane作为打包以及分发的工具,这个是在shenzhen基础之上进行了封装,很easy易用。具体參考官方的资料即能够及另一些其它的对xcodebuild的封装:
    4) https://github.com/facebook/xctool,这是facebook对xcodebuild封装的一个开源库,也能够用来构建安装包。

    假设安装有多个Xcode版本号,能够使用xcode-select选择相应的Xcode版本号进行build,这个工具也是很实用的。
    使用xcpretty ( https://github.com/supermarin/xcpretty) 对xcodebuild的输出进行格式化。
    使用xcodebuild -list查看全部可用的schemes。

    xcrun是Xcode自带的一个命令行工具,主要有两个用途: 找到开发工具,运行这些开发工具。

    比方 xcrun —find ld,用于定位ld工具的位置。xcrun git —version,则是直接运行git —version命令。

    总之来说,当我们使用fastlane和shenzhen之后,这部分就变得很easy,不须要我们再过多关注。


    2). agv — Apple Generic Version 工具的使用
    Apple官方提供的更改版本的功能。设置參考:

    Jenkins

    1. 安装启动

    https://jenkins-ci.org/或者通过命令: "curl -L http://mirrors.jenkins-ci.org/war/latest/jenkins.war -O" 下载jenkins.war都某个文件夹以下。 通过命名行 "java -jar jenkins.war" 启动jenkins,也能够通过 —httpPort 和 —httpListenAddress 指定port和设定IP来启动。

    假设希望jenkins能够开机自启动以及异常自己主动重新启动,能够把jenkins设置为Launch Daemon的方式启动。

    1). 执行命令 “sudo touch /Library/LaunchDaemons/org.jenkins-ci.plist” 来创建配置文件

    2). 文件的内容例如以下,參考gist: https://gist.github.com/lihei12345/84a4ed83aa07a9d3a7d7 :


    3) 又一次启动jenkins就会在后台自启动了,或者直接使用”sudo launchctl load -w /Library/LaunchDaemons/org.jenkins-ci.plist”命令行

    不管通过哪种方式来启动jenkins。启动之后,在浏览器中输入: http://localhost:8080,就能够直接进入jenkins后台了。

    2. Jenkins基本设置

    进入jenkins之后,须要做一些主要的设置来设置一个管理账户,或者设置LDAP这这种通用身份系统认证系统 (參考一篇非常棒的文章:http://zhuanlan.zhihu.com/prattle/19974568)

    1). 进入系统管理 -> Configure Global Security -> 点击”启用安全” 。

    启用安全以下选择,“Jenkins专实用户数据库”。勾选同意用户能够注冊。然后在“授权策略”中选择“不论什么用户能够做不论什么事(没有不论什么限制)”。当然,也能够使用LDAP身份认证机制,直接使用外部统一的身份机制来做认证。

    2). 返回注冊一个账户。登录之后再次进入安全管理。勾选“登录用户能够做不论什么事”,这样就仅仅有登录用户才干做操作了。
    3). 插件管理,我使用的jenkins版本号,发现我所须要的插件都已经加入了,仅仅须要update一下就可以。


    3. 设置git

    1). “新建” —> 勾选“构建一个自由风格的软件项目”  -> “源代码管理”中勾选“Git”
    2).  配置repo的URL以及SSH keys生成的private key填入以下的输入框中。

    生成SSH keys的过程详细请參考:https://help.github.com/articles/generating-ssh-keys/,对git比較熟悉的话。这个过程应该不会陌生。记得不要忘记把public key加入 repo的訪问权限中,不管是github/gitlab/bitbucket都是类似的。运行以下两行命令,直接到输入框里粘贴就可以。

    ssh-keygen -t rsa -N "" -f ~/Tools/jenkins.key # 生成key
    cat ~/Tools/jenkins.key | pbcopy # 把private key copy到粘贴板



     然后返回git设置,”Credentials”选择刚才输入的username就可以。



    4. Jenkins Job设置

    1). 使用shenzhen測试构建环境是否正常

    在项目的根文件夹下,先使用shenzhen直接运行測试。看是否可以成功构建。没有构建成功的话。须要google一下解决掉,再往下进行。运行一下命令进行測试:
    ”ipa build -c Release -d ~/Desktop”
    “cd ~/Desktop"
    然后上传到蒲公英或者fir.im平台。之后就能够直接在这些平台上面直接下载了
    “ipa distribute:pgyer -u USER_KEY -a APP_KEY” # 上传到蒲公英
    "ipa distribute:fir -u USER_TOKEN -a APP_ID” # 上传到fir.im

    假设发现可以打包而且下载成功。则在Job的构建里面加入下面shell命令,https://gist.github.com/lihei12345/5076a737261e97ca0856,进行构建測试。

    这个測试过程中,我这边总是会报错。在console output中查看一下错误信息: “No schemes found in Xcode project or workspace”,解决的方法例如以下:http://stackoverflow.com/questions/14368938/xcodebuild-says-does-not-contain-scheme,把workspace的shared勾选就可以。修复之后。非常顺利构建成功。


    5. fastlane

    1) 关于fastlane
    在使用shenzhen測试之后。假设一切正常,那我们就能够继续配置Job了,shenzhen已经是一个很方便的工具了。可是更近一步,有一个更加自己主动化和便于使用的工具—fastlane,我们以下基于fastlane配置用于測试分发(fir.im/TestFlight)的AdHoc Job以及上传到Appstore的App Store Job。fastlane官方关于集成Jenkins的文档, https://github.com/KrauseFx/fastlane/blob/master/docs/Jenkins.md。内部须要安装几个Jenkins插件。

    在查看fastlane之后,我发现fastlane的确很强大。能够大大简化我们的工作。尤其适合个人开发人员,可是这个还是有一定学习成本的。



    fastlane是一组工具套件,让你能够定义和执行特定环境下各种部署流程的自己主动化,它是由fastlane提供的工具(比如snapshot/sigh/deliver等)以及各种第三方工具(比如cocoapods/xctool等)连接在一起组成的,能够提供一个执行良好的可持续部署流程。例如以下图。在Test / TestFilght Beta /Appstore 这些不同的环境下,执行的部署流程是不一样的。




    以下我们说一下由fastlane提供的各种工具:
    • delivery:用于上传应用的二进制代码,应用截屏和原数据到 App Store
    • snapshot:能够自己主动化iOS应用在每一个设备上的本地化截屏过程
    • frameit:用于在应用截屏外加入设备的边框
    • PEM:能够自己主动化生成和更新应用推送通知描写叙述文件
    • sigh:能够生成并下载开发人员的应用商店配置文件
    • product:能够使用命令行在iTunes Connect中创建iOS应用以及Developer Portal
    • cert:能够自己主动创建并维护iOS的签名证书
    • codes:使用命令行来生成应用的优惠码

    2) 配置上传蒲公英的fastlane
    进入到项目根文件夹,使用 fastlane init 来初始化fastlane文件,详细步骤能够參考以下的资料:https://github.com/KrauseFx/fastlane/tree/master/docs。能够參考官方提供的各种fastlane脚本的demo来撇仅仅实现自己的项目:

    在fastlane文件里。加入直接通过ipa命令蒲公英上传: sh "ipa distribute:pgyer -f XXX.ipa -a XXX -u XXX”。对于fastlane。由于我自身精力有限,所以我眼下仅仅实现了一下简单的脚本进行上传蒲公英的操作,没有实现覆盖測试以及App Store上传的fastlane,关于这些方面的实现能够參考文章: http://www.jianshu.com/p/9ae446d76271。在fastlane中加入例如以下的脚本,gist地址: https://gist.github.com/lihei12345/3bc82ced45b267b1bc2c



    还有其它的OTA Distribution分发方式:TestFlight,HockeyApp。amazon S3,fir.im。蒲公英。FTP。邮件。只是因为fastlane眼下仅仅支持amazon s3的上传。其它上传方式必须使用 sh 运行命令。

    直接在项目文件夹以下执行”fastlane ios alpha”。查看能否够执行成功而且上传到蒲公英上面。之后打开Jenkins的Job配置,更换我们之前暂时设置的脚本,更换为使用fastlane的脚本来进行构建就可以。



    注意我们这里加入的有 “ensure_git_status_clean”,假设我们的gemfile和podfile不是最全面的,在执行Job的时候。执行”bundle install”或者”pod update”命令的时候就会对我们的文件进行改动。这样Jenkins就会报错,“Git repository is dirty! Please ensure the repo is in a clean state by commiting/stashing/discarding all changes first”。这个时候,我们仅仅须要执行一遍 “bundle install” 或者 “pod update”命令,然后把这些改动push到origin上就可以。


    6. 实现不同类型的应用

    能够參考wikipedia的fastlane脚本: https://github.com/fastlane/examples/tree/master/Wikipedia,内部实现了无需多个证书就可以实现 beta/alpha版本号实现的方式研究,这部分在<Pro Continuous Integration>有具体说明,在”Multiple Versions of the Application”章节内。


    參考资料:



    其它工具

    1) PLCrashReport



    总结,搞了两天。最终把我困惑非常久却一直懒得弄的东西搞完了,从jenkins,shenzhen,fastlane以及单元測试了解一遍等。深深感觉能够极大简化我们的工作复杂度。同一时候还有其它一些非常酷的特性,比方说HipChat/Slack这种IM的构建通知,以及github/gitlab/bitbucket的hook等等。snapshot,覆盖測试,上传appstore。可惜我眼下并没有应用场景,也就不再继续学习了。以后有须要再来学习使用。 
  • 相关阅读:
    EntityFramework 启用迁移 EnableMigrations 报异常 "No context type was found in the assembly"
    JAVA 访问FTP服务器示例(2)
    NuGet Package Manager 更新错误解决办法
    JAVA 访问FTP服务器示例(1)
    RemoteAttribute 的使用问题
    诡异的 javascript 变量
    javascript apply用法
    Babun 中文乱码
    GSM呼叫过程
    转站博客园
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5379109.html
Copyright © 2011-2022 走看看