Jenkins在MAC上搭建CI(持续化集成)终结版

站在996的风口浪尖上,百度,google,查阅各种资料博客后,历经40次的构建终于用jenkins在MAC上实现了iOS App的CI(持续集成)一键上传App到蒲公英,网上资料很多老旧或者不够完善或者坑比较多,于是乎本人踩了一个又一个的坑才爬了起来,于是乎今天就贴个比较完善的,让大家尽量少踩坑,尽快实现一个CI(持续集成)的Jenkins部署,如果觉得本文不错别忘记点赞哟!!

首先要准备的case

  • 一台MAC,原因是iOS打包无法在Linux上进行,因为Jenkins的Xcode插件需要调用Xcode,Xcode只能在OSX系统下安装,如果非要在Linux上实现,可以建立节点,过程过于繁琐,此处忽略

  • 保存下面(jenkins的启动与关闭)后期部署会经常用到

    jenkins -h//启动Jenkins
    control + c //快捷键关闭Jenkins
    
  • 把工程的证书配置为企业证书,release模式

  • 打开钥匙串,找到企业证书的根证书,例如:iPhone Distribution: xxx Co., LTD,点击小箭头,出现钥匙的图片后右键选择-显示简介-访问控制-允许所有应用程序访问此项目-存储更改(这步很重要不可少,是为了给jenkins一个访问权限)

安装jenkins

  • 首先执行下面命令行查看是否有jenkins依赖的java环境,出现类似$ java version "1.8.xx"说明已安装java环境,没有安装换版本过低的可以到这里下载安装,或者Google 百度

    $ java –version
    
  • 安装HomeBrew,jenkins依赖HomeBrew包管理,执行如下命令行查看是否已安装,没安装的请移步Google,百度

    $ brew -v
    
  • 安装完HomeBrew后,执行以下命令行,安装jenkins,安装时间较长,耐心等待,出现Jenkins is fully up and running字样后,说明安装成功已启动

    $ brew install jenkins
    //需要删除Jenkins可以执行命令行
    $ sh "/Library/Application Support/Jenkins/Uninstall.command"
    //使用brew安装的可以执行
    $ brew uninstall jenkins
    
  • 在浏览器中输入http://localhost:8080,首次安装应该会出现如下界面,这里需要你去找到Jenkins的初始密码,这个界面不要关闭先放着

    image

  • 去找到Jenkins的初始密码,首先显示隐藏文件夹执行下面命令行显示隐藏文件夹,密码在上图红色的路径文件里面,密码最好备份一下,后续可能会用到

    defaults write com.apple.finder AppleShowAllFiles YES
    
  • 输入密码后选择推荐安装,默认选中的,如果部分插件安装失败,可以后续手动安装,之后会弹出如下图,创建管理员,记住密码,之后登陆用的就是这个密码了,创建之后就会进入Jenkins的主界面


    image

安装Jenkins插件

  • 点击系统管理-管理插件-可选插件,可以搜索插件,公司项目是托管在gitlab上的,所以我选的插件有(用其他托管代码的可以对应选择插件)
    Gitlab Hook Plugin
    GitLab Plugin
    Xcode integration //用于打包ipa xcode9以后这个插件不好用了
image

image

构建项目

  • 点击新建Item-输入项目名(建议所有名统一用工程名,避免出现各种坑)-构建一个自由风格的软件项目-确定

  • 基础配置 描述可以随意填写 其它选择默认 如下图


    image
  • 源码管理 我的代码托管在gitlab所以选git,Repository URL填写项目的load地址,Credentials选择右方Add,在弹出的视图中选择kind-username with password,填写username和password为代码托管的账号和密码,登录成功后Credentials选择刚填写的账号,Branch Specifier (blank for 'any')选择默认或者修改为自己想要的分支,其它选项选择默认,配置成功后红色字样是不显示的,分支默认为master也可指定为自己创建的分支名,指定后构建的是指定分支的代码


    image

    image
  • 构建触发器 此处先不做设置 等输出ipa后再来编辑,也可不作处理

  • 构建环境 首先去Jenkins首页找到如下图选项点击进去


    image

如下图选择文件(证书配置文件)-upload,上传对应的证书配置文件,点击保存,之后可以构建环境选择证书配置文件


image
  • 选择Mobile Provisioning Profiles(证书配置文件)- Provisioning Profile选择项目的企业版生产证书,点击应用,其它选项默认不选


    image
  • 此时可以在项目页面,点击立即构建,正常情况下是成功构建的,如下图蓝色下图标代表构建成功,点击蓝色小图标后的时间进入页面,点击Console Output查看输出日志如下图,若构建失败请参看文章末尾常见问题或者百度Google

