Jenkins持续集成

背景

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

  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

构建脚本

构建脚本如下

 cd "${WORKSPACE}/QiyiTvos"
 export LANG=en_US.UTF-8
 /usr/local/bin/pod install
# 功能:生成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
6.thinbackup备份插件(防止jenkins抽风)

补充

  • 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

发送邮件报错日志

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

深坑3


原来是之前没用cocoapods管理,xcodebuild命令还是-project,要换成xcodebuild -workspace
还有可能需要把podfile文件中引入的相关类先移除再install一下

扩展

扩展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}

忘记Jenkins管理员密码的解决办法

一、admin密码未更改情况
1.进入\Jenkins\secrets目录,打开initialAdminPassword文件,复制密码;
2.访问Jenkins页面,输入管理员admin,及刚才的密码;
3.进入后可更改其他管理员密码;

二、admin密码更改忘记情况
1.删除Jenkins目录下config.xml文件中下面代码,并保存文件。

  <useSecurity>true</useSecurity>
  <authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">
    <denyAnonymousReadAccess>true</denyAnonymousReadAccess>
  </authorizationStrategy>
  <securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
    <disableSignup>true</disableSignup>
    <enableCaptcha>false</enableCaptcha>
  </securityRealm>

2.重启Jenkins服务;

3.进入首页>“系统管理”>“Configure Global Security”;

4.勾选“启用安全”;

5.点选“Jenkins专有用户数据库”,并点击“保存”;

6.重新点击首页>“系统管理”,发现此时出现“管理用户”;

7.点击进入展示“用户列表”;

8.点击右侧进入修改密码页面,修改后即可重新登录。

hinbackup备份插件的使用

经常报这个错
/Users/caoyujiao/.jenkins/workspace/iQiYiAppleTV/iQiYiAppleTV/Function/NetWork/RequestConst.swift:9:19: error: no such module 'Alamofire'
@_exported import Alamofire
^
** ARCHIVE FAILED **
解决:Alamofire版本不够,pod install,根据提示要pod repo update,再pod install一下就好了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容