Jenkins之IOS xcode-fastlane打包上传蒲公英或者Appstore
程序员文章站
2024-03-23 20:09:46
...
1.基础准备
蒲公英账号
Apple开发者账号
Ruby/brew
MAC系统更新到最新
Xcode与开发保持一致10.1
rvm 来下载Fatalane 2.12.x以上
Jenkins 2.150.1
蒲公英插件pgyer(可以安装,也可直接用蒲公英Linux命令上传)
Brew 来下载 cocoPod
Sed要更换为gnu版本,最新的可能命令为gsed
修改gem源为国内https://gems.ruby-china.com
2.fastlane打包方式
1):可能需要提供的文件
2):fastlane的包到appstore
**注意:**0.2.到最新代码目录及下载依赖不用赘述,3.配置build_id自增上传appstore不重复不冲突的作用 ,具体思路就是每次+1 替换到Info.plish文件中。 4.就是fastlane 用release方式打包,需要开发配置证书之类上传appstore。 其他环境用fastlane beta打包dev/test/uat等环境上传蒲公英。
3):fastlane打包到dev/test/uat脚本
```bash
#0.git pull lastest
cd ~/application/HealthStore
#撤销本地修改的操作
git checkout .
#更新为当前分支最新代码
git pull
echo "git pull success"
#拉去远程分支到本地,若本地已经存在,则直接git checkout
#切换本地分支
local_version=`git branch`
[[ ${local_version} =~ $version ]] && git checkout $version || git checkout -b $version origin/${version}
#下载依赖
pod install
#merge 最新分支
#git merge origin/1.3.0-04.08
#echo "git merge success"
######################################
#static var base = BaseUrlEnum.test.rawValue //测试环境
#static var base = BaseUrlEnum.uat.rawValue //uat环境
#static var base = BaseUrlEnum.prod.rawValue //生产环境
######################################
#1.替换配置文件
#cd HealthStore/Tools/Network/
#cp GMNetworkUrl.swift GMNetworkUrl.swift.bak
#根据环境,需要替换的部分
cd ~/application/HealthStore/HealthStore/Tools/Network
str=`grep -n "static var base" GMNetworkUrl.swift|cut -d ":" -f 1`
arr=(${str// / })
firstnum=${arr[0]}
#lastnum=${arr[${#arr[*]}-1]}
#插入需要打包的环境
echo $iosenv
str_iosenv="static var base = BaseUrlEnum.${iosenv}.rawValue"
echo ${str_iosenv}
gsed -i "${firstnum}a ${str_iosenv}" GMNetworkUrl.swift
#删除指定行
#sed -i "${firstnum},${lastnum}d" GMNetworkUrl.swift
gsed -i "${firstnum}d" GMNetworkUrl.swift
#2.修改打包说明
description="\"$DES\""
echo $description
des="update_app_description=${description}"
echo $des
cd ~/application/HealthStore/fastlane
#替换fastfile文件的发版说明
gsed -i "1a ${des}" Fastfile
gsed -i "1d" Fastfile
#3.进行打包上传操作
cd ~/application/HealthStore
echo "22222222222222222222222222222"
fastlane beta
echo "build success! look to pgy...."
```
3.xcode打包方式
注:因为fastlane cocopod等经常更新等不稳定问题,改为xcode方式打包,所以Jenkins所在机器必须要安装Xcode
注意:这里根据项目具体情况来切分不同环境,1.pod复制过来是为了加快下载依赖,2.3.4都是用gsed来替换或者删除来切换环境
5.进行xcode打包并上传蒲公英的脚本如下:
```bash
# !/bin/bash
# 手动打包使用方法:
# Step1 : 将Automation整个文件夹拖入到项目根目录
# Step2 : 打开AutoPackageScript.sh文件,修改 "项目自定义部分", 配置好项目参数
# Step3 : 打开终端, cd到Automation文件夹 (ps:在终端中先输入cd, 直接拖入HSBAutomation文件夹, 回车)
# Step4 : 输入命令: "sh AutoPackageScript.sh" 回车, 开始执行此打包脚本
# ===============================项目自定义部分(自定义好下列参数后再执行该脚本)============================= #
# 计时
SECONDS=0
# 是否编译工作空间 (例:若是用Cocopods管理的.xcworkspace项目,赋值true;用Xcode默认创建的.xcodeproj,赋值false)
# 指定项目的scheme名称
# (注意: 因为shell定义变量时,=号两边不能留空格,若scheme_name与info_plist_name有空格,脚本运行会失败)
scheme_name="HealthStore"
# 工程中Target对应的配置plist文件名称, Xcode默认的配置文件为Info.plist
info_plist_name="pgy_export"
# 指定要打包编译的方式 : Release(appstore),Debug(内测包)
#build_configuration="Release"
build_configuration="Debug"
# ===============================自动打包部分(如果Info.plist文件位置有变动需要修改"info_plist_path")============================= #
# 导出ipa所需要的plist文件路径 (默认打企业包: "pgy_export.plist", 如果需要打包上传AppStore则是: "appstore_export.plist")
#ExportOptionsPlistPath="~/application/tools"
# 返回上一级目录,进入项目工程目录
#cd /Users/yangzhao/application/HealthStore
# 获取项目名称
project_name=`find . -name *.xcodeproj | awk -F "[/.]" '{print $(NF-1)}'`
# 获取Info.plist路径,拿到版本号, 编译版本号, BundleID
info_plist_path="/Users/yangzhao/application/tools/${info_plist_name}.plist"
#时间戳
formattedDate=$(date "+%F-%H:%M:%S")
# 指定输出ipa名称 : scheme_name + formattedDate
ipa_name="${scheme_name}"
# 删除旧.xcarchive文件
# 指定输出ipa路径
export_path="/Users/yangzhao/Desk/archive/${build_configuration}/${scheme_name}_${formattedDate}"
# 指定输出归档文件地址
export_archive_path="$export_path/$ipa_name.xcarchive"
# 指定输出ipa地址
export_ipa_path="$export_path"
# AdHoc,AppStore,Enterprise三种打包方式的区别: http://blog.csdn.net/lwjok2007/article/details/46379945
#method="app-store"
method="ad-hoc"
echo "[************************* 开始构建项目 *************************]"
# 指定输出文件目录不存在则创建
if [ -d "$export_path" ] ; then
echo $export_path
else
mkdir -pv $export_path
fi
# 判断编译的项目类型是workspace还是project
# 编译前清理工程
xcodebuild clean -project ${project_name}.xcodeproj \
-scheme ${scheme_name} \
-configuration ${build_configuration}
xcodebuild archive -workspace ${project_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${build_configuration} \
-archivePath ${export_archive_path}
# 检查是否构建成功
# xcarchive 实际是一个文件夹不是一个文件所以使用 -d 判断
if [ -d "$export_archive_path" ] ; then
echo "[项目构建成功 ] "
else
echo "[项目构建失败 ] "
exit 1
fi
echo "[************************* 开始导出ipa文件 *************************]"
xcodebuild -exportArchive \
-archivePath ${export_archive_path} \
-exportPath ${export_ipa_path} \
-exportOptionsPlist ${info_plist_path}
# 检查文件是否存在
if [ -f "$export_ipa_path/$ipa_name.ipa" ] ; then
echo "导出 ${ipa_name}.ipa 包成功 ]"
else
echo "[导出 ${ipa_name}.ipa 包失败 ..]"
fi
# 输出打包总用时
echo "[使用Automation打包总用时: ${SECONDS}s]"
# ============================上传到蒲公英部分(如需修改请自行替换蒲公英API Key和User Key)================================ #
echo "[************************* 上传到蒲公英 *************************]"
cd $export_path
# 蒲公英上的User Key
uKey="xxxxxx"
# 蒲公英上的API Key
apiKey="xxxxxx"
# 要上传的ipa文件路径
IPA_PATH="$export_ipa_path/$ipa_name.ipa"
# 蒲公英下载密码
PASSWORD="111111"
MSG=$1
# 执行上传至蒲公英的命令
echo "[************************* uploading *************************]"
curl -F "aaa@qq.com${IPA_PATH}" -F "uKey=${uKey}" -F "_api_key=${apiKey}" -F "buildUpdateDescription=${MSG}" -F "buildInstallType=2" -F "buildPassword=${PASSWORD}" http://www.pgyer.com/apiv2/app/upload
```
4.其他注意
1):先根据fastlane的包方式,或者区分环境来进行打包。
2):可以考虑直接用xcode原生命令来打包。
#可能需要用到的脚本: pgy_export.plish(打包所需 *.plish文件) build_id.sh(上传appstore需要用到,数字每次+1) GMNetworkUrl+environment.swift(ios切换环境的代码部分)
```bash
<?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>
<false/>
<key>method</key>
<string>ad-hoc</string>
<key>signingStyle</key>
<string>automatic</string>
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key>
<string>2RS856R568</string>
<key>thinning</key>
<string><none></string>
</dict>
</plist>
```
上一篇: JenKins+Xcode+git实现ipa自动化打包
下一篇: 线性表之数组实现栈结构