Jenkins持续集成

作者: 阿姣_0405 | 来源:发表于2018-01-03 16:57 被阅读286次

    背景

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

    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

    补充

    • 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}

    相关文章

      网友评论

      本文标题:Jenkins持续集成

      本文链接:https://www.haomeiwen.com/subject/kcxknxtx.html