iOS Jenkins自动打包上传蒲公英(新)

1、安装JDK

Jenkins是一个用Java编写的持续集成工具,依赖于Java,所以在安装Jenkins前,需要先安装JDK。首先,检查电脑是否已经安装有Java环境。在终端输入命令查看:java -version

iOS Jenkins自动打包上传蒲公英(新)_第1张图片

如上所示,说明已经安装好了JDK,否则前往官网下载安装JDK:下载地址

2、安装Jenkins

下载并安装Jenkins:下载地址
安装完毕会自动打开Jenkins管理控制台,或者在浏览器输入http://localhost:8080进行访问

// 启动Jenkins命令
java -jar /Applications/Jenkins/jenkins.war –httpPort=8080

// 停止Jenkins命令
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist

安装必须的插件:在初始化的时候会有默认需要安装的插件,除此之外,还得确认以下插件是否安装成功:

Xcode integration
GIT plugin
GitLab Plugin
Gitlab Hook Plugin
Git Parameter
Keychains and Provisioning Profiles Management

在插件管理里面可以看到已经安装好的插件:
iOS Jenkins自动打包上传蒲公英(新)_第2张图片

3、新建项目

如下图输入项目的名字,选择自由风格,然后确定保存。
iOS Jenkins自动打包上传蒲公英(新)_第3张图片

4、配置项目

如果想构建指定的分支或者TAG,需要增加参数化构建过程,首先确定已经安装了上面提到的“Git Parameter”这个插件,然后配置General,增加BRANCH或者TAG参数名字,选定参数类型,Default Value默认构建master分支,这里填写你需要构建的分支即可。

iOS Jenkins自动打包上传蒲公英(新)_第4张图片

接下来配置源码管理,输入Git仓库地址和账号密码,如果没有添加过账号密码,点击后面的Add添加并校验即可。
iOS Jenkins自动打包上传蒲公英(新)_第5张图片

配置好Git或者SVN地址后,可以Build一次,看看Git或者SVN是否配置成功了
iOS Jenkins自动打包上传蒲公英(新)_第6张图片

这时可以看到Workspace里面会有我们的项目代码,代表你配置的Git或者SVN是对的。

iOS Jenkins自动打包上传蒲公英(新)_第7张图片

5、设置构建触发器

Poll SCM:代表轮询的频率,H/2 * * * * 代表每2分钟轮询一次检查是否有代码提交,如果有则从Git或者SVN拉取代码打包
iOS Jenkins自动打包上传蒲公英(新)_第8张图片

如果你的代码是放在Gitlab上,还可以下载Gitlab钩子插件,并配置好,在提交代码时,会自动触发检查代码更新。

6、设置构建执行脚本

脚本的作用主要是:
1、先安装Pod,如果你的项目没有用到CocoaPods则可忽略
2、cd进入脚本根目录执行shell脚本,后面的3代表打包方式(企业包),这里可以修改成自己需要的配置
iOS Jenkins自动打包上传蒲公英(新)_第9张图片

Excute shell构建脚本:

#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

#安装Pod库
cd $WORKSPACE/ATMDemo
/usr/local/bin/pod update

#执行自动打包脚本
cd $WORKSPACE/ATMDemo
cd HSBAutomation
sh HSBAutoPackageScript.sh 3

具体的打包上传脚本内容如下:

# !/bin/bash

# 手动打包使用方法:
# Step1 : 将HSBAutomation整个文件夹拖入到项目根目录
# Step2 : 打开HSBAutoPackageScript.sh文件,修改 "项目自定义部分", 配置好项目参数
# Step3 : 打开终端, cd到HSBAutomation文件夹 (ps:在终端中先输入cd, 直接拖入HSBAutomation文件夹, 回车)
# Step4 : 输入命令: "sh HSBAutoPackageScript.sh" 回车, 开始执行此打包脚本


# ===============================项目自定义部分(自定义好下列参数后再执行该脚本)============================= #

# 计时
SECONDS=0
# 是否编译工作空间 (例:若是用Cocopods管理的.xcworkspace项目,赋值true;用Xcode默认创建的.xcodeproj,赋值false)
is_workspace="true"

# 指定项目的scheme名称
# (注意: 因为shell定义变量时,=号两边不能留空格,若scheme_name与info_plist_name有空格,脚本运行会失败)
scheme_name="ATMDemo"

# 工程中Target对应的配置plist文件名称, Xcode默认的配置文件为Info.plist
info_plist_name="Info"

# 指定要打包编译的方式 : Release,Debug...
build_configuration="Release"


# ===============================自动打包部分(如果Info.plist文件位置有变动需要修改"info_plist_path")============================= #

# 导出ipa所需要的plist文件路径 (默认打企业包: "EnterpriseExportOptionsPlist.plist", 如果需要打包上传AppStore则是: "AppStoreExportOptionsPlist.plist")
ExportOptionsPlistPath="./HSBAutomation/EnterpriseExportOptionsPlist.plist"

# 返回上一级目录,进入项目工程目录
cd ..

# 获取项目名称
project_name=`find . -name *.xcodeproj | awk -F "[/.]" '{print $(NF-1)}'`

# 获取Info.plist路径,拿到版本号, 编译版本号, BundleID
info_plist_path="$project_name/$info_plist_name.plist"
bundle_version=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $info_plist_path`
bundle_build_version=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $info_plist_path`
bundle_identifier=`/usr/libexec/PlistBuddy -c "Print CFBundleIdentifier" $info_plist_path`

#时间戳
formattedDate=$(date "+%Y%m%d%H%M%S")

# 指定输出ipa名称 : scheme_name + bundle_version
ipa_name="$scheme_name-${GIT_BRANCH#*/}-V$bundle_version-$formattedDate"

