1、背景
Apple开发证书存在一年一度过期的情况,证书的不匹配,或者新环境下的流水线、以及后续可能存在的集群化构建,可能需要手动配置证书后才能正常执行构建任务
2、方案
为了使构建流水线不需要跟随每年的证书更新而需要人工维护,期望在构建时能新增证书部署环节。为了兼容各种不同流水线,这里就用简单的shell脚本实现
2.1 证书获取及更新
2.1.1 证书的分类
- p12
- Cer
- mobileprovision
2.1.2 创建证书Git仓库
在Apple开发者管理后台申请证书并提交到一个git仓库可以做如下结构的安排
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Sign
├─install_cer.sh
├─p12
| ├─p12Debug.p12
| └p12Release.p12
├─Cer
| ├─development.cer
| └distribution.cer
├─PSCiOSProjectA
| ├─Push
| | ├─PSCiOSProjectAPush.mobileprovision
| | ├─PSCiOSProjectAPushAppStore.mobileprovision
| | └PSCiOSProjectAPushDistribution.mobileprovision
| ├─App
| | ├─PSCiOSProjectAAppStore.mobileprovision
| | ├─PSCiOSProjectADistribution.mobileprovision
| | └PSCiOSProjectAOnline.mobileprovision
├─PSCiOSProjectB
| ├─Push
| | ├─PSCiOSProjectBPush.mobileprovision
| | └PSCiOSProjectBPushAppStore.mobileprovision
| ├─App
| | ├─PSCiOSProjectBAppStore.mobileprovision
| | ├─PSCiOSProjectBDistribution.mobileprovision
| | └PSCiOSProjectBOnline.mobileprovision
目录划分上,多个不同的iOS项目,以targetname 或者其他标识区分。目录结构一次是:
- 执行脚本
- p12证书文件夹
- Cer证书文件夹
- 项目证书文件夹
- App:项目证书
- Push:推送证书
2.2 构建前安装证书
2.2.1 证书获取
构建之前新增一个步骤,从Git仓库拉取Apple开发者证书,进行安装。
1
2
3
git clone ssh://PSC-devops.psc.com:30022/PSC/PSC-ios/Tools/Sign.git
cd Sign
sh install_cer.sh PSCiOSProjectA $P12_PWD
其中
- 参数1:项目名称–需要更新的某个项目的证书
- 参数2:p12证书密码
2.2.2 证书安装
证书安装分为三部分,安装p12、安装cer、安装mobileprovision:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/bin/bash
# 遍历指定目录下,自动安装证书
# author: Chenyp34
# [目的]
# 自动化安装开发者证书
# [说明]
# 1、遍历指定目录下证书
# 2、安装目录下的p12、cer、mobileprovision
#
# [参数]
# 1、参数1,项目标识
# 2、参数2,p12证书密码
#
# [调用说明]
# sh install_cer.sh PSCiOSProjectA $P12_PWD
function installFromFold()
{
local func=$1
echo "installFromFold para:1="$1" 2="$2
# 使用 find 命令查找所有文件,并通过 for 循环遍历
find "$2" -type f | while read -r file; do
# 在这里对每个文件执行操作,例如打印文件名
if [[ $(basename "$file") != .* ]]; then
echo "$file"
# 如果你想对每个文件执行更复杂的操作,可以在这里添加
# 例如,使用另一个命令处理文件,或者对文件名进行某些操作
echo "installFromFold:$file"
$func $file
else
echo "未执行文件:$file"
fi
done
}
function installP12()
{
# 设置证书文件路径: "p12/p12Release.p12"
CERTIFICATE_PATH=$1
# 设置导入证书时使用的密码
CERTIFICATE_PASSWORD=$p12PWD
# 指定钥匙串的路径(此例为登录钥匙串)
KEYCHAIN_PATH=~/Library/Keychains/login.keychain-db
# 安装证书到钥匙串
security import "$CERTIFICATE_PATH" -k "$KEYCHAIN_PATH" -P "$CERTIFICATE_PASSWORD" -T /usr/bin/codesign
# 验证证书是否成功安装
security find-identity -p codesigning
echo "P12 installation is completed."
}
function installCer()
{
CERTIFICATE_PATH=$1
# 指定钥匙串的路径(此例为登录钥匙串)
KEYCHAIN_PATH=~/Library/Keychains/login.keychain-db
# 导入.cer证书到钥匙串
security import "$CERTIFICATE_PATH" -k "$KEYCHAIN_PATH" -T /usr/bin/codesign
echo "Certificate ($CERTIFICATE_PATH) installation is completed."
}
function installProfile()
{
# 设置.mobileprovision文件路径
MOBILEPROVISION_PATH=$1
#获取描述文件中UUID
UUID=`grep UUID -A1 -a $MOBILEPROVISION_PATH | grep -io '[-A-F0-9]\{36\}'`
echo "uuid="$UUID
# 复制到Xcode识别的目录
cp "$MOBILEPROVISION_PATH" ~/Library/MobileDevice/Provisioning\ Profiles/$UUID.mobileprovision
echo "Mobile Provisioning Profile installation is completed."$MOBILEPROVISION_PATH"==>"$UUID
}
#配置项目名称
ProjName=$1
#p12 证书密码
p12PWD=$2
installFromFold installP12 ./p12
installFromFold installCer ./Cer
installFromFold installProfile ./$ProjName
4.补充新增设备的App的安装及证书说明
在不具备299美金/年的企业证书情况下,团队内部经常会有新增的设备,此时需要频繁更新Apple开发者管理后台 的device列表和profile等,更新动作及情况可以分为如下维度:
将新设备添加Device列表 | 更新Profile(在Profile添加新设备) | 打包机直接构建 | 打包机上重新安装证书后构建 | 新设备是否可安装 |
---|---|---|---|---|
✅ | ❌ | |||
✅ | ✅ | ❌ | ||
✅ | ✅ | ❌ | ||
✅ | ✅ | ✅ | ❌ | |
✅ | ✅ | ✅ | ✅ |
依上述实践,得出结论,添加一台测试设备时需要同时完成如下步骤:
- 将新设备添加Device列表
- 更新Profile(在Profile添加新设备)
- 打包机上重新安装证书后构建