在之前的文章中,我们介绍了使用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的配置,我这里写的比较简单,格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>compileBitcode</key>
<true/>
<key>destination</key>
<string>export</string>
<key>method</key>
<string>development</string>
<key>signingStyle</key>
<string>automatic</string>
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key>
<string>xxxxxxxx</string>
<key>thinning</key>
<string>&lt;none&gt;</string>
</dict>
</plist>

如果你觉得使用命令行的方式相对麻烦的话,可以考虑使用打包工具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项目构建结果:<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)\"}}"
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项目构建结果:<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)\"}}"
tags:
- ios
only:
- qa
when: on_success

总结

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

使用gitlab ci构建IOS包并发送通知消息到企业微信的更多相关文章

  1. 掌握使用gitlab ci构建Android包的正确方式

    最近公司在做移动端的项目,自然而然的需要搭建打包的环境.本来计划用Jenkins的,但是发现在gitlab上创建完项目后,提示去配置pipeline,于是决定用gitlab去尝试下,毕竟我觉得Jenk ...

  2. GitLab CI构建SpringBoot-2.3应用

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

  3. 使用WxPusher给自己的个人微信发送提醒消息(WxPusher微信推送服务)

    1.背景 我们很多时候,我们在服务器上运行软件,发生一些业务异常,需要给我们发送一个及时的提醒,或者是使用一些耗时软件,比如抢车票,抢课,刷优惠券当任务运行成功以后,也需要及时的发送消息给自己 ,告诉 ...

  4. 通过企业微信API接口发送消息

    最近给公司测试组内部开发一个记账小工具,当账目出现问题的时候需要发送消息通知大家,前期主要采用的QQ发送通知消息,但是有一天突然无法连接到QQ服务器,运维的同学建议采用微信的方式对接然后进行告警,所以 ...

  5. Docker Gitlab CI 部署 Spring Boot 项目

    目前在学习这一块的内容,但是可能每个人环境都不同,导致找不到一篇博客能够完全操作下来没有错误的,所以自己也写一下,记录一下整个搭建的过程. Docker 的安装这里就不赘述了,基本上几行命令都可以了, ...

  6. K8s 部署 Gitlab CI Runner

    K8s 版本:1.20.6 GitLab CI 最大的作用是管理各个项目的构建状态.因此,运行构建任务这种浪费资源的事情交给一个独立的 Gitlab Runner 来做就会好很多,而且 Gitlab ...

  7. 在 Kubernetes 上安装 Gitlab CI Runner Gitlab CI 基本概念以及 Runner 的安装

    简介 从 Gitlab 8.0 开始,Gitlab CI 就已经集成在 Gitlab 中,我们只要在项目中添加一个.gitlab-ci.yml文件,然后添加一个Runner,即可进行持续集成.在介绍 ...

  8. 3.在 Kubernetes 上安装 Gitlab CI Runner

    结合文章:1. 在 Kubernetes 上安装 Gitlab ,地址:https://www.cnblogs.com/sanduzxcvbnm/p/13852854.html 总结: 结合开头的文章 ...

  9. iOS开发,推送消息 steps

    概述:推送过程简介 一.App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请. ...

随机推荐

  1. 深入理解PHP之数组(遍历顺序)

    作者: Laruence 本文地址: http://www.laruence.com/2009/08/23/1065.html 转载请注明出处 经常会有人问我, PHP的数组, 如果用foreach来 ...

  2. VC++ QT 数组的初始化

    数组有时会初始化为0. 但加了一个 QThread 的派生类对象之后,数组就不再被初始化为0了. 所以对于数组还是要手动初始化,否则可能产生无法预料的现象.

  3. 怎么将swagger API导出为HTML或者PDF

    文章目录 将swagger API导出为HTML或者PDF 什么是Asciidoc swagger2markup-maven-plugin asciidoctor-maven-plugin 使用命令行 ...

  4. Eclipse Mac OS 安装 Subversion插件subclipse 缺失JavaHL解决方案

    安装 SVN 插件 subclipse 时可能遇到问题 subclipse 安装完成后,当我们选择使用 的时候还是会提示:javaHL not available, SVN接口选择 client:选择 ...

  5. bfs—迷宫问题—poj3984

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20591   Accepted: 12050 http://poj ...

  6. JAVA连接Excel最好用的开源项目EasyExcel,官方使用文档及.jar包下载

    EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. github地址:https://github.com/alibaba ...

  7. 程序员最喜欢用的在线IDE代码编译器,什么?你竟然不知道!

    1.网址https://tech.io/snippet 支持 20+ 种编程语言,页面上没有杂七杂八的东西,非常简约,非常干净,另外,它上面的代码段还可以嵌入到网页之中. 2.网址 https://w ...

  8. C++ 模板(template) 的定义

    定义: 模板(template)是实现代码重用机制的一种工具,它可以实现类型参数化,把类型定义为参数(模板元编程),从而实现了真正的代码可重用性. 模板是用来批量生成功能和形式都几乎相同的代码的.编译 ...

  9. Python(Redis 中 Set/Zset 类型数据和其他操作)

    1.redis 基本操作命令 Set 操作 Set 集合就是不允许重复的列表 无序集合 sadd(name,values) 给 name 对应的集合中添加 1 个或多个元素 import redis ...

  10. 一个简单的wed服务器SHTTPD(3)————SHTTPD多客户端支持的实现

    //start from the very beginning,and to create greatness //@author: Chuangwei Lin //@E-mail:979951191 ...