利用gitlab ci构建IOS包并发送关照消息到企业微信

诗林  金牌会员 | 2024-8-31 03:05:48 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 466|帖子 466|积分 1398

在之前的文章中,我们先容了利用gitlab ci构建Android包的方法。今天我们先容利用gitlab ci如何构建IOS包,而且在打包乐成大概失败时,如何将消息关照到企业微信。
  如果对gitlab ci还不熟悉的,可以参考之前的文章利用gitlab ci构建Android包,这篇文章我们重要涉及三个知识点:
  

  • IOS开发者证书。
  • IOS打包命令。
  • 如何往企业微信发消息。
  IOS开发者证书

  IOS打包离不开开发者证书,因此起首我们须要先搞清晰IOS的证书是怎么回事,它是怎么工作的。
  为什么须要证书

  我们知道,如果手机不越狱的环境下,iphone手机安装app只能通过官方的App Store。这种限制是怎么做到的呢?实在很简朴,重要用到了非对称加密
  起首苹果官方天生一堆公私钥,在全部的iphone手机里内置了一个公钥,在苹果公司的后台生存着私钥。当app开发者上传app到App Store时,会用生存在后台的私钥对App进行签名,在iphone手机上下载这个app后,用手机上的公钥来验证这个签名,如果签名验证通过,则表现这个app是由苹果后台认证的,而且没有被窜改过。
  基于这种签名机制,包管了在iphone手机上安装的每一个app都是经过苹果认证允许的。
  但是,一个新的题目来了,如果我们的app还处于开发中,还没有上传到appStore,该怎么安装到iphone手机上呢?这就须要用到开发者证书在中央做一个过渡作用。
  证书类型

  常用的开发者证书分为两种,一种是个人开发者证书,一种是企业开发者证书。其中,我们常见的有两种模式:
  

  • In-House:企业内部门发,可以直接的安装ipa包(一般是将包上传到服务端,天生链接,点击链接可以下载)。不过最新的ios体系,须要在【通用—关于本机—证书信托设置】中对企业证书进行信托。
  • Ad-Hoc:相称于是企业分发的限制版,限制100个设备安装,须要提前在苹果后台设置iphone设备的设备号(可通过第三方工具大概访问蒲公英查询)。
  须要注意的是由企业证书签名的包,是不能上传到App Store的,因此须要根据本身公司的环境申请差别的开发者证书。
  原理先容

  上面实在已经提到,证书的工作原理是通过非对称加密,从网上找了一幅图,很好的先容了这个过程:

  上图对应的步骤如下:
  

  • 在mac电脑上申请一对公私钥,图中是公钥M和私钥M。
  • 对于苹果的证书来说,跟App Store工作原理一样,在苹果后台服务器放置了私钥A,在苹果设备上存放了对应的公钥A。
  • 将公钥M上传到苹果后台,用私钥A进行签名,得到包罗公钥M及其签名。同时还有一个Provision profile(大家常说的pp文件)文件(其中包罗了AppID、设备列表、App可利用的权限),将证书文件下载到本地mac。
  • 在开发app时,利用本地的私钥M对app进行签名,连同上面的pp文件一起被打包到app中。
  • 在安装app时,ios体系获取证书,通过内置的公钥A,去验证app内的证书是精确的。如果能验证通过,则可以将App内的证书数据取出来,利用公钥M验证App的签名是否精确,验证安装app的设备ID是否存在设备列表中等。
  上面的步骤,大致形貌了苹果开发者证书的工作原理,如果你没太明白也没关系。可以结合着上图多看几遍。
  别的,这里还有个知识点,在mac电脑申请的公钥和私钥M只能在申请的电脑利用,怎么让其他伙伴也能正常利用呢?可以将私钥M导出成.p12文件,其他Mac电脑导入私钥M,就可以正常利用了。
  IOS打包

  起首打包之前,须要清理工程(workspace和scheme参数的值须要拿到ios代码才能查看):
  1. $ xcodebuild clean -workspace xxxx.xcworkspace -scheme xxxx
