iOS利用Jenkins+Mac+gitLab+fir/蒲公英 快速打包

@[TOC](iOS利用Jenkins+Mac+gitLab+fir/蒲公英 快速打包)
原文地址:https://www.jianshu.com/p/484b038712b9

  • 简书没有标题目录啊,醉了

一、下载安装

  • 笔者直接使用brew install Jenkins完成安装
  • 然后输入Jenkins启动

二、访问Jenkins

  • 在浏览器打开地址:http://localhost:8080/
  • 使用安装包安装后会自动打开,如果端口冲突那么请修改端口defaults write /Library/Preferences/org.jenkins-ci httpPort xxxx,其中xxxx为自定义端口数字,此时打开地址为http://localhost:xxxx/

三、添加插件

  • 若选则自定义安装插件,并且注册成功登陆后
  • 系统管理>>插件管理>>AvailableXcode/gitLab相关的插件全部install加入
  • Available看不到可选则的插件,
    • 系统管理>>插件管理>>Advanced(在Available后面第二个)
    • 在这个界面拉到底部会看到Update Site标题下的URL,
    • https://updates.jenkins.io/update-center.json去掉s变为http://updates.jenkins.io/update-center.json
    • 然后回到Available添加插件

四、gitLab设置

  • 首页系统管理>>系统设置>>下拉找到GitLab

    image.png

  • 添加GitLab API token

    image.png

  • 登录自己的gitLab,copy APIToken
    image.png

五、创建新Item任务

  • 回到首页,点击新任务

    image.png

  • General

    image.png

  • SourceCodeManagement

    image.png

image.png
image.png
  • 跳过Build TriggerBuild Environment
  • Build选中Execute Shell,若没有就找执行 shell,写自定义打包脚本
    image.png

六、Item打包设置

  • 观察自己GitLab要打包的项目结构[先尝试本地打包,成功后将其中的ExportOptions.plist取出使用]

    image.png

  • 看图理解path参数


    image.png

    image.png
  • shell代码
#要打包的项目地址,若使用了cocoapods则"test1110/test1110.xcworkspace"
ProjectPath="test1110/test1110.xcodeproj"
#项目中要打包的scheme
TargetScheme="test1110"
#生成的中转文件xcarchive存放地址
ArchivePath="test1110.xcarchive"
#打包使用的配置文件地址
ExportOptionsPlistPath="ExportOptions.plist"
#打包IPA的存放文件,这个名字随便自定义,注意别跟其他path重复
ExportPath="XCBuildIPA"

xcodebuild clean -project ${ProjectPath} \
                 -scheme ${TargetScheme} \

xcodebuild archive  -project ${ProjectPath} \
                    -sdk iphoneos \
                    -scheme ${TargetScheme} \
                    -archivePath ${ArchivePath} \
                    -configuration Release \


echo "+++++++++++++++++ exportArchive +++++++++++++++++"
xcodebuild -exportArchive -archivePath ${ArchivePath}\
                          -exportPath  ${ExportPath}\
                          -exportOptionsPlist ${ExportOptionsPlistPath}\
                          -configuration Release \

七、带参数(tag、branch)的打包

  • 安装插件系统管理>>插件管理>>Available搜索Git Parameter Plug-In,下载重启
  • 来到item的设置界面General
    image.png

    image.png

    image.png
image.png
  • 此时打包变成了
    image.png

八、打包完成自动上传fir

  • 可以直接在脚本后加入上传代码,但是这要求Mac安装了fir—cli。所以还是建议用插件

  • 博文地址http://blog.fir.im/jenkins/

  • 下载插件到本地 fir插件:fir-plugin-1.9.5.hpi

  • 系统管理>>插件管理>>Advanced

    image.png

  • 重启后回到项目设置界面
    image.png
image.png

九、钉钉机器人提醒

image.png
https://oapi.dingtalk.com/robot/send?access_token=e9。。。41
  • 注意只使用access_token=后面的字符串即可
  • 系统管理>>插件管理>>Availableding得到的插件更新
  • 重启后回到项目设置界面
    image.png

