Jenkins持续集成iOS项目

(Continuous Integration)
-自动编译打包IPA-

持续集成是一种软件开发实践:许多团队频繁地集成他们的工作,每位成员通常进行日常集成,进而每天会有多种集成。每个集成会由自动的构建(包括测试)来尽可能快地检测错误。许多团队发现这种方法可以显著的减少集成问题并且可以使团队开发更加快捷。

CI是一种开发实践。实践应该包含3个基本模块,一个可以自动构建的过程,自动编译代码,可以自动分发,部署和测试。一个代码仓库,SVN或者Git。最后一个是一个持续集成的服务器。通过持续集成,可以让我们通过自动化等手段高频率地去获取产品反馈并响应反馈的过程。

步骤如下:
安装Jenkins
下载地址:https://jenkins.io/ 上下载最新的pkg安装包。

image.png

image.png

image.png

image.png

[图片上传中...(image.png-602371-1517382116220-0)]

image.png

安装完成之后,Safari可能会自动打开,如果没有自动打开,打开浏览器,输入http://localhost:8080

这个时候可能会报一个错误。如果出现了这面的问题。出现这个问题的原因就是Java环境有问题,重新Java环境即可。

这个时候如果你重启电脑会发现Jenkins给你新增了一个用户,名字就叫Jenkins,不过这个时候你不知道密码。你可能会去试密码,肯定是是不对的,因为初始密码很复杂。这个时候正确做法是打开http://localhost:8080 会出现重设初始密码的界面[图片上传中...(屏幕快照 2018-02-07 下午2.35.50.png-ab5e80-1517985423920-0)]

按照提示,找到/Users/Shared/Jenkins/Home/ 这个目录下,这个目录虽然是共享目录,但是有权限的,非Jenkins用户/secrets/目录是没有读写权限的。

image.png

image.png

打开initialAdminPassword文件,复制出密码,就可以填到网页上去重置密码了。如下图


image.png

image.png

image.png
image.png
image.png

image.png
image.png

一路安装过来,输入用户名,密码,邮件这些,就算安装完成了。
还是继续登录localhost:8080 ,选择“系统管理”——“管理插件”,我们要先安装一些辅助插件。

三、配置Jenkins用户
1、默认情况下,Jenkins是不能登录和注册的,必须配置之后页面才能出现登录和注册的页面。

2、步骤:点击“首页面”—>“系统管理” —> “Configure Global Security”,
配图如下:

[图片上传失败...(image-7d248b-1517985499900)]
490CDA80-2252-463F-B4B5-0AAAC8C2A783.png
image.png

3、Configure Global Security配置:


image.png

4、注册:


image.png
image.png

5、登录:

四、安装管理插件
1、步骤:点击“首页面”—>“系统管理”—> “管理插件”—> “可选插件”
2、可选插件
在“可选插件”中选中“GitLab Plugin”和“Gitlab Hook Plugin”这两项,然后安装。


image.png

3)安装Xcode插件
同安装GitLab插件的步骤一样,我们依次选择系统管理->管理插件,在“可选插件”中选中“Xcode integration”安装。


image.png

Keychains and Provisioning Profiles Management(打包签名)
举例配图:

image.png

image.png

五、配置keychains and Provisioning Profiles Management
1、前提:Mac电脑安装好“开发者签名证书” 和 “Provisioning证书(打包IPA)”
2、步骤:点击“首页面”—>“系统管理”—> “Keychain and Provisioning Profiles Management”
tips:必须先安装Keychains and Provisioning Profiles Management 插件才可以看到此链接


image.png

3、配置Keychains

1) Step one: 上传System.keychain到Jenkins目录


image.png
    Jenkins查看上传的keychain路径:
        /Users/Shared/Jenkins/Home/kpp_upload
image.png
    2) Step two: 配置Keychains的具体信息 

    tips:如果不知道签名在哪里的,可以去Mac电脑应用程序中找到“钥匙串访问”,拷贝出签名,粘贴到上图(4)步骤中 
image.png
4、配置Provisioning Profiles
    1) Step one: 上传xxxx.mobileprovision到Jenkins目录
    如同配置Keychains的 Step one一致,只是文件路径不一样
        tips:不知道xxxx.mobileprovision在哪?
        去开发者网站下载(具体细节自己百度)
        https://developer.apple.com/

    2) Step two:配置Provisioning Profiles 具体信息 
image.png
5、以上配置完成
    1) 配置不正确的,可以重新删除再配置
    2) 这里配置是iPhone Developer案例,值得注意的是证书导入钥匙串后要修改下权限,如下图:
image.png

六、新建Jobs
1、步骤:点击“首页面”—>“新建”

image.png

2、配置“源码管理”—> Git
1) Repository URL : 仓库地址
2) Credentials : 仓库用户名和密码
3) 配置完成,构建一次,看是否能从Git获取代码,
并保存到Jenkins用户中。
3、构建


image.png

脚本如下:

