Jenkins持续集成
背景
公司需求:测试期间自动化打包,在一段时间内,只需要触发一次打包,以后每天都是按照规定的时间策略自动打包,本教程实现的功能:
- 按照时间策略自动打包(比如每天的早上6点到晚上18点,每隔三小时检查下git分支上的代码,如果有更新,就触发打包,否则什么都不做)
- 打包成功后,自动上传到指定的网盘,然后下发邮件给指定的人群
- 邮件中内容可以自己配置(比如新包相对之前的包有哪些代码更新列举出来;附上.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
-
在终端执行命令:
jenkins
- 在浏览器打开http://localhost:8080
- 按照步骤创建账号
工程配置
构建一个自由风格的软件项目
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
构建脚本
构建脚本
系统设置 (系统管理-->系统设置)主要配置发送邮件的账号
12
3
4
必要插件安装 (系统管理-->管理插件)
1.Email Extension Plugin
2.Environment Injector Plugin
3.Build Timeout
4.GitHub Branch Source Plugin
5.SCM API Plugin
补充
- Jenkins URL那里的ip地址要取连接网线时候的ip,亲测连接wifi是不行的
这个URL是可以在别的电脑上打开,登陆账号之后,可以对jenkins进行操作的,不一定要在当前配置jenkins坏境的那台电脑上 - 当出现打包进度条不是纯色的时候,而且斑马线样子,可能git账号密码错误
- 当打包成功,邮件发送失败,如果邮箱的账号密码确定无误,很有可能端口号不对(这里坑了我一次)
- 打包失败,有人以为是和jenkins版本有关,试验过,版本影响其实不大
- 邮件默认端口是25
- 有时候配置都没有问题,但是就是打包要很长时间,并且最终是失败的,很有可能是缓存没有清理,进入到jenkins目录下,然后把里面的文件全部清除,例如/Users/用户名/.jenkins/workspace下的所有全部清除。
遇到过的坑
深坑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}