十、自定义描述界面

  • description支持html:系统管理>>全局安全配置>>Markup Formatter>>Safe html

  • 增加插件系统管理>>插件管理>>Availabledescription setter plugin得到的插件更新

  • 重启后回到项目设置界面
    image.png
  • 打包成功后点击链接可以直接跳转下载,从钉钉点击跳转过来也能看到这个下载链接
    image.png

十一、邮件通知

  • Jenkins自带的

  • 通过插件扩展

    • 系统管理>>插件管理>>AvailableEmail Extension Plugin得到的插件更新
    • 系统管理>>系统设置>>Extended E-mail Notification
      image.png

      将图中标红处修改成自己使用的邮箱
  • 配置项目
    image.png

十二、配置奴隶Mac机实现自动打包:参考

  • 1.配置奴隶Mac机: 打开slave mac机,在系统偏好设置>>共享,如图

    image.png

  • 2.创建节点:系统管理>>节点管理>>NewNode

    image.png

  • 3.配置节点:
    image.png

    image.png
  • 4.修改项目配置
    image.png
重要提示:
  • Jenkins,ssh方式到slave机上,默认是没有账户的,但是访问钥匙串要求必须有用户身份,所以添加一步输入密码解锁钥匙串,可以给Jenkins一个用户身份。
    build步骤前添加一步解锁钥匙串。
security unlock-keychain -p "login pwd" ~/Library/Keychains/login.keychain
image.png

十三、自动配置项目打包模式

  • 问提:在不同的branch或者tag上,可能有的的是“autoSign”自动签名模式,有的是手动模式,而项目的的打包需要手动签名模式;如果每次自动打包都要检查一下xcode工程的配置,那也太不自动了
  • 分析:Jenkins的工作原理是 将GitLab远程库中的代码拉取到 Jenkins工作空间workspace中,然后在workspace中与打包机进行交互实现打包;而iOS项目中有关签名配置的相关数据都在某项目.xcodeproj/project.pbxproj文件中,那么我们是否可以 修改 文件,来达到统一配置呢?
    image.png
  • 此方案是可行的,脚本替换文件内容
    image.png

十四、适配Xcode10 的BuildSystem

  • 众所周知,在Xcode9升10后,项目运行会失败,报info.plist编译错误此时有两种处理方式

    • 更改Xcode配置:In Xcode, go to File -> Project/Workspace settings. -> Build System -> Legacy Build System
    • 更改项目配置:选中项目的Target->Build Phases->搜索info.plist->CopyBundleSourses中删除info.plist即可
  • 新branch我们可以通过方法2来处理,这样打包不会有问题,但是以前的老分支呢?也要去改么?这样不符合一个合格码农的习惯,其实主要采取方法1即可。

第三行代码 -UseModernBuildSystem=NO 的功能与方法1相同
echo "+++++++++++++++++ 清理工程 +++++++++++++++++"
xcodebuild clean -project ${ProjectPath} \
                 -scheme ${TargetScheme} \
                 -UseModernBuildSystem=NO \

总结

  • 其中 12的重要提示,13,14条由于是原创做法,所以花费的精力比较大
  • 最终脚本如下
#要打包的项目地址
ProjectPath="OA/CRM.xcodeproj"
#项目中要打包的scheme
TargetScheme="CRM"
#生成的中转文件xcarchive存放地址
ArchivePath="CRM.xcarchive"
#打包使用的配置文件地址,这个是存放在slave机上。
ExportOptionsPlistPath="/Users/macserver/Desktop/ExportOptions.plist"
#打包IPA的存放文件
ExportPath="XCBuildIPA"
#肉鸡的登录密码
SlaveMacPWD="macserver"
#项目配置文件地址
ProjectSettingFilePath="OA/CRM.xcodeproj/project.pbxproj"

echo "+++++++++++++++++ 若项目是自动签名,则修改配置为手动Release签名 +++++++++++++++++"
sed -i "" "s#ProvisioningStyle = Automatic#ProvisioningStyle = Manual#g" ${ProjectSettingFilePath}
sed -i "" "s#CODE_SIGN_STYLE = Automatic#CODE_SIGN_STYLE = Manual#g" ${ProjectSettingFilePath}