#项目路径
Jobname="/Users/yingjinping/workspace/jenkins/workspace/ios/Consumer-iOS-Channel/"
#项目名称
AppName="Consumer-Ios"
#ipa的外部统一存放文件夹
DeployName="ConsumerDeploy"
#证书
CODE_SIGN_DISTRIBUTION="iPhone Developer: tengfei shao"
# info.plist路径
project_infoplist_path=${Jobname}${AppName}/Info.plist

echo ${project_infoplist_path}
#取版本号
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" ${project_infoplist_path})
#取build值
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${project_infoplist_path}")
#日期(到哪一天)
DATE_DAY="$(date +%Y%m%d)"
#日期(到秒)
DATE="$(date +%Y%m%d)-$(date +%H%M%S)"
echo ${bundleShortVersion}
echo ${bundleVersion}
echo ${DATE}
echo ${DATE_DAY}

#!/bin/sh
# 解锁对login.keychain的访问,codesign会用到
security unlock-keychain -p 123456 /Users/yingjinping/Library/Keychains/login.keychain
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k 123456 /Users/yingjinping/Library/Keychains/login.keychain
security set-keychain-settings /Users/yingjinping/Library/Keychains/login.keychain
# 清除
xcodebuild -workspace ${Jobname}${AppName}.xcworkspace -scheme ${AppName}  -configuration 'Debug' clean
# 打包签名
xcodebuild -workspace ${Jobname}${AppName}.xcworkspace -scheme Consumer-Ios -sdk iphoneos -configuration 'Debug' CODE_SIGN_IDENTITY="iPhone Developer: tengfei shao"
#创建ipa的存放路径
mkdir -p ${Jobname}${DeployName}/${bundleShortVersion}/deploy/${DATE}
# 导出ipa
xcrun -sdk iphoneos PackageApplication -v /Users/yingjinping/Library/Developer/Xcode/DerivedData/Consumer-Ios-apcosxndlglcvicjvgkopvvnxwcr/Build/Products/Debug-iphoneos/Consumer-Ios.app -o ${Jobname}${DeployName}/${bundleShortVersion}/deploy/${DATE}/${AppName}-${DATE}.ipa


echo copystart
awk 'BEGIN { cmd="cp -r ~/workspace/jenkins/workspace/ios/Consumer-iOS-Channel/ConsumerDeploy ~/share/projectFile/Ios/"; print "n" |cmd; }'
echo copyend

#蒲公英上的User Key
uKey="b1398adefd0c6c8e131317f3438a4b76"
#蒲公英上的API Key
apiKey="cf3d47a21becaeba2117d8ec933913f1"
#要上传的ipa文件路径
IPA_PATH=${Jobname}${DeployName}/${bundleShortVersion}/deploy/${DATE}/${AppName}-${DATE}.ipa

rm -rf text.txt

#执行上传至蒲公英的命令
echo "++++++++++++++upload+++++++++++++"
curl -F "file=@${IPA_PATH}" -F "uKey=${uKey}" -F "_api_key=${apiKey}" http://www.pgyer.com/apiv1/app/upload
# 备注:
# /Users/yingjinping/Library/Developer/Xcode/DerivedData/Consumer-Ios-apcosxndlglcvicjvgkopvvnxwcr/Build/Products/Debug-iphoneos/Consumer-Ios.app该路径是Jenkins自动打包APP的路径
# ${Jobname}${DeployName}/${bundleShortVersion}/deploy/${DATE}/${AppName}-${DATE}.ipa  该路径是打包好的ipa存放的路径

·····

5、保存好,继续“立即构建项目”,测试项目是否能跑通

6、配置“构建触发器”—>自动构建项目

语法结构:
每行包括5个部分,可以用空格或者tab分隔
* * * * *
第一个:表示分钟 minute(0-59)
第二个:表示小时 hour (0-23)
第三个:表示天 dom (1-31)
第四个:表示月 month (1-12)
第五个:表示周 dow (0-7) 0和7都表示周日
例如: (Build periodically中设置)
H/15 * * * *
表示:每隔15分钟执行一次
H(0-29)/10 * * * *
表示:每个小时的前半小时,每隔10分钟执行一次
H 9-16/2 * * 1-5
表示:工作日(周一~周五)每隔2小时执行一次
H H(5-6) * * *
表示:每天早上6点执行一次
H H 1,15 1-11 *
表示:除了12月份,每月1号、15号每天执行一次

```

7、配置“Git”—> 补充说明
经过以上配置,才能从git上下载代码,插件安装好!

`

CB13EA0E-DCEE-4673-8396-6C717EC8600A.png
屏幕快照 2018-02-07 下午5.10.49.png
3AA6E252-528C-4210-A4BC-E32F3BBA8764.png
3E6C9002-BA76-45D9-9938-545673711985.png
屏幕快照 2018-02-07 下午5.19.44.png
屏幕快照 2018-02-07 下午5.28.46.png
屏幕快照 2018-02-08 上午11.15.38.png

推荐阅读更多精彩内容