iOS自动打包

Jenkins持续集成

2018-01-03  本文已影响286人  阿姣_0405

背景

公司需求:测试期间自动化打包,在一段时间内,只需要触发一次打包,以后每天都是按照规定的时间策略自动打包,本教程实现的功能:

  1. 按照时间策略自动打包(比如每天的早上6点到晚上18点,每隔三小时检查下git分支上的代码,如果有更新,就触发打包,否则什么都不做)
  2. 打包成功后,自动上传到指定的网盘,然后下发邮件给指定的人群
  3. 邮件中内容可以自己配置(比如新包相对之前的包有哪些代码更新列举出来;附上.dSYM文件,方便定位崩溃用等等)

安装

1、homebrew

安装命令: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
更新homebrew命令: brew update

2、JDK

安装命令: brew cask install java

3、Jenkins

安装命令: brew install Jenkins
更新Jenkins命令: brew upgrade jenkins
jenkins版本:http://mirrors.jenkins.io/war-stable/

4、7zip (脚本中需要用到)

安装命令: brew install p7zip
7zip的使用:

1.解压缩(extract, e)RAR文件1.rar的命令:7z e 1.rar
2.查看(list, l)RAR文件中的文件信息:7z l 1.rar

启动Jenkins

  1. 在终端执行命令: jenkins
  2. 在浏览器打开http://localhost:8080
  3. 按照步骤创建账号

工程配置

构建一个自由风格的软件项目

1
2
3
构建脚本
构建脚本如下
# 功能:生成ipa包,并上传到云盘
#xcodebuild -list 可查看 configuration、target、scheme 
PROJECT_NAME=项目的project名称.xcodeproj #指定项目的project名称
CONFIGURATION=Release.Adhoc #配置debug release Adhoc 工程中需要先配置好
CONFIGURATION_DEBUG=Debug.Adhoc
SCHEME_NAME=scheme名  #指定项目的scheme名称
DESTINATION=generic/platform=tvOS
# 指定项目的sdk名称
SDK_NAME=appletvos11.1 #这里要和xcode上配置的一致
ARCHIVE_NAME=项目名.xcarchive
IPA_NAME=项目名-AppleTV.ipa #自己随意取 #配置了thinning=AppleTV5,3
PROJECT_PATH=$(pwd)
APP_INFOPLIST_PATH=$PROJECT_PATH/ServiceProvider/Info.plist

IPAPATH=$PROJECT_PATH/AutoBuildIPA
rm -rf $IPAPATH
mkdir -p $IPAPATH

#UPLOAD_DIR=网盘URL
UPLOAD_DIR=网盘URL

USER=用户名:密码 #邮箱的用户名和密码
GIT_COMMIT8=${GIT_COMMIT:0:8}
BUILD_TIME=$(date +%F_%H.%M.%S)

VERSION_NAME=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" ${APP_INFOPLIST_PATH})
BUILD_FILE=项目名-appletv${VERSION_NAME}-${GIT_COMMIT8}-${BUILD_TIME}
echo "BUILD_TIME=${BUILD_TIME}" >${WORKSPACE}/env.conf
echo "GIT_COMMIT8=${GIT_COMMIT8}" >>${WORKSPACE}/env.conf
echo "VERSION_NAME=${VERSION_NAME}" >>${WORKSPACE}/env.conf
echo "BUILD_FILE=${BUILD_FILE}" >>${WORKSPACE}/env.conf

if [ ! $GIT_PREVIOUS_SUCCESSFUL_COMMIT ];then
    echo "GIT_PREVIOUS_SUCCESSFUL_COMMIT is not exists."
else
    echo "GIT_COMMIT=[$GIT_COMMIT],GIT_PREVIOUS_SUCCESSFUL_COMMIT=[$GIT_PREVIOUS_SUCCESSFUL_COMMIT]"
    if [ $GIT_PREVIOUS_SUCCESSFUL_COMMIT == $GIT_COMMIT ];then
        echo "GIT_COMMIT is equals to GIT_PREVIOUS_SUCCESSFUL_COMMIT,skip build."
        #exit -1
    else
        echo "GIT_COMMIT is not equals to GIT_PREVIOUS_SUCCESSFUL_COMMIT"
    fi
fi