image

image
  • 构建 首先需要准备一个ExportOptions.plist的文件,可以用Xcode配置对应的证书先打个ipa包在输出的文件夹中将ExportOptions.plist拷贝出来,放到项目的文件夹下,更新到代码仓库,因为Xcode 9 默认不允许访问钥匙串的内容,必须要设置 allowProvisioningUpdates,但是由于 Xcode integration 插件封闭,并不能对其进行修改加上这个属性,而且xcode构建容易出各种坑,所以使用 Shell 脚本代替插件,选择增加构建步骤-Execute shell,脚本如下(建议脚本中的文件或文件夹名先统一用工程名(Mac用户名除外),以免踩各种坑,待构建成功后再去自己定义想要的名字),复制脚本修改对应自己工程的信息,如果是 project 的项目,那就将下面脚本第一段的 -workspace 工程名.xcodeproj 修改为 -project 工程名.xcworkspace 即可。

    xcodebuild -archivePath "/Users/MAC用户  名/.jenkins/workspace/jenkins构建项目时的项目名/build/Debug-iphoneos/工程名.xcarchive" -workspace 工程名.xcworkspace -sdk iphoneos -scheme "工程名" -configuration "Debug" archive
     
    xcodebuild -exportArchive -archivePath "/Users/MAC用户名/.jenkins/workspace/jenkins构建项目时的项目名/build/Debug-iphoneos/工程名.xcarchive" -exportPath "/Users/MAC用户名/.jenkins/workspace/jenkins构建项目时的项目名/build/ipa包文件夹(可以自定义名)名称" -exportOptionsPlist '/Users/MAC用户名/.jenkins/workspace/jenkins构建项目时的项目名/ExportOptions.plist' -allowProvisioningUpdates
    
    #蒲公英上的User Key
    uKey="545c527xxxxx49abb3a8b8"
    #蒲公英上的API Key
    apiKey="19fxxxxxxda919adfe8"
    #要上传的ipa文件路径
    IPA_PATH="${WORKSPACE}/build/ipa包/xxxx.ipa"
    #安装密码
    PASSWORD="xxx"
    
    #执行上传至蒲公英的命令
    echo "++++++++++++++upload+++++++++++++"
    curl -F "file=@${IPA_PATH}" -F "uKey=${uKey}" -F     "_api_key=${apiKey}" -F "password=${PASSWORD}"   http://www.pgyer.com/apiv1/app/upload
    

    这是构建生成.xcarchive文件的存放路径

    xcodebuild -archivePath "/Users/MAC用户名/.jenkins/workspace/jenkins构建项目时的项目名/build/Debug-iphoneos/工程名.xcarchive"
    

    这是存放.xcarchive文件的路径,必须与上面路径保持一致

    xcodebuild -exportArchive -archivePath "/Users/MAC用户名/.jenkins/workspace/jenkins构建项目时的项目名/build/Debug-iphoneos/工程名.xcarchive"
    

    这是生成.ipa文件的存放路径

    -exportPath "/Users/MAC用户名/.jenkins/workspace/jenkins构建项目时的项目名/build/ipa包文件夹(可以自定义名)名称"
    

    这是jenkins构建时拉下代码的文件夹中ExportOptions.plist所在的路径

    -exportOptionsPlist '/Users/MAC用户名/.jenkins/workspace/jenkins构建项目时的项目名/ExportOptions.plist' -allowProvisioningUpdates
    

    注意:在上传蒲公英的脚本中ipa的路径要到.ipa文件为止

  • 至此可点击立即构建,构建成功后将会在finder-Macintosh HD -用户-用户-.jenkins(隐藏文件)-workspace-、、、如下图文件中看到生成的.ipa .xcarchive 工程代码等文件


    image

项目构建的常见问题

  • 缺少ExportOptions.plist,解决办法:用xcode打包生成ExportOptions.plist文件 放在工程文件下

    Error Domain=NSCocoaErrorDomain Code=260 "The file   “ExportOptions.plist” couldn’t be opened because there is no such   file." UserInfo=  {NSFilePath=/Users/sky/.jenkins/workspace/xxx/build/ExportOptio  ns.plist, NSUnderlyingError=0x7fd9d5776430 {Error   Domain=NSPOSIXErrorDomain Code=2 "No such file  or directory"}}
    
  • 证书配置的不对
    error: exportArchive: "xxx.app" requires a provisioning profile with the Push Notifications feature.

  • sheme不对
    xcodebuild: error: If you specify a workspace then you must also specify a scheme. Use -list to see the schemes in this workspace.

推荐阅读更多精彩内容