【Jenkins】自动编译流程实现

背景

语言:C++,Qt
操作系统:麒麟、凝思、红帽子
版本管理:SVN
持续集成工具:Jenkins
语言工具:shell,java

小目标

由于系统应用很大,src模块多,操作系统多,手工编译费时费力,而且是毫无技术含量的工作,于是用Jenkins pipeline+shell脚本实现多操作系统环境的自动编译功能,编译成功后,自动提交到SVN,编译出错时,自动发送包含错误信息的邮件给相关研发人员。

实现

Jenkins添加pipeline任务,并添加pipeline脚本,这样可以在不同操作系统同时进行编译
在这里插入图片描述
完整的pipeline脚本如下:

pipeline {
   agent none
    parameters {
	 string(name:'branch_name', defaultValue: 'release', description: '分支名称')
	 booleanParam(name: 'make_type', defaultValue: false, description: '是否make clean')
   }
   stages {
     stage('编译开始了'){
	     parallel{
		     stage('麒麟编译'){
			     agent {label '172.20.1.206-kylin'}
	             steps{
		             dir('/home/a5000/jenkins'){
			             sh 'sh build.sh 麒麟kylin ${branch_name} ${make_type}'
			            }
		            }
			    }
				
             stage('凝思编译') {
                 agent {label '172.20.1.108-linx'}
	             steps{
		             dir('/home/a5000/jenkins'){
			             sh 'sh build.sh 凝思linx ${branch_name} ${make_type}'
			            }
		            }
			    }
		      stage("红帽子编译"){
		         agent {label '172.20.1.232-redhat'}
	             steps{
		             dir('/users/a5000/jenkins'){
			             sh 'sh build.sh 红帽子Redhat7.2 ${branch_name} ${make_type}'
			            }
		            }
			    }
		    }
	    }
    }
}

脚本说明:
1.branch_name:pipeline中的参数,因为我有多个分支需要编译,所以通过参数控制编译哪个分支
2.make_type:执行qmake之前是否进行clean操作,默认值是false
3.build.sh:真正执行编译、提交编译结果等操作的shell脚本,放在编译节点机器上,直接调用

下面放上build.sh完整脚本:

#!/bin/sh
#name:build.sh
#auth:yaxxx
#usage:build.sh 麒麟 release false

echo "Current location $PWD"
echo "Home dir:$HOME"
echo "QTDIR:$QTDIR"
PARA_NUM=$#
if [ $PARA_NUM -lt 1 ]; then
	echo "project folder required,using method:build.sh xxx xxx 0"
	exit 0
fi

OS_TYPE=$1
MODULE_FOLDER=$HOME/smartsys_$2
BIN_FOLDER=$MODULE_FOLDER/bin
MAKE_TYPE=$3
LOG_NORMAL=$PWD/build_output_normal.out
LOG_ERROR=$PWD/build_output_error.out
SVN_INFO=$PWD/svn.txt

echo "**************$OS_TYPE环境:开始编译smartsys_$2分支******************"

echo "step1. go into $MODULE_FOLDER"
cd $MODULE_FOLDER

echo "step2. svn update dev and binary"
#source export.sh
source $HOME/.bash_profile $PWD
svn cleanup
svn up binary 
svn up dev 1>$SVN_INFO

echo "step3. qmaked and make"
cd $MODULE_FOLDER/dev/src
if $MAKE_TYPE;then
    echo "make clean before qmake"
    make clean > $LOG_NORMAL
else
    echo "Do not make clean"
fi
qmake -r CONFIG+=debug >> $LOG_NORMAL
make 1>>$LOG_NORMAL 2>&1

ERROR_STR=$(cat $LOG_NORMAL |grep -E '错误:|error:')

if [ -z "$ERROR_STR" ];then
    echo "************$OS_TYPE环境:smartsys_$2分支 编译正确************"
    echo "step4. bin svn commit"
    cd $BIN_FOLDER
    rm -rf *.gz *.tar
    svn add * --force --no-ignore
    svn commit -m "commit bin by jenkins/build.sh"
else
    echo "************$OS_TYPE环境:smartsys_$2分支 编译有错误,发邮件给开发者************"
    echo "step4. mail to developer"
    echo "$ERROR_STR">$LOG_ERROR
    if [[ "$OS_TYPE" =~ "7.2" ]];then
        SRC_DIR=$(grep '进入目录' $LOG_NORMAL|awk 'END{print $2}'|sed 's/进入目录“//g'|sed 's/”//g')
    else
        SRC_DIR=$(grep 'Entering' $LOG_NORMAL|awk 'END{print $4}'|sed 's/`//g'|sed "s/'//g")
    fi
    cd $SRC_DIR
    SVN_URL=$(svn info|grep 'URL'|awk '{print $2}')
    SVN_VERSION=$(svn info|grep '最后修改的版本'|awk '{print $2}')
    SVN_USER=$(svn info|grep '最后修改的作者'|awk '{print $2}')
    sed -i "1i****************本次编译错误概况如下****************" $LOG_ERROR
    sed -i "2i"****************操作系统:$OS_TYPE"" $LOG_ERROR 
    sed -i "3i"****************分支:smartsys_$2"" $LOG_ERROR
    sed -i "4i"****************路径:${SVN_URL}"" $LOG_ERROR
    sed -i "5i"****************程序:${SRC_DIR}"" $LOG_ERROR
    sed -i "6i"****************作者:$SVN_USER"" $LOG_ERROR
    sed -i "7i"****************版本:$SVN_VERSION"" $LOG_ERROR
    sed -i "8i"****************详细编译错误信息如下:****************"" $LOG_ERROR  	
    echo "************************************************************************************">>$LOG_ERROR
    echo "USER:"$SVN_USER >> $LOG_ERROR
	#拷贝日志到156邮件服务器上
    #scp $LOG_ERROR root@172.20.1.156:/root/remote_build_log
fi
echo "************$OS_TYPE环境:smartsys_$2分支 编译完成************"

收到的邮件样例如下:
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值