sed -i "" "s#PROVISIONING_PROFILE = \"\"#PROVISIONING_PROFILE = \"dc28777c-0cde-4bb2-b9bf-6c6a4c55aa76\"#g" ${ProjectSettingFilePath}
sed -i "" "s#PROVISIONING_PROFILE_SPECIFIER = \"\"#PROVISIONING_PROFILE_SPECIFIER = \"Xueersi.WangXiao.CRM(Dis)\"#g" ${ProjectSettingFilePath}
sed -i "" "s#DEVELOPMENT_TEAM =.*#DEVELOPMENT_TEAM = 6BUND8EFF7;#g" ${ProjectSettingFilePath}
sed -i "" "s#DevelopmentTeam =.*#DevelopmentTeam = 6BUND8EFF7;#g" ${ProjectSettingFilePath}
#若项目bundle id不是com.Xueersi.CRM(target项目的bundle id)那么别替换了,打包失败很正常
#sed -i "" "s#PRODUCT_BUNDLE_IDENTIFIER =.*#PRODUCT_BUNDLE_IDENTIFIER = com.Xueersi.CRM;#g" ${ProjectSettingFilePath}



echo "+++++++++++++++++ 解锁slave机的钥匙串权限 +++++++++++++++++"
security unlock-keychain -p ${SlaveMacPWD} ~/Library/Keychains/login.keychain

echo "+++++++++++++++++ 清理工程 +++++++++++++++++"
xcodebuild clean -project ${ProjectPath} \
                 -scheme ${TargetScheme} \
                 -UseModernBuildSystem=NO \
                 
                 
echo "+++++++++++++++++ 开始打包 +++++++++++++++++"
xcodebuild archive  -project ${ProjectPath} \
                    -sdk iphoneos \
                    -scheme ${TargetScheme} \
                    -archivePath ${ArchivePath} \
                    -configuration Release \
                    -UseModernBuildSystem=NO \


echo "+++++++++++++++++ 导出打包 +++++++++++++++++"
xcodebuild -exportArchive -archivePath ${ArchivePath}\
                          -exportPath  ${ExportPath}\
                          -exportOptionsPlist ${ExportOptionsPlistPath}\
                          -configuration Release \

echo "+++++++++++++++++ 上传蒲公英 +++++++++++++++++"
#蒲公英账号对应的userkey与apikey,只需替换这俩参数即可切换上传地址
PGYUserKey="蒲公英账号对应的userkey(这里我手动打码)"
PGYAPIKey="蒲公英账号对应的apikey(这里也打码)"
curl -F "file=@${ExportPath}/CRM.ipa" -F "uKey=${PGYUserKey}" -F "_api_key=${PGYAPIKey}" https://qiniu-storage.pgyer.com/apiv1/app/upload                          
                           

附:Jenkins 自动打包问题

一、Command /Applications/Xcode.app/Contents/Developer/usr/bin/actool failed with exit code 255

failed content

The following build commands failed: CompileAssetCatalog /Users/macserver/Library/Developer/Xcode/DerivedData/CRM-aghqpbaaoycsdgddnnenvhgeuxjo/Build/Intermediates.noindex/ArchiveIntermediates/CRM/InstallationBuildProductsLocation/Applications/CRM.app CRM/Assets.xcassets

参考答案1:link
  • That happened because of JPG images in assets catalog, so I imported jpg images directly in the project, and now it works
  • I had the same issue with Xcode V7b6 and JPG images in assets. Strangely this was working for some JPGs but not for others. Then I've looked at the JPGs and their color profile, exif data and other meta stuff and indeed removing these data (via GraphicConverter) solved it for us and Xcode now builds fine.
  • Pdf files in image assets will cause this error. I use png files for @1x @2x @3x images and Xcode works fine.
  • This error happened with me because the image name contained some unsupported characters (it was saved by Xcode as c71a25e%2FÍcone-XPTO Imagem - 120x120.png, even when placed in .xcassets). Changing the image name solved this error for me.

