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. 按照步骤创建账号

工程配置

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

《Jenkins持续集成》 1

《Jenkins持续集成》 2

《Jenkins持续集成》 3

《Jenkins持续集成》 构建脚本

构建脚本如下

 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  

《Jenkins持续集成》 构建脚本
《Jenkins持续集成》 构建脚本

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

《Jenkins持续集成》 1

《Jenkins持续集成》 2

《Jenkins持续集成》 3

《Jenkins持续集成》 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

《Jenkins持续集成》 打包时报错

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

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

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

深坑2

《Jenkins持续集成》 发送邮件报错日志

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

深坑3

《Jenkins持续集成》

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

扩展

扩展1

取版本号

bundleShortVersion=《Jenkins持续集成》{project_infoplist_path})

取build值

bundleVersion=《Jenkins持续集成》{project_infoplist_path})

取bundle Identifier前缀

bundlePrefix=《Jenkins持续集成》 ‘{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一下就好了

    原文作者:阿姣_0405
    原文地址: https://www.jianshu.com/p/47fe568b0496
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