linux 脚本封装,Shell脚本打包与上传

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

打包流程:编译.xcarchive包;

生成.ipa文件;

上传到苹果商店或第三方平台。

自动化:

这里所说的自动化,主要是通过shell脚本,利用 Command Line Tools 提供的 xcodebuild 命令来编译和导出 ipa,再通过 Application Loader 提供的 altool 命令行工具,或者其他三方平台提供的命令行工具上传 ipa 和 dSYM 文件。

清理构建目录

编译前先clean,相当于在 Xcode 进行 Product -> clean。1

2xcodebuild

clean -configuration ${development_mode}

-configuration 用来表示打包的方式,相当于打包前配置 Edit scheme -> info -> Build configuration,告诉编译器打出来的包是何种包,比如 Release、InHouse等。

编译xcarchive包1

2

3

4

5xcodebuild archive

-workspace ${project_path}/${project_name}.xcworkspace

-scheme ${scheme_name}

-configuration ${development_mode}

-archivePath ${build_path}/${project_name}.xcarchive

-workspace表示工作空间,一个项目中有多个project时,比如通过 pod 集成了三方库后都会自动创建一个新的工作空间。如果没有,可以不加这个参数。-archivePath,用来配置生成的.xcarchive的路径。

导出ipa文件1

2

3

4xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive

-configuration ${development_mode}

-exportPath ${exportIpaPath}

-exportOptionsPlist ${exportOptionsPlistPath}

-exportPath表示 ipa 文件的输出路径;

-exportOptionsPlist表示 ExportOptions.plist 配置文件的路径。此 plist 是打包时必须的文件,在手动打包并 export 出 ipa 包时,可以在 ipa 包的同级目录下找到,可以拿过来用,或者通过 Xcode 手动创建一份。如果有多个渠道包,也可以通过脚本生成对应的 plist。

#示例:ExportOptions.plist1

2

3

4

5

6

7

8

9

10

11

12<?xml version="1.0" encoding="UTF-8"?>

teamID

略略略

method

enterprise

uploadSymbols

注意:Xcode9 之后,ExportOptions.plist 需要指定的信息有变,具体可以参考 这里~

#完整示例

下面是完整的 shell 脚本,实现了编译.xcarchive、导出 ipa 与 dSYM,命名为autobuild.sh,放在工程根目录下。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#!/bin/sh

#works for Xcode 7.0+ only

echo ">>>>>>>>>>>> Start at $(date) <<<<<<<<<<<<<<

PROJECT_ROOT_PATH=$PWD

AUTOBUILD_PATH="$PROJECT_ROOT_PATH/AutoBuild"

CURRENT_DATE=$(date +%Y_%m%d_%H%M)

WORKSPACE_NAME="Demo.xcworkspace"

#导出配置

HEADER_PLIST="$AUTOBUILD_PATH/Header.plist"

EXPORT_PLIST="$AUTOBUILD_PATH/ExportOptions.plist"

#Info key

KEY_SCHEME="KEY_SCHEME"

KEY_APP_NAME="KEY_APP_NAME"

KEY_TEAM_ID="KEY_TEAM_ID"

KEY_DEV_ID="KEY_DEV_ID"

#Flavors

DemoInHouse={$KEY_SCHEME:"DemoInHouse",$KEY_APP_NAME:"InHouse",$KEY_TEAM_ID:"xxxxxxxxxx",$KEY_DEV_ID:"xxx"}

DemoRelease={$KEY_SCHEME:"DemoRelease",$KEY_APP_NAME:"Release",$KEY_TEAM_ID:"xxxxxxxxxx",$KEY_DEV_ID:"xxx"}

FLAVORS=($DemoInHouse)

#Parse method

parse_json(){

echo $1 | sed 's/.*'$2':([^,}]*).*/1/'

}

#build release apps directory

BUILD_DIR="$PROJECT_ROOT_PATH/Build"

RELEASE_DIR="$BUILD_DIR/Products"

rm -rdf $BUILD_DIR

#final binarys' directory

OUT_BINARY_DIR="$PROJECT_ROOT_PATH/binarys_$CURRENT_DATE"

if [ ! -d $OUT_BINARY_DIR ]; then

mkdir $OUT_BINARY_DIR

fi

