欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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):可能需要提供的文件
Jenkins之IOS xcode-fastlane打包上传蒲公英或者Appstore2):fastlane的包到appstore

Jenkins之IOS xcode-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

Jenkins之IOS xcode-fastlane打包上传蒲公英或者AppstoreJenkins之IOS xcode-fastlane打包上传蒲公英或者AppstoreJenkins之IOS xcode-fastlane打包上传蒲公英或者AppstoreJenkins之IOS xcode-fastlane打包上传蒲公英或者AppstoreJenkins之IOS xcode-fastlane打包上传蒲公英或者Appstore注意:这里根据项目具体情况来切分不同环境,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
	```

Jenkins之IOS xcode-fastlane打包上传蒲公英或者Appstore

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>&lt;none&gt;</string>
</dict>
</plist>
```