二、Command /usr/bin/codesign failed with exit code 1:errSecInternalComponent

failed content

/Users/macserver/Library/Developer/Xcode/DerivedData/CRM-aghqpbaaoycsdgddnnenvhgeuxjo/Build/Intermediates.noindex/ArchiveIntermediates/CRM/InstallationBuildProductsLocation/Applications/CRM.app: errSecInternalComponent

参考答案 链接

  • 大部分答案都告诉你重启机器
  • 根本原因是Jenkins,ssh方式到slave机上,默认是没有账户的,但是访问钥匙串要求必须有用户身份,所以添加一步输入密码解锁钥匙串,可以给Jenkins一个用户身份。
    build步骤前添加一步解锁钥匙串。
security unlock-keychain -p "login pwd" ~/Library/Keychains/login.keychain

三、自动手动冲突问题

failed content

Check dependencies Code Signing Error: CRM has conflicting provisioning settings. CRM is automatically signed for development, but a conflicting code signing identity iPhone Distribution has been manually specified. Set the code signing identity value to "iPhone Developer" in the build settings editor, or switch to manual signing in the project editor.

修复思路,文件内容替换

  • 要替换的文件是项目的配置文件
    OA/CRM.xcodeproj/project.pbxproj

  • 脚本语法

sed -i "" "s#被替换的旧内容#替换成的内容#g" 被替换内容的文件的Path
比如:
sed -i "" "s#ProvisioningStyle = Automatic#ProvisioningStyle = Manual#g" OA/CRM.xcodeproj/project.pbxproj
被替换的旧内容:ProvisioningStyle = Automatic
替换成的内容:ProvisioningStyle = Manual
被替换内容的文件的Path:OA/CRM.xcodeproj/project.pbxproj
  • ProvisioningStyle
    ProvisioningStyle = Automatic; 替换为
    ProvisioningStyle = Manual;
  • CODE_SIGN_STYLE
    CODE_SIGN_STYLE = Automatic 替换为
    CODE_SIGN_STYLE = Manual
AutomaticManual修改完成后

iPhoneConnect: ## Unable to mount developer disk image, (Error Domain=com.apple.dtdevicekit Code=601 "Could not locate device support files." UserInfo={DeviceType=iPhone7,1, NSLocalizedDescription=Could not locate device support files., NSLocalizedRecoverySuggestion=This iPhone 6 Plus is running iOS 12.0 (16A366), which may not be supported by this version of Xcode.}) { DeviceType = "iPhone7,1"; NSLocalizedDescription = "Could not locate device support files."; NSLocalizedRecoverySuggestion = "This iPhone 6 Plus is running iOS 12.0 (16A366), which may not be supported by this version of Xcode."; } Code Signing Error: "CRM" requires a provisioning profile with the Push Notifications feature. Select a provisioning profile for the "Release" build configuration in the project editor.

  • 经过检查
PROVISIONING_PROFILE = "";
PROVISIONING_PROFILE_SPECIFIER = "";
需要替换为
PROVISIONING_PROFILE = "dc28777c-0cde-4bb2-b9bf-6c6a4c55aa76";
PROVISIONING_PROFILE_SPECIFIER = "Xueersi.WangXiao.CRM(Dis)";
现在跑3.14,3.15. 3.13 正常了,然后到3.12时候又报错

Code Signing Error: Signing for "CRM" requires a development team. Select a development team in the build settings editor that matches the selected profile "Xueersi.WangXiao.CRM(Dis)".

明显是没有development team
经过检查
DEVELOPMENT_TEAM = ""需要替换为DEVELOPMENT_TEAM = 6BUND8EFF7
DevelopmentTeam = 246724P5ZQ;需要替换为DevelopmentTeam = 6BUND8EFF7;
PRODUCT_BUNDLE_IDENTIFIER = com.Xueersi.CRM022;>>PRODUCT_BUNDLE_IDENTIFIER = com.Xueersi.CRM;

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