复制代码
其次,如果你想要ios包的构建号是自动递增的,可以利用agvtool这个工具:
  1. $ agvtool next-version -all
复制代码
接着,就可以开始archive包(对Target进行编译、归档,天生.xcarchive)。
  1. $ xcodebuild -workspace xxxx.xcworkspace -scheme xxxx -configuration Debug archive -archivePath xxxxPath/xxxxx.xcarchive
复制代码
最后,就是将归档文件导出,天生差别渠道的ipa包:
  1. $ xcodebuild -exportArchive -archivePath build/$SCHEME_NAME.xcarchive -exportPath build -exportOptionsPlist $EXPORT_OPTIONS_PLIST
复制代码
这里须要指定一个exportOptionsPlist,是对导出ipa的设置,我这里写的比较简朴,格式如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3. <plist version="1.0">
  4. <dict>
  5.         <key>compileBitcode</key>
  6.         <true/>
  7.         <key>destination</key>
  8.         <string>export</string>
  9.         <key>method</key>
  10.         <string>development</string>
  11.         <key>signingStyle</key>
  12.         <string>automatic</string>
  13.         <key>stripSwiftSymbols</key>
  14.         <true/>
  15.         <key>teamID</key>
  16.         <string>xxxxxxxx</string>
  17.         <key>thinning</key>
  18.         <string>&lt;none&gt;</string>
  19. </dict>
  20. </plist>
复制代码
如果你以为利用命令行的方式相对麻烦的话,可以思量利用打包工具fastlane(反面我再专门写文章先容)。
  发送消息关照

  企业微信中可以创建一个群机器人,然后通过webhook来进行消息关照。企业微信提供了具体的设置方式,可以参考:企业机器人设置。其本质上就是发送了一个哀求:
  1. curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa' \
  2.    -H 'Content-Type: application/json' \
  3.    -d '
  4.    {
  5.         "msgtype": "text",
  6.         "text": {
  7.             "content": "hello world"
  8.         }
  9.    }'