for ((i = 0; i < ${#FLAVORS[@]}; i++))

do

#parse elements

TARGET_SCHEMES=$(parse_json ${FLAVORS[$i]} $KEY_SCHEME)

TARGET_APP_NAMES=$(parse_json ${FLAVORS[$i]} $KEY_APP_NAME)

TARGET_TEAM_IDS=$(parse_json ${FLAVORS[$i]} $KEY_TEAM_ID)

TARGET_DEV_IDS=$(parse_json ${FLAVORS[$i]} $KEY_DEV_ID)

#reset export options plist

rm $EXPORT_PLIST

cat $HEADER_PLIST >> $EXPORT_PLIST

echo "" >> $EXPORT_PLIST

echo "" >> $EXPORT_PLIST

echo "teamID" >> $EXPORT_PLIST

echo "$TARGET_TEAM_IDS" >> $EXPORT_PLIST

echo "method" >> $EXPORT_PLIST

echo ">>>>>>>>>>>>>>>>>>>>>>>> target scheme $TARGET_SCHEMES"

if [ $TARGET_SCHEMES = "DemoInHouse" ]; then

echo "enterprise" >> $EXPORT_PLIST

echo ">>>>>>>>>>>>>>>>>>>>>>>> enterprise Done"

else

echo "app-store" >> $EXPORT_PLIST

echo ">>>>>>>>>>>>>>>>>>>>>>>> app-store Done"

fi

echo "uploadSymbols" >> $EXPORT_PLIST

echo "" >> $EXPORT_PLIST

echo "" >> $EXPORT_PLIST

echo "" >> $EXPORT_PLIST

echo ">>>>>>>>>>>>>>>>>>>>>>>> Reset export options Done"

#替换素材

cd $AUTOBUILD_PATH

./replace_res.sh $TARGET_SCHEMES

# return root

cd $PROJECT_ROOT_PATH

echo ">>>>>>>>>>>>>>>>>>>>>>>> Reset res Done"

#export files

ARCHIVE_FILE="$OUT_BINARY_DIR/$TARGET_APP_NAMES.xcarchive"

DSYMS_FILE="$TARGET_APP_NAMES.dSYMs.zip"

#clean prject

xcodebuild -workspace $WORKSPACE_NAME -scheme $TARGET_SCHEMES -configuration $TARGET_APP_NAMES clean

#build & archive

xcodebuild archive -workspace $WORKSPACE_NAME -scheme $TARGET_SCHEMES -configuration $TARGET_APP_NAMES -archivePath $ARCHIVE_FILE

cd $ARCHIVE_FILE

zip -r $DSYMS_FILE "dSYMs"

mv $DSYMS_FILE $OUT_BINARY_DIR

# return root

cd $PROJECT_ROOT_PATH

#export

xcodebuild -exportArchive -archivePath $ARCHIVE_FILE -exportPath $OUT_BINARY_DIR -exportOptionsPlist $EXPORT_PLIST

#rename ipa file failed since creating ipa file is asynchronized

echo "apple id paired" >> "$OUT_BINARY_DIR/$TARGET_APP_NAMES_$TARGET_DEV_IDS"

echo ">>>>>>>>>>>>>>>>>>>>>>>> $TARGET_SCHEMES single loop Done"

done

echo ">>>>>>>>>>>> Finish at $(date) <<<<<<<<<<<<<<

使用时先根据需要打包的版本,修改FLAVORS=($DemoInHouse)中的内容。如果只打一个包,更换$后的命名即可;如果需要打多个包,则在输入多个包名,以逗号隔开,如:FLAVORS=($DemoInHouse,$DemoRelease)。最后,在终端中./autobuild.sh,直接执行脚本即可。

验证并上传到商店

Xcode 集成了 Application Loader,你可以用它来手动上传 App 的二进制文件。这里继续使用脚本的方式,通过 Application Loader 的命令行工具 altool 来验证二进制文件并上传到商店。1

2

3

4

5

6//altool工具路径

altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"

//验证

"$altoolPath" --validate-app -f ${exportIpaPath}/${scheme_name}.ipa -u appleID -p password -t ios --output-format xml

//上传

"$altoolPath" --upload-app -f ${exportIpaPath}/${scheme_name}.ipa -u appleID -p password -t ios --output-format xml参数详细说明–validate-app您要验证指定的 App。

–upload-app您要上传指定的 App。

-f file正在验证或上传的 App 的路径和文件名。

-u username您的用户名。

-p password您的用户密码。

–output-format [xml or normal]您想让 Application Loader 以结构化的 XML 格式还是非结构化的文本格式返回输出信息。默认情况下,Application Loader 以文本格式返回输出信息。

上传到Fir1

2firApiToken="xxxxxxxxxxx"

fir publish $exportIpaPath/$scheme_name.ipa -T "$firApiToken"

注意:使用脚本上传到Fir平台前,需要先安装 fir-cli:1gem install fir-cli

上传到蒲公英1curl -F "file=@$exportIpaPath/$scheme_name.ipa" -F "uKey=xxx" -F "_api_key=xxx https://qiniu-storage.pgyer.com/apiv1/app/upload

请根据开发者自己的账号,将其中的 uKey 和 _api_key 的值替换为相应的值。完整的使用规则请看 这里~

上传符号表

如果应用接入了崩溃分析工具,会要求将dSYM文件上传到对应平台的后台中,比如接入bugly时,可以通过以下脚本上传符号表文件:1java -jar buglySymboliOS.jar -d -i $dSYM -u -id "xx" -key "xx" -package "com.xx.xx" -version "$version" -o "xx.zip"

bugly 上传 dSYM 文件需要事先下载一个工具包,具体的配置和使用方法可以参考 这里~

其他工具

当然,还有一些更专业化的自动化部署和发布工具,如:Jenkins

FastLane

这些工具极大地简化了我们手动发布时的一些枯燥、重复的工作,比如截图、代码签名以及发布。这里就不一一介绍了,可以自行到其官网查询~

相关参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值