Xcode9 xcodebuild 打包上传蒲公英

最近在弄持续集成方案,因为Jenkins自动打包同样要使用手动触发,同时也不需要定时去打包上传,我们就写了一个shell脚本,当模块完成时候去上传蒲公英交付测试,之后会写一个使用ApplicationLoader上传App Store的脚本,本文默认您已经进行过打包流程并成功

在正式版Xcode9更新之后,之前的脚本无法使用,报错如下

1
2
error: exportArchive: "AppName.app" requires a provisioning profile with the Push Notifications and App Groups features.
Error Domain=IDEProvisioningErrorDomain Code=9

首先我们需要先进行 xcodebuild export plist 配置

如下图所示,一步一步做

我们手动进行打包操作
1.png

打包~~~
2.png

打包~~~
3.png

打包~~~
4.png

我们就要这个plist文件
5.png

6.png

我们还要将里面的compileBitcode设置为NO,这个很关键,不然会出现一系列有趣的问题,关于Bitcode的问题可以看官网App Thinning,下面我们的比较关键的一步就完成了

下面就是我没有改设置的报错,一脸蒙B… 没有任何提示…
1
Segmentation fault: 11

下面我们开始打包

我们打包的前提是需要自动配置证书,打包的模式是Release,请设置对应的值,我们在脚本里不需要设置CODE_SIGN_IDENTITY PROVISIONING_PROFILE

7.png

8.png

由于我们有正式接口和测试接口包需要交付测试测试,我们这边就需要手动打包两次获取对应ExportOptions.plist

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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#go!

PREFIX_SYMBOL="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"

echo "开始上传\n\n"

#工程名
PROJECTNAME="XXX"
#需要编译的 targetName
TARGET_NAME="XXX"
#是否是工作空间
ISWORKSPACE=true
# 开始时间
DATE=`date '+%Y-%m-%d-%T'`
#编译模式 工程默认有 Debug Release
CONFIGURATION_TARGET=Release
#编译路径
BUILDPATH=~/Desktop/${TARGET_NAME}_${DATE}
#archivePath
ARCHIVEPATH=${BUILDPATH}/${TARGET_NAME}.xcarchive
#输出的ipa目录
IPAPATH=${BUILDPATH}
#导出ipa 所需plist
FormalExportOptionsPlist=./FormalExportOptions.plist
TestExportOptionsPlist=./TestExportOptions.plist
ExportOptionsPlist=${FormalExportOptionsPlist}
# 是否上传蒲公英
UPLOADPGYER=false



echo "选择接口${PREFIX_SYMBOL}"
echo "1 正式接口${PREFIX_SYMBOL}"
echo "2 测试接口${PREFIX_SYMBOL}"
echo "默认正式接口${PREFIX_SYMBOL}"

# 读取用户输入并存到变量里
read parameter
sleep 0.5

# 判读用户是否有输入
if [ -n "$parameter" ]
then
if [ "$method" = "1" ]
then
ExportOptionsPlist=${FormalExportOptionsPlist}
elif [ "$method" = "2" ]
then
ExportOptionsPlist=${TestExportOptionsPlist}
else
echo "参数无效"
exit 1
fi
else
ExportOptionsPlist=${FormalExportOptionsPlist}
fi

echo "上传蒲公英${PREFIX_SYMBOL}"
echo "1 不上传${PREFIX_SYMBOL}"
echo "2 上传${PREFIX_SYMBOL}"
echo "默认不上传${PREFIX_SYMBOL}"

read para
sleep 0.5

if [ -n "$para" ]
then
if [ "$para" = "1" ]
then
UPLOADPGYER=false
elif [ "$para" = "2" ]
then
UPLOADPGYER=true
else
echo "参数无效...."
exit 1
fi
else
UPLOADPGYER=false
fi


echo "输出相关编译参数${PREFIX_SYMBOL}"

if [ $ISWORKSPACE = true ]
then
echo "项目基于工作空间"
else
echo "项目不是基于工作空间"
fi

echo "编译模式: ${CONFIGURATION_TARGET}"
echo "导出ipa配置文件路径: ${ExportOptionsPlist}"
echo "打包文件路径: ${ARCHIVEPATH}"
echo "导出ipa路径: ${IPAPATH}"
echo "直接点击回车继续,输入任意退出${PREFIX_SYMBOL}"

read continue_work
sleep 0.5

if [ -n "$continue_work" ]
then
echo "退出${PREFIX_SYMBOL}"
exit 1
else
echo "开始编译${PREFIX_SYMBOL}"
fi



if [ $ISWORKSPACE = true ]
then
# 清理
xcodebuild clean -workspace ${PROJECTNAME}.xcworkspace \
-configuration \
${CONFIGURATION} -alltargets
#开始构建
xcodebuild archive -workspace ${PROJECTNAME}.xcworkspace \
-scheme ${TARGET_NAME} \
-archivePath ${ARCHIVEPATH} \
-configuration ${CONFIGURATION_TARGET}
else
# 清理
xcodebuild clean -project ${PROJECTNAME}.xcodeproj \
-configuration \
${CONFIGURATION} -alltargets
#开始构建
xcodebuild archive -project ${PROJECTNAME}.xcodeproj \
-scheme ${TARGET_NAME} \
-archivePath ${ARCHIVEPATH} \
-configuration ${CONFIGURATION_TARGET}
fi



echo "是否构建成功${PREFIX_SYMBOL}"
# xcarchive 实际是一个文件夹不是一个文件所以使用 -d 判断
if [ -d "$ARCHIVEPATH" ]
then
echo "成功${PREFIX_SYMBOL}"
else
echo "失败${PREFIX_SYMBOL}"
rm -rf $BUILDPATH
exit 1
fi

xcodebuild -exportArchive \
-archivePath ${ARCHIVEPATH} \
-exportOptionsPlist ${ExportOptionsPlist} \
-exportPath ${IPAPATH}

echo "检查是否成功导出ipa${PREFIX_SYMBOL}"
IPAPATH=${IPAPATH}/${TARGET_NAME}.ipa
if [ -f "$IPAPATH" ]
then
echo "导出ipa成功${PREFIX_SYMBOL}"
open $BUILDPATH
else
echo "导出ipa失败${PREFIX_SYMBOL}"
exit 1
fi

# 上传蒲公英
if [ $UPLOADPGYER = true ]
then
echo "上传ipa到蒲公英${PREFIX_SYMBOL}"
curl -F "file=@$IPAPATH" \
-F "installType=2" \
-F "uKey=XXXX" \
-F "_api_key=XXXX" \
-F "password=XXXX" \
https://www.pgyer.com/apiv2/app/upload

if [ $? = 0 ]
then
echo "上传成功${PREFIX_SYMBOL}"
else
echo "上传失败${PREFIX_SYMBOL}"
fi
fi

echo "配置信息${PREFIX_SYMBOL}"
echo "编译模式: ${CONFIGURATION_TARGET}"
echo "导出ipa配置文件: ${ExportOptionsPlist}"
echo "打包文件路径: ${ARCHIVEPATH}"
echo "导出ipa路径: ${IPAPATH}"

exit 0

24行开始我们填入的是之前我们导出的ExportOptions.plist,上传蒲公英部分的参数可以参照官方文档,我们将打包的路径都设置成了桌面

然而这个脚本并不是大家拿去都能用,也是需要根据自己的项目来设置相应的环境变量,希望能帮助到大家!

Demo