iOS构建:自动配置iOS证书

证书自动化部署

Posted by PaysonChen on March 26, 2024

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添加新设备)
  • 打包机上重新安装证书后构建

3.持续更新中