在之前的文章中,我们介绍了使用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代码才能查看):

$ xcodebuild clean -workspace xxxx.xcworkspace -scheme xxxx

其次,如果你想要ios包的构建号是自动递增的,可以使用agvtool这个工具:

$ agvtool next-version -all

接着,就可以开始archive包(对Target进行编译、归档,生成.xcarchive)。

$ xcodebuild -workspace xxxx.xcworkspace -scheme xxxx -configuration Debug archive -archivePath xxxxPath/xxxxx.xcarchive

最后,就是将归档文件导出,生成不同渠道的ipa包:

$ xcodebuild -exportArchive -archivePath build/$SCHEME_NAME.xcarchive -exportPath build -exportOptionsPlist $EXPORT_OPTIONS_PLIST

这里需要指定一个exportOptionsPlist,是对导出ipa的配置,我这里写的比较简单,格式如下:

compileBitcode

destination

export

method

development

signingStyle

automatic

stripSwiftSymbols

teamID

xxxxxxxx

thinning

<none>

如果你觉得使用命令行的方式相对麻烦的话,可以考虑使用打包工具fastlane(后面我再专门写文章介绍)。

发送消息通知

企业微信中可以创建一个群机器人,然后通过webhook来进行消息通知。企业微信提供了详细的配置方式,可以参考:企业机器人配置。其本质上就是发送了一个请求:

curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa' \

-H 'Content-Type: application/json' \

-d '

{

"msgtype": "text",

"text": {

"content": "hello world"

}

}'

我们只需要将key替换成我们创建机器人的key即可。

整合之后的.gitlab-ci.yml配置文件

最后贴一个我在项目中使用的配置文件,如下所示:

variables:

CONFIGURATION: "Debug"

WORKSPACE: "xxxx.xcworkspace"

SCHEME_NAME: "xxxx"

EXPORT_MAIN_DIRECTORY: "build"

EXPORT_OPTIONS_PLIST: "ExportOptions-dev.plist"

CODE_SIGN_IDENTITY: "xxxxxx"

PROVISIONING_PROFILE: "xxxxx"

LANG: "en_US.UTF-8"

stages:

- makedir

- archive

- ipa

- upload

- notify

# 创建对应目录

dir_job:

stage: makedir

script:

- mkdir $EXPORT_MAIN_DIRECTORY

- EXPORT_MAIN_DIRECTORY=$EXPORT_MAIN_DIRECTORY/$(date "+%Y%m%d%H%M%S")

- echo $EXPORT_MAIN_DIRECTORY

- mkdir $EXPORT_MAIN_DIRECTORY

tags:

- ios

# 构建archive

archive_job:

stage: archive

script:

- agvtool next-version -all # 更新构建号,版本号之后再更新

- xcodebuild clean -workspace $WORKSPACE -scheme $SCHEME_NAME

- xcodebuild -workspace $WORKSPACE -scheme $SCHEME_NAME -configuration Debug archive -archivePath $EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.xcarchive

artifacts:

expire_in: '2 day'

name: "下载xcarchive,保留2天"

paths:

- $EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.xcarchive

tags:

- ios

# 导出ipa

ipa_job:

stage: ipa

script:

- echo 'export ipa'

- xcodebuild -exportArchive -archivePath $EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.xcarchive -exportPath $EXPORT_MAIN_DIRECTORY -exportOptionsPlist $EXPORT_OPTIONS_PLIST

artifacts:

expire_in: '5 day'

name: "下载ipa,保留5天"

paths:

- $EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.ipa

only:

- qa

tags:

- ios

# 上传ipa

upload_job:

stage: upload

script:

- curl -H "Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7Il9pZCI6IjVlOTE4Yzc5MmMzZGQ0MDAxZTRiOGY1YiIsInVzZXJuYW1lIjoic3VodWNoZW4ddiLCJlbWFdddpbCI6InN1aHVjaGVuQHFxLmNvbSJ9LCJleHAiOjQ3NDAxOTcyODgsImlhdCI6MTU4NjU5NzI4OH0.5UUkM4lJddYrnvXvHaNNJIY_j5OsBQmLw0mBUrXG3d9E4" -F "file=@$EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.ipa" http://上传包地址/api/apps/5e916b9eac2363001dd7554a/upload

only:

- qa

tags:

- ios

# 构建失败时的通知消息

notifyFailWeChat:

stage: notify

script:

- 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项目构建结果:失败\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)\"}}"

tags:

- ios

only:

- qa

when: on_failure

# 构建成功时的通知消息

notifySuccessWeChat:

stage: notify

script:

- 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项目构建结果:成功\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)\"}}"

tags:

- ios

only:

- qa

when: on_success

总结