# 删除旧.xcarchive文件
#rm -rf ~/Desktop/$scheme_name-IPA/$scheme_name.xcarchive

# 指定输出ipa路径
export_path=~/IPA/$scheme_name/$ipa_name

# 指定输出归档文件地址
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
echo "\033[请选择打包方式(输入序号, 按回车即可)]\033"
echo "\033[1. AdHoc       ]\033"
echo "\033[2. AppStore    ]\033"
echo "\033[3. Enterprise  ]\033"
echo "\033[4. Development ]\033"
# 读取用户输入并存到变量里
read parameter
sleep 0.5
method="$parameter"

# 判读用户是否有输入
# if [ -n "$method" ]
# then
#     if [ "$method" = "1" ] ; then
#     ExportOptionsPlistPath="./HSBAutomation/AdHocExportOptionsPlist.plist"
#     elif [ "$method" = "2" ] ; then
#     ExportOptionsPlistPath="./HSBAutomation/AppStoreExportOptionsPlist.plist"
#     elif [ "$method" = "3" ] ; then
#     ExportOptionsPlistPath="./HSBAutomation/EnterpriseExportOptionsPlist.plist"
#     elif [ "$method" = "4" ] ; then
#     ExportOptionsPlistPath="./HSBAutomation/DevelopmentExportOptionsPlist.plist"
#     else
#     echo "输入的参数无效!!!"
#     exit 1
#     fi
# fi

echo "\033[*************************  开始构建项目  *************************]\033"
# 指定输出文件目录不存在则创建
if [ -d "$export_path" ] ; then
echo $export_path
else
mkdir -pv $export_path
fi

# 判断编译的项目类型是workspace还是project
if $is_workspace ; then
# 编译前清理工程
xcodebuild clean -workspace ${project_name}.xcworkspace \
                 -scheme ${scheme_name} \
                 -configuration ${build_configuration}

xcodebuild archive -workspace ${project_name}.xcworkspace \
                   -scheme ${scheme_name} \
                   -configuration ${build_configuration} \
                   -archivePath ${export_archive_path}
else
# 编译前清理工程
xcodebuild clean -project ${project_name}.xcodeproj \
                 -scheme ${scheme_name} \
                 -configuration ${build_configuration}

xcodebuild archive -project ${project_name}.xcodeproj \
                   -scheme ${scheme_name} \
                   -configuration ${build_configuration} \
                   -archivePath ${export_archive_path}
fi

#  检查是否构建成功
#  xcarchive 实际是一个文件夹不是一个文件所以使用 -d 判断
if [ -d "$export_archive_path" ] ; then
echo "\033[项目构建成功 ? ? ?] \033"
else
echo "\033[项目构建失败 ? ? ?] \033"
exit 1
fi

echo "\033[*************************  开始导出ipa文件  *************************]\033"
xcodebuild  -exportArchive \
            -archivePath ${export_archive_path} \
            -exportPath ${export_ipa_path} \
            -exportOptionsPlist ${ExportOptionsPlistPath}

# 修改ipa文件名称
mv $export_ipa_path/$scheme_name.ipa $export_ipa_path/$ipa_name.ipa

# 检查文件是否存在
if [ -f "$export_ipa_path/$ipa_name.ipa" ] ; then
echo "\033[导出 ${ipa_name}.ipa 包成功 ?  ?  ? ]\033"
open $export_path
else
echo "\033[导出 ${ipa_name}.ipa 包失败 ? ? ? ]\033"

# 相关的解决方法
echo "\033[PS:以下类型的错误可以参考对应的链接]\033"
echo "\033[1.\"error: exportArchive: No applicable devices found.\" --> 可能是ruby版本过低导致,升级最新版ruby再试,升级方法自行百度/谷歌,GitHub issue: https://github.com/jkpang/HSBAutomation/issues/1#issuecomment-297589697"
echo "\033[2.\"No valid iOS Distribution signing identities belonging to team 6F4Q87T7VD were found.\" --> http://fight4j.github.io/2016/11/21/xcodebuild/]\033"
exit 1
fi
# 输出打包总用时
echo "\033[使用HSBAutomation打包总用时: ${SECONDS}s]\033"



# ============================上传到蒲公英部分(如需修改请自行替换蒲公英API Key和User Key)================================ #

echo "\033[*************************  上传到蒲公英  *************************]\033"
# open $export_path

# 蒲公英上的User Key
uKey="30fba42c76c0d492b8fb1e363d2152a2"
 
# 蒲公英上的API Key
apiKey="40d4ceb3c6feabdbde9cdbbe95bb8b8f"
 
# 要上传的ipa文件路径
IPA_PATH="$export_ipa_path/$ipa_name.ipa"
 
# 本机开机密码
PASSWORD="123456"

MSG=git log -1 --pretty=%B
 
# 执行上传至蒲公英的命令
echo "[************************* uploading *************************]"

curl -F "file=@${IPA_PATH}" -F "uKey=${uKey}" -F "_api_key=${apiKey}" -F "updateDescription=${MSG}" -F "password=${PASSWORD}" http://www.pgyer.com/apiv1/app/upload

7、执行Build,打包并上传蒲公英

保存所有前面的配置,然后提交自己的代码,等待轮询器检查代码更新,或者直接点击控制台的Build,编译成功后包就会自动上传到蒲公英平台了

iOS Jenkins自动打包上传蒲公英(新)_第10张图片

蒲公英平台
iOS Jenkins自动打包上传蒲公英(新)_第11张图片

登录蒲公英查看包已经上传了,至此Jenkins+蒲公英打包已完成!解放你的双手,集中精力尽情的撸码吧!

你可能感兴趣的:(Jenkins自动化打包)