复制代码
我们只须要将key更换成我们创建机器人的key即可。
  整合之后的.gitlab-ci.yml设置文件

  最后贴一个我在项目中利用的设置文件,如下所示:
  1. variables:
  2.   CONFIGURATION: "Debug"
  3.   WORKSPACE: "xxxx.xcworkspace"
  4.   SCHEME_NAME: "xxxx"
  5.   EXPORT_MAIN_DIRECTORY: "build"
  6.   EXPORT_OPTIONS_PLIST: "ExportOptions-dev.plist"
  7.   CODE_SIGN_IDENTITY: "xxxxxx"
  8.   PROVISIONING_PROFILE: "xxxxx"
  9.   LANG: "en_US.UTF-8"
  10. stages:
  11.   - makedir
  12.   - archive
  13.   - ipa
  14.   - upload
  15.   - notify
  16. # 创建对应目录
  17. dir_job:
  18.   stage: makedir
  19.   script:
  20.     - mkdir $EXPORT_MAIN_DIRECTORY
  21.     - EXPORT_MAIN_DIRECTORY=$EXPORT_MAIN_DIRECTORY/$(date "+%Y%m%d%H%M%S")
  22.     - echo $EXPORT_MAIN_DIRECTORY
  23.     - mkdir $EXPORT_MAIN_DIRECTORY
  24.   tags:
  25.     - ios
  26. # 构建archive
  27. archive_job:
  28.   stage: archive
  29.   script:
  30.     - agvtool next-version -all   # 更新构建号,版本号之后再更新
  31.     - xcodebuild clean -workspace $WORKSPACE -scheme $SCHEME_NAME
  32.     - xcodebuild -workspace $WORKSPACE -scheme $SCHEME_NAME -configuration Debug archive -archivePath $EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.xcarchive
  33.   artifacts:
  34.     expire_in: '2 day'
  35.     name: "下载xcarchive,保留2天"
  36.     paths:
  37.       - $EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.xcarchive
  38.   tags:
  39.     - ios
  40. # 导出ipa
  41. ipa_job:
  42.   stage: ipa
  43.   script:
  44.     - echo 'export ipa'
  45.     - xcodebuild -exportArchive -archivePath $EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.xcarchive -exportPath $EXPORT_MAIN_DIRECTORY -exportOptionsPlist $EXPORT_OPTIONS_PLIST
  46.   artifacts:
  47.     expire_in: '5 day'
  48.     name: "下载ipa,保留5天"
  49.     paths:
  50.       - $EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.ipa
  51.   only:
  52.     - qa
  53.   tags:
  54.     - ios
  55. # 上传ipa
  56. upload_job:
  57.   stage: upload
  58.   script:
  59.     - curl -H "Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7Il9pZCI6IjVlOTE4Yzc5MmMzZGQ0MDAxZTRiOGY1YiIsInVzZXJuYW1lIjoic3VodWNoZW4ddiLCJlbWFdddpbCI6InN1aHVjaGVuQHFxLmNvbSJ9LCJleHAiOjQ3NDAxOTcyODgsImlhdCI6MTU4NjU5NzI4OH0.5UUkM4lJddYrnvXvHaNNJIY_j5OsBQmLw0mBUrXG3d9E4" -F "file=@$EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.ipa" http://上传包地址/api/apps/5e916b9eac2363001dd7554a/upload
  60.   only:
  61.     - qa
  62.   tags:
  63.     - ios
  64. # 构建失败时的通知消息
  65. notifyFailWeChat:
  66.   stage: notify
  67.   script:
  68.     - curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=26b07c1b-03ea-49da-afc7-f68a359f2a52' -H 'Content-Type:application/json' -d "{"msgtype":"markdown","markdown":{"content":"ios项目构建结果:<font color=\"warning\">失败</font>\n>本次构建由:$GITLAB_USER_NAME 触发\n>项目名称:$CI_PROJECT_NAME\n>提交号:$CI_COMMIT_SHA\n>提交日志:$CI_COMMIT_MESSAGE\n>构建分支:$CI_COMMIT_BRANCH\n>流水线地址:[$CI_PIPELINE_URL]($CI_PIPELINE_URL)"}}"
  69.   tags:
  70.     - ios
  71.   only:
  72.     - qa
  73.   when: on_failure
  74. # 构建成功时的通知消息
  75. notifySuccessWeChat:
  76.   stage: notify
  77.   script:
  78.     - curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=26b07c1b-03ea-49da-afc7-f68a359f2a52' -H 'Content-Type:application/json' -d "{"msgtype":"markdown","markdown":{"content":"ios项目构建结果:<font color=\"info\">成功</font>\n>请前往发布平台下载体验:[下载地址](http://app下载地址)\n>本次构建由:$GITLAB_USER_NAME 触发\n>项目名称:$CI_PROJECT_NAME\n>提交号:$CI_COMMIT_SHA\n>提交日志:$CI_COMMIT_MESSAGE\n>构建分支:$CI_COMMIT_BRANCH\n>流水线地址:[$CI_PIPELINE_URL]($CI_PIPELINE_URL)"}}"
  79.   tags:
  80.     - ios
  81.   only:
  82.     - qa
  83.   when: on_success
复制代码
总结

  如果你们公司目前还没搞起来Jenkins,我推荐尝试用gitlab实现ci/cd流水线,由于可以减少很多设置和插件的安装。相对来说实现资本更低一些,从目前我用gitlab ci的环境来看,基本上Jenkins能实现的gitlab ci都能满足。
     作者:布道师玄柯
   原文地点:https://www.cnblogs.com/zhouliweiblog/p/12922244.html
                喜好  0
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表