如果你们公司目前还没搞起来Jenkins,我推荐尝试用gitlab实现ci/cd流水线,因为可以减少很多配置和插件的安装。相对来说实现成本更低一些,从目前我用gitlab ci的情况来看,基本上Jenkins能实现的gitlab ci都能满足。

gitlable iphone_使用gitlab ci构建IOS包并发送通知消息到企业微信相关推荐

  1. 使用gitlab ci构建IOS包并发送通知消息到企业微信

    在之前的文章中,我们介绍了使用gitlab ci构建Android包的方法.今天我们介绍使用gitlab ci如何构建IOS包,并且在打包成功或者失败时,如何将消息通知到企业微信. 如果对gitlab ...

  2. GitLab CI构建SpringBoot-2.3应用

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. GitLab CI 构建过程中映射Kubernetes上的MySQL端口

    文章目录 1. 前言 2. Gitlab项目配置变量 3. 修改.gitlab-ci.yml文件 1. 前言 我所在团队一样,测试环境的MySQL在阿里云的Kubernetes集群上,但是又没有映射一 ...

  4. Ubuntu GitLab CI Docker ASP.NET Core 2.0 自动化发布和部署(1)

    相关博文: Ubuntu 简单安装和配置 GitLab Ubuntu 简单安装 Docker Ubuntu Docker 简单安装 GitLab Ubuntu Docker 安装和配置 GitLab ...

  5. kubernetes安装_在 Kubernetes 上安装 Gitlab CI Runner

    在 Kubernetes 上安装 Gitlab CI Runner​www.qikqiak.com 上节课我们使用 Helm 快速的将 Gitlab 安装到了我们的 Kubernetes 集群中,这节 ...

  6. 使用 Docker 部署 GitLab CI Runner

    点击在我的博客 xuxusheng.com 中查看,有更好的排版哦~ 一.背景 当项目比较少,或者更新不频繁的时候(或者技术比较菜的时候),手动部署部署还能够接受,但是一旦部署次数频繁了,手动操作就是 ...

  7. 企业微信Jenkins构建通知插件 1.1.3版本发布

    该插件适用于使用"企业微信"工作的小伙伴,在Jenkins项目构建时使用群机器人进行状态通知需要不低于企业微信 2.8.7版本 修复Pipeline下无法显示project名称问题 ...

  8. iOS之深入解析CocoaPods的GitLab CI与组件自动化构建与发布

    一.Gitlab CI/CD 简介 ① GitLab GitLab 是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或 ...

  9. ci 数据库异常捕获_系统地捕获错误:如何通过4个步骤构建GitLab CI测试管道

    ci 数据库异常捕获 by Joyz 通过乔伊斯 系统地捕获错误:如何通过4个步骤构建GitLab CI测试管道 (Catch bugs systematically: how to build a ...

最新文章

  1. C 语言中 void* 详解及应用介绍
  2. 我的世界正版moba服务器,《我的世界》需要氪金?反观《迷你世界》才知道差距!...
  3. android对话框的使用(下)
  4. 再读UNPv1:复习、实践、小结
  5. Editplus PHP版
  6. 游戏外挂的基本编写原理
  7. 初学SpringMVC,使用MVC进行文件上传
  8. python nlp_Python NLP入门教程
  9. Python_迭代器和生成器的复习_38
  10. PyQt5学习笔记01----第一个窗口
  11. 正则表达式学习笔记010--子表达式的认识与应用
  12. python生成随机字符串包含数字字母_用大写字母和数字随机生成字符串
  13. mysql为何500w拆表_【mysql】MySQL 单表500W+数据,查询超时,如何优化呢?
  14. 服务器硬件工程师从入门到精通_硬件工程师必阅--如何“0基础”从入门到精通?(附CAD使用指南)...
  15. Java给树加子节点个数统计
  16. 基于51单片机利用ADC0808芯片实现A/D转换。
  17. 【刘润五分钟商学院】-161白马不是马吗?
  18. php短信接口怎么用,php短信接口接入详细过程
  19. 你为什么要进入IT行业呢?
  20. iOS 常用快捷键 摆脱菜鸟!!

热门文章

  1. ios信号从4g变成无服务器,苹果信号满格显示是4g却没网络
  2. java 中jtable_java中使用JTable控件
  3. input标签的值只能两位小数_解决input只能输入金额类型的方案(金额输入框只能输入2位小数)...
  4. esxi usb插口_酷暑大作战 | USB-C风扇新体验
  5. c语言math函数 sgn,常用矩阵计算C语言代码
  6. mysql 获取昨天凌晨_MySQL慢日志体系建设
  7. 一个cube的大小位置方向不断和另一个cube重合
  8. C语言的putpiel函数,C语言graphics.h函数介绍
  9. 卡巴斯基安全浏览器_卡巴斯基杀毒软件被曝出用户上网痕迹泄露漏洞
  10. arduinowifi.send怎么获取响应_ChatterBot代码解读-获取对话