#BUILD_FILE_NAME=项目名-appletv${VERSION_NAME}-${GIT_COMMIT8}-${BUILD_TIME}-bitcode-${BITCODE}
mkdir $IPAPATH/$BUILD_FILE

# start build
/usr/bin/xcodebuild -project $PROJECT_NAME -configuration $CONFIGURATION -scheme $SCHEME_NAME -destination $DESTINATION -sdk $SDK_NAME archive -archivePath $IPAPATH/$ARCHIVE_NAME
if [ -e $IPAPATH/$ARCHIVE_NAME ];then
    echo "Build Archive Successful!"
    cp -R $IPAPATH/$ARCHIVE_NAME/dSYMs  $IPAPATH/$BUILD_FILE/bitcode_yes
else
    echo "error:archive Failed"
fi

# ipa
/usr/bin/xcodebuild -exportArchive -archivePath $IPAPATH/$ARCHIVE_NAME -exportPath $IPAPATH -exportOptionsPlist $PROJECT_PATH/项目名/Supporting\ files/Info_adhoc_bitcode.plist 

if [ -e $IPAPATH/$IPA_NAME ];then
    echo "build ipa success "
    cp $IPAPATH/$IPA_NAME  $IPAPATH/$BUILD_FILE/$BUILD_FILE-bitcode-yes.ipa
    #rm - f $IPAPATH/$ARCHIVE_NAME
else
    echo "error:exportArchive Failed "
fi

# start build
/usr/bin/xcodebuild -project $PROJECT_NAME -configuration $CONFIGURATION_DEBUG -scheme $SCHEME_NAME -destination $DESTINATION -sdk $SDK_NAME archive -archivePath $IPAPATH/$ARCHIVE_NAME
if [ -e $IPAPATH/$ARCHIVE_NAME ];then
    echo "Build Archive Successful!"
    cp -R $IPAPATH/$ARCHIVE_NAME/dSYMs  $IPAPATH/$BUILD_FILE/bitcode_no
else
    echo "error:archive Failed"
fi

/usr/bin/xcodebuild -exportArchive -archivePath $IPAPATH/$ARCHIVE_NAME -exportPath $IPAPATH -exportOptionsPlist $PROJECT_PATH/项目名/Supporting\ files/Info_adhoc_nobitcode.plist 
if [ -e $IPAPATH/$IPA_NAME ];then
    echo "build ipa success"
    cp $IPAPATH/$IPA_NAME $IPAPATH/$BUILD_FILE/$BUILD_FILE-bitcode-no.ipa
else 
    echo "error:exprotArchive Failed"
fi


rm -f $IPAPATH/$BUILD_FILE/dSYMs/ServiceProvider.appex.dSYM
cd $IPAPATH
7z a $BUILD_FILE.zip  $BUILD_FILE

# upload
#创建当前版本目录
curl -u $USER -X MKCOL $UPLOAD_DIR/appletv${VERSION_NAME}
upload_path=$UPLOAD_DIR/appletv${VERSION_NAME}/$BUILD_FILE.zip
if [ -e $IPAPATH/$IPA_NAME ];then
    curl -u $USER -X PUT --data-binary @$BUILD_FILE.zip $upload_path
fi  
构建脚本 构建脚本

系统设置 (系统管理-->系统设置)主要配置发送邮件的账号

1
2
3
4

必要插件安装 (系统管理-->管理插件)

1.Email Extension Plugin
2.Environment Injector Plugin
3.Build Timeout
4.GitHub Branch Source Plugin
5.SCM API Plugin

补充

遇到过的坑

深坑1

打包时报错

解决的办法是:切换到你正在用的Xcode安装路径下

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/

参考:https://blog.csdn.net/woaizijiheni/article/details/50614062

深坑2

发送邮件报错日志

解决办法:邮件配置的用户名或者密码写错了,都是粗心惹的祸

扩展

扩展1

取版本号

bundleShortVersion=(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString"{project_infoplist_path})

取build值

bundleVersion=(/usr/libexec/PlistBuddy -c "print CFBundleVersion"{project_infoplist_path})

取bundle Identifier前缀

bundlePrefix=(/usr/libexec/PlistBuddy -c "print CFBundleIdentifier" `find . -name "*-Info.plist"` | awk -F '{print $1}')

取GIT_COMMIT前8位

GIT_COMMIT8=${GIT_COMMIT:0:8}

上一篇下一篇

猜你喜欢

热点阅读