²¿ÃÅÓóÖÐø¼¯³ÉÒѾºÜ¾ÃÁË£¬µ«ÆäʵʹÓÃÆðÀ´»¹ÊǺÜÂé·³µÄ£¬Ã¿µ±Òª¸øÒ»¸öÐÂÏîÄ¿set
up³ÖÐø¼¯³ÉµÄ»·¾³£¬ËäÈ»ÊÇCopyһЩÏÖÓеÄjobs, µ«ÊÇÐí¶à²ÎÊý£¬±äÁ¿ÐèҪȥ¸Ä£¬È»ºó»¹Óе÷ÊÔ£¬ÉÙ˵3,4Ìì¸ãһϣ¬·Ç³£²»·½±ã¡£
×î½ü±È½Ï¿Õ£¬¾Í°ÑÏÖÓеijÖÐø¼¯³ÉϵͳÉý¼¶¸ÄÔìÏ£¬jobÓÃÒ»Ì×Ä£°å£¬È«²¿²ÎÊý»¯£¬Ö»ÒªÐÞ¸ÄÅäÖÃÎļþ£¬¾Í¿ÉÒÔΪÐÂÏîÄ¿ÅäÖúû·¾³¡£
±¾ÎĵÄÖØµãÊÇһЩ¾Ñ飬Ïë·¨µÄ·ÖÏí£¬²¢²»ÊÇһƪÊÖ°ÑÊÖ½ÌÄã´î½¨³ÖÐø¼¯³É»·¾³µÄ½Ì³Ì£¬¶øÇÒÔĶÁ±¾ÎÄÐèÒªÒ»¶¨µÄJenkins,
perl, shell½Å±¾µÄ»ù´¡ÖªÊ¶£¬ ËùÓõ½µÄ֪ʶÓУºJenkins+Maven+Git+Sonar+Perl+Shell
script
ÏÂͼºÜºÃµÄ˵Ã÷ÁËÎÒÃÇÏÖÓеÄJobÁ÷£¬ ÒÔÍùÊÇÿ¸öÏîÄ¿¶¼ÓÐÒ»Ì×ÕâÑùµÄjobÁ÷£¬ÏÖÔÚÎҸijÉÕâ¸öTemplate_service
jobÁ÷£¬¹©ËùÓеÄÏîĿʹÓã¬ÏîÄ¿ÃûÒ²ÊÇ×÷Ϊ²ÎÊý´«µÝ½øÀ´µÄ£¬Ã¿¸öjob¶¼ÊÇÓÃJenkins Execute
shellÕâ¸ö×é¼þÀ´ÊµÏÖ¹¦Äܵģ¬Ïñcheck out code£¬Email Notification,
Publish Junit test results, code coverage report µÈJenkins×Ô´ø×é¼þ¶¼Ã»ÓÐʹÓá£
ÔËÐл·¾³£º apache-maven-3.0.5, jdk1.7.0_15, git 1.8.2.1,
SonarQube 4.0, perl v5.8.8

½ÓÏÂÀ´¼òµ¥µÄ˵Ã÷һϸ÷¸öJobµÄ¹¦ÄÜ£¬ÒÔ¼°Ìù³öÏêϸµÄ½Å±¾¹©´ó¼Ò²Î¿¼¡£
³ýÁËÉÏͼÀïÃæµÄjob, »¹ÓÐÒ»¸öConfig job, exportһЩ»·¾³±äÁ¿
0)Template_Service_Config (one time run)
ÓÃÀ´Export »·¾³±äÁ¿µÄ£¬±ÈÈçProject list, project git µØÖ·£¬
export PROJECT_LIST=PROJECTA,PROJECTB export PROJECTA_GIT_PROJECT_URL=ssh://git@stash.xxx.com:7999/Project/ProjectA.git export PROJECTA_BRANCH=development export PROJECTA_SERVICE_NAME=China_Template_Service export PROJECTA_EMAIL_LIST=wadexu@xxx.com,xxx@xxx.com export PROJECTA_EMAIL_CC_LIST=wadexu@xxx.com
export PROJECTB_GIT_PROJECT_URL=ssh://git@stash.xxx.com:7999/abc/ProjectB.git
export PROJECTB_BRANCH=perf
export PROJECTB_SERVICE_NAME=China_ProjectB_DEV
export PROJECTB_EMAIL_LIST=wadexu@xxx.com,xxx@xxx.com
export PROJECTB_EMAIL_CC_LIST=wadexu@xxx.com
|
Build Õâ¸öjob µÄʱºòÐèÒªParameters

´úÂëÈçÏ£ºÖ÷Òª×÷ÓþÍÊǽ«ÊäÈëµÄParametersдÈëµ½Ò»¸öÎļþ£¬ÒÔ±ãºóÐøËùÓÐjob Ò»ÉÏÀ´sourceÒ»ÏÂ
TEST=${WORKSPACE}/test CONFIG_FILE=Project_Config.txt
rm -rf ${TEST}
git clone ssh://git@stash.xxx.com:7999/project/test.git
cd ${TEST}
cd Config
if [ ! -f "${CONFIG_FILE}" ]; then
touch "${CONFIG_FILE}"
fi
##########Rewrite the config file base on the
project list###########
CURRENT_TIME=`date +"%m/%d/%Y/%T"`
echo -e "export CONFIG_TIME=${CURRENT_TIME}\n
export PROJECT_LIST=${PROJECT_LIST}\n
export SHARED_FOLDER=~/jenkins/common\n"
> ${CONFIG_FILE}
###########List the project1 parameters###########
echo -e "${PROJECTA_PARAMETERS}" >>
${CONFIG_FILE}
###########List the project2 parameters###########
echo -e "${PROJECTB_PARAMETERS}" >>
${CONFIG_FILE}
git add ${CONFIG_FILE}
git commit -m "config file"
git push origin master
cp ${CONFIG_FILE} ~/jenkins/common/Config
cd ..
cp Scripts/* ~/jenkins/common/Scripts
chmod 755 ~/jenkins/common/Scripts/* |
»¹ÓоÍÊǽ«Ò»Ð©perlдµÄ½Å±¾´Ógit cloneÏÂÀ´·Åµ½Ä³Ò»¸ö¹«¹²Ä¿Â¼Ï£¬ÒÔ±ãºóÐøjobʹÓ㬠ÓÐÈçϽű¾£¬±ÈÈç·¢ËÍemail,
Unit test analyzer
²¿·Ö½Å±¾ÏñgridService, packageServiceÊDzÙ×÷¹«Ë¾Ò»¸öÍø¸ñÔÆ¼ÆËãÆ½Ì¨£¬°²×°rpm°ü£¬ÖØÆôserviceÓõ쬲»·½±ãÌù³öÀ´¡£
[wadexu@vm10226 common]$ cd Scripts/ [wadexu@vm10226 Scripts]$ ll total 404 -rwxr-xr-x 1 wadexu wadexu 37853 Mar 27 09:12 gridService -rwxr-xr-x 1 wadexu wadexu 4991 Mar 27 09:12 packageService -rwxr-xr-x 1 wadexu wadexu 1628 Mar 27 09:12 queryDB.pl -rwxr-xr-x 1 wadexu wadexu 317183 Mar 27 09:12 Reporter.jar -rwxr-xr-x 1 wadexu wadexu 2190 Mar 27 09:12 report.pl -rwxr-xr-x 1 wadexu wadexu 3415 Mar 27 09:12 sendEmail.pl -rwxr-xr-x 1 wadexu wadexu 1210 Mar 27 09:12 ServiceInfoProvider.pl -rwxr-xr-x 1 wadexu wadexu 3418 Mar 27 09:12 UnitTestAnalyzer.pl |
1)Template_Service_Initial
±éÀúProject list ÁгöµÄÏîÄ¿£¬ ʹÓÃcurl µ÷ÓÃÏÂÒ»¸öjob (Commit_Auto_Build)
µÄRest API£¬ Build job with parameter½Ó¿Ú
ÿ¸öÏîÄ¿µÄJobÁ÷¶¼ÊÇͨ¹ýProject name + Initial jobµÄBuild number
À´¹á´©µÄ, ÕâµãºÜÖØÒª£¬¶àÏîĿһÆðÔËÐÐʱ¸÷ÏîĿ֮¼ä²»»á´íÂÒ£¬±ÈÈçдLogÎļþ£¬·ÖÎöLogÎļþÉú³Éreport
rm -rf ${WORKSPACE}/*
####### Import config file #######
cd ~/jenkins/common/Config
. Project_Config.txt
cd ~/jenkins/common/Temp
####### Get the Project list and traverse the
list ######
id=1
list_size=`echo $PROJECT_LIST | awk -F ","
'{print NF;}'`
let list_size=list_size+1
while [ $id -lt $list_size ]
do
projectName=`echo "${PROJECT_LIST}"|awk
-v id=$id -F "," '{print $id}'`
if [ "$projectName " != ' ' ]; then
curl -X POST --user "jadmin:71103407"
-s http://vm10686.global.xxx.net:8080/view/Template/job/Template_Service_Commit_Auto_Build/build
--data json='{"parameter": [{"name":"PROJECT_NAME","value":"'$projectName'"},{"name":"PIPELINE_NUM","value":"'$BUILD_NUMBER'"}]}'
id=`expr $id + 1`
else
break
fi
done
|
2)Template_Service_Commit_Auto_Build
Õâ¸öJobµÄ×÷ÓÃÊÇÓÃÀ´±È½Ï´úÂë°æ±¾ÓÐûÓиüУ¬Èç¹ûÓиüУ¨»òÕßÊǵÚÒ»´ÎrunÕâ¸öjob£©¾Í»áµ÷ÓúóÐøµÄ--
Build job
»¹ÓоÍÊÇÁгöÕâ´ÎBuildºÍÉÏ´ÎBuildÖ®¼ä¸Ä¶¯¹ý´úÂëµÄ×÷Õß¡£
Èç¹û½«Initial job ÉèÖóÉÿ¼¸·ÖÖÓrunһϣ¬ÆäʵÕâ¸öjob¾ÍÆðµ½ÁË Ã¿µ±ÓÐÈËÌá½»´úÂ룬Ôò×Ô¶¯BuildµÄ×÷ÓÃÁË¡£

### Import config file ### cd ~/jenkins/common/Config . Project_Config.txt
### Initial parameters ###
GIT_PROJECT_URL=${PROJECT_NAME}"_GIT_PROJECT_URL"
GIT_PROJECT_URL=$(eval echo \${$GIT_PROJECT_URL})
BRANCH=${PROJECT_NAME}"_BRANCH"
BRANCH=$(eval echo \${$BRANCH})
LOG_NAME=${PROJECT_NAME}"_BUILD_"${PIPELINE_NUM}".log"
BUILD_LOG_FOLDER=${SHARED_FOLDER}/Log/${PROJECT_NAME}"_"${PIPELINE_NUM}
BUILD_LOG=${SHARED_FOLDER}/Log/${PROJECT_NAME}"_"${PIPELINE_NUM}/$LOG_NAME
mkdir $BUILD_LOG_FOLDER
GIT_PROJECT_NAME=${PROJECT_NAME}"_GIT_PROJECT_NAME"
GIT_PROJECT_NAME=$(eval echo \${$GIT_PROJECT_NAME})
#### setup ####
export CURRENT_RESOURCE_DIR=${WORKSPACE}/${GIT_PROJECT_NAME}
export CURRENT_MD5_FILE=${WORKSPACE}/${PROJECT_NAME}"_Code_Current"
export BASE_MD5_FILE=${WORKSPACE}/${PROJECT_NAME}"_Code_Base"
export CURRENT_AUTHOR_LIST=${WORKSPACE}/${PROJECT_NAME}"_Author_Current"
export BASE_AUTHOR_LIST=${WORKSPACE}/${PROJECT_NAME}"_Author_Base"
#### cd resource,get log commit MD5 ####
cd ${WORKSPACE}
rm -rf ${CURRENT_RESOURCE_DIR}
git clone ${GIT_PROJECT_URL}
cd ${CURRENT_RESOURCE_DIR}
git checkout -b ci origin/${BRANCH}
if [ ! -f "${BASE_AUTHOR_LIST}" ];
then
touch "${BASE_AUTHOR_LIST}"
fi
if [ ! -f "${BASE_MD5_FILE}" ]; then
touch "${BASE_MD5_FILE}"
########call build job######
curl -d --user "jadmin:71103407" -s
http://vm10686.global.xxx.net:8080/view/Template/job/Template_Service_Build/build
--data json='{"parameter":[{"name":"PROJECT_NAME","value":"'${PROJECT_NAME}'"},
{"name":"PIPELINE_NUM","value":"'${PIPELINE_NUM}'"}]}'
git log --pretty=format:"Author: %an"
> ${BASE_AUTHOR_LIST}
sort -u ${BASE_AUTHOR_LIST} > ${BUILD_LOG}
git log --max-count=1 --pretty=format:"%H"
> ${BASE_MD5_FILE}
exit 0
else
git log --max-count=1 --pretty=format:"%H"
> ${CURRENT_MD5_FILE}
git log --pretty=format:"Author: %an"
> ${CURRENT_AUTHOR_LIST}
fi
#### compare the md5 file, and run the job.####
## -a means && ##
if cmp -s ${CURRENT_MD5_FILE} ${BASE_MD5_FILE}
then
echo "same,no changes!"
else
mv ${CURRENT_MD5_FILE} ${BASE_MD5_FILE}
diff -b $CURRENT_AUTHOR_LIST $BASE_AUTHOR_LIST
| grep "<" | sed 's/^< //g' >
Update_Author.txt
mv ${CURRENT_AUTHOR_LIST} ${BASE_AUTHOR_LIST}
sort -u Update_Author.txt > ${BUILD_LOG}
########call build job######
curl -d --user "jadmin:71103407" -s
http://vm10686.global.xxx.net:8080/view/Template/job/Template_service_Build/build
--data json='{"parameter": [{"name":"PROJECT_NAME","value":"'${PROJECT_NAME}'"},{"name":"PIPELINE_NUM","value":"'${PIPELINE_NUM}'"}]}'
fi |
ÕâÀïÓõ½ÁË--pretty=format Õâ¸ö²ÎÊý£¬ %H¾ÍÊÇ´òÓ¡³ö¹þÏ£×Ö´®£¬ %anÊÇ´òÓ¡³öAuthor£¬
--max-count=1 È¡×î½üµÄÒ»Ìõlog ¼Ç¼
3) Template_Service_Build
Õâ¸öjobÊÇ×îºËÐĵÄjob£¬ Ö´ÐÐrpm build, ½«rpm°ü¶ªµ½¹«Ë¾ÄÚ²¿Íø¸ñÔÆ¼ÆËãÆ½Ì¨µÄRepositoryÏ£¬
·ÖÎöµ¥Ôª²âÊÔ½á¹û£¬ ÔËÐÐSonar, ´ÓSonarµÄÊ×Ò³ÉÏÄõ½Õâ¸öÏîÄ¿µÄһЩÐÅÏ¢£¬±ÈÈçSonarÉÏ blocker,
critical, major µÈissues, »¹ÓÐcode coverage£¬È«²¿´òÓ¡µ½logÀ
ÒÔ±ãºóÐøµÄ½Å±¾Éú³Éreport, ÁíÍâ¾ÍÊÇSonar issue, code coverage ²»´ï±ê£¬Ôò·¢ËÍÏàÓ¦µÄemail
¸øÏàÓ¦µÄproject email list
rm -rf ${WORKSPACE}/*
###### Import config file ######
cd ~/jenkins/common/Config
. Project_Config.txt
###### Initial parameters ######
GIT_PROJECT_NAME=${PROJECT_NAME}"_GIT_PROJECT_NAME"
GIT_PROJECT_NAME=$(eval echo \${$GIT_PROJECT_NAME})
LOG_NAME=${PROJECT_NAME}"_BUILD_"${PIPELINE_NUM}".log"
BUILD_LOG=${SHARED_FOLDER}/Log/${PROJECT_NAME}"_"${PIPELINE_NUM}/$LOG_NAME
BRANCH=${PROJECT_NAME}"_BRANCH"
BRANCH=$(eval echo \${$BRANCH})
GIT_PROJECT_URL=${PROJECT_NAME}"_GIT_PROJECT_URL"
GIT_PROJECT_URL=$(eval echo \${$GIT_PROJECT_URL})
REPOSITORY=${PROJECT_NAME}"_REPOSITORY"
REPOSITORY=$(eval echo \${$REPOSITORY})
INSTANCES=${PROJECT_NAME}"_INSTANCES"
INSTANCES=$(eval echo \${$INSTANCES})
COVERAGE_URL=${PROJECT_NAME}"_COVERAGE_URL"
COVERAGE_URL=$(eval echo \${$COVERAGE_URL})
SONAR_MIN_COVERAGE=${PROJECT_NAME}"_SONAR_MIN_COVERAGE"
SONAR_MIN_COVERAGE=$(eval echo \${$SONAR_MIN_COVERAGE})
MAX_MAJOR_ISSUE_NUM=${PROJECT_NAME}"_MAX_MAJOR_ISSUE_NUM"
MAX_MAJOR_ISSUE_NUM=$(eval echo \${$MAX_MAJOR_ISSUE_NUM})
MAX_CRITICAL_ISSUE_NUM=${PROJECT_NAME}"_MAX_CRITICAL_ISSUE_NUM"
MAX_CRITICAL_ISSUE_NUM=$(eval echo \${$MAX_CRITICAL_ISSUE_NUM})
SERVICE_NAME=${PROJECT_NAME}"_SERVICE_NAME"
SERVICE_NAME=$(eval echo \${$SERVICE_NAME})
EMAIL_LIST=${PROJECT_NAME}"_EMAIL_LIST"
EMAIL_LIST=$(eval echo \${$EMAIL_LIST})
author_list=`cat $BUILD_LOG | grep "Author"`
|| true
######### SET ENVIRONMENT VARIABLE ##############
export BASE_DIR=${WORKSPACE}/${GIT_PROJECT_NAME}
export SCRIPTS_HOME=${SHARED_FOLDER}/Scripts
cd ${SCRIPTS_HOME}
chmod 755 *
export PATH=$PATH:`pwd`
####### Build Job ######
cd ${WORKSPACE}
START_TIME=`date +"%m/%d/%Y %T"`
echo "overview->startTime: ${START_TIME}"
>> ${BUILD_LOG}
echo "overview->logURL: ${BUILD_URL}"
>> ${BUILD_LOG}
echo "overview->serviceType: ${PROJECT_NAME}
Service" >> ${BUILD_LOG}
git clone ${GIT_PROJECT_URL}
BUILD_FILE=rpmbuild.sh
cd ${BASE_DIR}
git checkout origin/${BRANCH}
let BUILD_NUMBER=100+${BUILD_NUMBER}
sed -i -r "s/^RELEASE.+/RELEASE=${BUILD_NUMBER}_Dev/g"
${BUILD_FILE}
sh ${BUILD_FILE}
cd ${WORKSPACE}
rm -rf *.rpm
mv `find . -type f -name "*.rpm" | egrep
-v '(\.src\.)' | egrep -v 'BUILD'` .
RPM=`ls *.rpm`
packageService --addPackages --repository ${REPOSITORY}
--packages "${RPM}"
############# Unit test analyze ###############
UnitTestAnalyzer.pl --path "${BASE_DIR}/.rpm/BUILD"
--sufix xml >> ${BUILD_LOG}
################Run Sonar################
cd ${BASE_DIR}
mvn clean install -f ${BASE_DIR}/pom.xml -DPASSWORD=$ENV{PASSWORD}
-DUSERNAME=$ENV{USERNAME} -e -B sonar:sonar
################Get project in Sonar ################
sonarProjectName=`sed -ne '/name/{s/.*<name>\(.*\)<\/name>.*/\1/p;q;}'
pom.xml`
lowerProjectName=`echo $sonarProjectName | awk
'{print tolower($0)}'`
sonarId=`queryDB.pl --query="select * from
resource_index where kee = '$lowerProjectName'
order by resource_id;"`
echo $sonarId
sonar_path=http://vm10686.global.xxx.net:9000/dashboard/index/${sonarId}
echo "SonarPath: ${sonar_path}" >>
${BUILD_LOG}
################Function for get Sonar home page
info################
##Key for what you want to find
##column to print
function get_html_value() {
html=$1
key=$2
column=$3
echo `cat $html | sed -n '/'$key'/p' | awk -v
column=$column -F "[><]" '{print
$column}'`
}
##############Sonar issues analyze ###############
curl ${sonar_path} > html.txt
blocker_num=`get_html_value html.txt m_blocker_violations
3`
critical_num=`get_html_value html.txt m_critical_violations
3`
major_num=`get_html_value html.txt m_major_violations
3`
minor_num=`get_html_value html.txt m_minor_violations
3`
info_num=`get_html_value html.txt m_info_violations
3`
echo "SonarIssues->Blocker: ${blocker_num}"
>> ${BUILD_LOG}
echo "SonarIssues->Critical: ${critical_num}"
>> ${BUILD_LOG}
echo "SonarIssues->Major: ${major_num}"
>> ${BUILD_LOG}
echo "SonarIssues->Minor: ${minor_num}"
>> ${BUILD_LOG}
echo "SonarIssues->Info: ${info_num}"
>> ${BUILD_LOG}
##############Sonar Code Coverage analyze ###############
code_coverage=`get_html_value html.txt m_coverage
7`
code_coverage_integer=`echo $code_coverage | sed
-n 's/%//p'`
line_coverage=`get_html_value html.txt m_line_coverage
5`
branch_coverage=`get_html_value html.txt m_branch_coverage
5`
echo "CoverageInfo->UnitTestsCoverage:
${code_coverage}" >> ${BUILD_LOG}
echo "CoverageInfo->LineCoverage: ${line_coverage}"
>> ${BUILD_LOG}
echo "CoverageInfo->BranchCoverage: ${branch_coverage}"
>> ${BUILD_LOG}
echo "CoverageInfo->CoverageThreshold:
${SONAR_MIN_COVERAGE}%" >> ${BUILD_LOG}
################Send Email Code Coverage <
Threshold ################
if (( $(echo "$code_coverage_integer <
$SONAR_MIN_COVERAGE" | bc -l) ))
then
mail_subject=${PROJECT_NAME}"_Service_Build
Job - Build # "${BUILD_NUMBER}" Failure"'!'
mail_body="Hi, ${PROJECT_NAME}""
project member"$'\n'$'\n'"Alerts : Unit
Tests Coverage: ${code_coverage} < CoverageThreshold:
${SONAR_MIN_COVERAGE}%, the latest build package
cannot be allowed to install to service - ${SERVICE_NAME}
[$INSTANCES]"'!'$'\n'$'\n'"For details
please refer to SonarQube - ${sonar_path}"$'\n'$'\n'"The
latest code author list as below:"$'\n'"${author_list}"
sendEmail.pl --subject "${mail_subject}"
--emaillist "${EMAIL_LIST}" --mailbody
"$mail_body" --msg_type "text"
exit 0
fi
################Send Email when Sonar has major
above issue################
if [ ${blocker_num} -gt 0 ] || [ ${critical_num}
-gt ${MAX_CRITICAL_ISSUE_NUM} ] || [ ${major_num}
-gt ${MAX_MAJOR_ISSUE_NUM} ]
then
mail_subject=${PROJECT_NAME}"_Service_Build
Job - Build # "${BUILD_NUMBER}" Failure"'!'
mail_body="Hi, ${PROJECT_NAME}""
project member"$'\n'$'\n'"Alerts : Sonar
major above issues != 0, the latest build package
cannot be allowed to install to service - ${SERVICE_NAME}
[$INSTANCES]"'!'$'\n'$'\n'"Blocker issues:
${blocker_num}"$'\n'"Critical issues:
${critical_num}"$'\n'"Major issues:
${major_num}"$'\n'"Minor issues: ${minor_num}"$'\n'"Info
issues: ${info_num}"$'\n'$'\n'"For details
please refer to SonarQube - ${sonar_path}"$'\n'$'\n'"The
latest code author list as below:"$'\n'"${author_list}"
sendEmail.pl --subject "${mail_subject}"
--emaillist "${EMAIL_LIST}" --mailbody
"$mail_body" --msg_type "text"
exit 0
fi
####### Call Deploy Job ######
curl -d --user "jadmin:71103407" -s
http://vm10686.global.xxx.net:8080/view/Template/job/Template_Service_Deploy/build
--data json='{"parameter": [{"name":"PROJECT_NAME","value":"'${PROJECT_NAME}'"},{"name":"PIPELINE_NUM","value":"'${PIPELINE_NUM}'"}]}' |
mvn clean install -f ${BASE_DIR}/pom.xml -DPASSWORD=$ENV{PASSWORD}
-DUSERNAME=$ENV{USERNAME} -e -B sonar:sonar
ÔËÐÐSonar µÄһЩÊý¾Ý¿âÅäÖÃÐÅÏ¢£¬ÊÇ·ÅÔÚmaven/conf/settings.xmlÎļþÀïµÄ¡£
ÁíÍâÒ»µã£ºÃ¿¸öÏîÄ¿ÔÚSonarÀïµÄÃû³ÆÊÇ ÏîÄ¿pomÎļþµÄ<name></name>±êÇ©ÀïµÄÖµ£¬¸ù¾ÝÕâ¸öֵȥÊý¾Ý¿âÀïËѳöid,
ÓÐÁËÕâ¸öid¾Í¿ÉÒÔÖ±½Ó·ÃÎʵ½SonarÉϵÄÕâ¸öÏîÄ¿ ±ÈÈçhttp://vm10686.global.xxx.net:9000/dashboard/index/1234
4)Template_Service_Deploy
BuildÍêÖ®ºó ¾ÍÊÇÒªDeployÁË£¬ ½«rpm°ü×°µ½ÏàÓ¦ServiceµÄinstanceÉÏ£¬È»ºóÖØÆôservice
rm -rf ${WORKSPACE}/* ###### Import config file ###### cd ~/jenkins/common/Config . Project_Config.txt
###### Initial parameters ######
SERVICE_NAME=${PROJECT_NAME}"_SERVICE_NAME"
SERVICE_NAME=$(eval echo \${$SERVICE_NAME})
INSTANCES=${PROJECT_NAME}"_INSTANCES"
INSTANCES=$(eval echo \${$INSTANCES})
PATTERN=${PROJECT_NAME}"_RPM_GREP_PATTERN"
PATTERN=$(eval echo \${$PATTERN})
LOG_NAME=${PROJECT_NAME}"_BUILD_"${PIPELINE_NUM}".log"
BUILD_LOG=${SHARED_FOLDER}/Log/${PROJECT_NAME}"_"${PIPELINE_NUM}/$LOG_NAME
##########SET ENVIRONMENT VARIABLE##############
SCRIPTS_HOME=~/jenkins/common/Scripts
cd ${SCRIPTS_HOME}
chmod 755 *
export PATH=$PATH:`pwd`
InstallTime=`date +"%m/%d/%Y %T"`
echo "Installation->InstallTime: ${InstallTime}"
>> ${BUILD_LOG}
############ Deploy ###############
gridService --add-service --service ${SERVICE_NAME}
--instance ${INSTANCES}
sleep 60
gridService --start-service --service ${SERVICE_NAME}
Endpoint="${INSTANCES}:8080"
echo "Installation->Endpoint: ${Endpoint}"
>> ${BUILD_LOG}
echo "Installation->LogURL: ${BUILD_URL}"
>> ${BUILD_LOG}
UpdateTime=`date +"%m/%d/%Y %T"`
echo "ServiceInfo->UpdateTime: ${UpdateTime}"
>> ${BUILD_LOG}
ServiceInfoProvider.pl --service ${SERVICE_NAME}
--pattern ${PATTERN} >> ${BUILD_LOG}
###### Call Polling Job ######
curl -d --user "jadmin:71103407" -s
http://vm10686.global.xxx.net:8080/view/Template/job/Template_Service_Polling/build
--data json='{"parameter": [{"name":"PROJECT_NAME","value":"'$PROJECT_NAME'"},{"name":"PIPELINE_NUM","value":"'$PIPELINE_NUM'"}]}' |
5)Template_Service_Polling
½ÓÏÂÀ´Í¨¹ýÕâ¸öPolling job ÂÖѯserviceÓÐûÓÐÆô¶¯ºÃ£¬ ÿ1·ÖÖÓ ÅжÏһϣ¬timeoutʱ¼ä10·ÖÖÓ£¬
½Å±¾ÆäʵºÜ¼òµ¥£¬¾ÍÊǵ÷Ò»¸ö½Ó¿Ú£¬²é¿´×´Ì¬ÊÇ·ñstatus=200
rm -rf ${WORKSPACE}/* ######## Import config file ######### cd ~/jenkins/common/Config . Project_Config.txt
####### SET ENV #############
export SCRIPTS_HOME=${SHARED_FOLDER}/Scripts
cd ${SCRIPTS_HOME}
chmod 755 *
export PATH=$PATH:`pwd`
###### Initial parameters #############
SERVICE_NAME=${PROJECT_NAME}"_SERVICE_NAME"
SERVICE_NAME=$(eval echo \${$SERVICE_NAME})
LOG_NAME=${PROJECT_NAME}"_BUILD_"${PIPELINE_NUM}".log"
BUILD_LOG=${SHARED_FOLDER}/Log/${PROJECT_NAME}"_"${PIPELINE_NUM}/$LOG_NAME
echo "pollingjob->logURL: ${BUILD_URL}"
>> ${BUILD_LOG}
###### Polling service whether start #############
sleep 30
gridService --ping --timeout 600 --interval 60
--service ${SERVICE_NAME}
###### Call API Testing Job ######
curl -d --user "jadmin:71103407" -s
http://vm10686.global.xxx.net:8080/view/Template/job/Template_Service_APITesting/build
--data json='{"parameter": [{"name":"PROJECT_NAME","value":"'${PROJECT_NAME}'"},{"name":"PIPELINE_NUM","value":"'${PIPELINE_NUM}'"}]}'
|
6)Template_Service_APITesting
PollingÖ®ºó ¾ÍÊǵ÷Óýè¿Ú²âÊÔµÄÄÚ²¿²âÊÔϵͳ£¬Èç¹ûexport µÄ±äÁ¿ÓÐ TestPlan ¾Í»áÖ´ÐУ¬·ñÔòÖ±½Óµ÷ÓÃ×îºóÒ»¸öjob--Report
rm -rf ${WORKSPACE}/*
###### Import config file ######
cd ~/jenkins/common/Config
. Project_Config.txt
###### Initial parameters ######
LOG_NAME=${PROJECT_NAME}"_BUILD_"${PIPELINE_NUM}".log"
BUILD_LOG=${SHARED_FOLDER}/Log/${PROJECT_NAME}"_"${PIPELINE_NUM}/$LOG_NAME
TESTPLAN_ID=${PROJECT_NAME}"_TESTPLAN_ID"
TESTPLAN_ID=$(eval echo \${$TESTPLAN_ID})
SERVICE_NAME=${PROJECT_NAME}"_SERVICE_NAME"
SERVICE_NAME=$(eval echo \${$SERVICE_NAME})
EMAIL_LIST=${PROJECT_NAME}"_EMAIL_LIST"
EMAIL_LIST=$(eval echo \${$EMAIL_LIST})
EMAIL_CC_LIST=${PROJECT_NAME}"_EMAIL_CC_LIST"
EMAIL_CC_LIST=$(eval echo \${$EMAIL_CC_LIST})
###########Set Env #############
export SCRIPTS_HOME=${SHARED_FOLDER}/Scripts/
cd ${SCRIPTS_HOME}
chmod 755 *
export PATH=$PATH:`pwd`
################Function################
##Key for what you want to find
##num occurrence of value if it multiple time
function jsonValue() {
KEY=$1
num=$2
awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'$KEY'\042/){print
$(i+1)}}}' | tr -d '"' | sed -n ${num}p
}
############### Main ######################
if [[ $TESTPLAN_ID == "" ]]; then
echo "TestPlan ID is blank"
###### Call Report Job ######
curl -d --user "jadmin:71103407" -s
http://vm10686.global.xxx.net:8080/view/Template/job/Template_Service_Report/build
--data json='{"parameter": [{"name":"PROJECT_NAME","value":"'$PROJECT_NAME'"},{"name":"PIPELINE_NUM","value":"'$PIPELINE_NUM'"}]}'
else
processID=$(curl -X GET http://vm10765.global.xxx.net:8080/tms/project/testPlan/run.spring?ids=$TESTPLAN_ID)
if [[ $processID != TestPlan-* ]]; then
mail_subject=${PROJECT_NAME}"_Service_TMS_APITesting
Job - Build # "${BUILD_NUMBER}" Failure"'!'
mail_body="TMS Server is not available now,
please contact adminstrator."
echo $mail_body
sendEmail.pl --subject "${mail_subject}"
--emaillist "${EMAIL_LIST}" --emailcclist
"${EMAIL_CC_LIST}" --mailbody "$mail_body"
--msg_type "text"
else
while [ 1 ]
do
response=$(curl -X GET http://vm10765.global.xxx.net:8080/tms/project/getProcessResult.spring?processID=$processID)
totalCounts=`echo $response | jsonValue totalCounts`
notStartCounts=`echo $response | jsonValue notStartCounts`
processingCounts=`echo $response | jsonValue processingCounts`
faildCounts=`echo $response | jsonValue faildCounts`
comparedCounts=`echo $response | jsonValue comparedCounts`
comparedFaildCounts=`echo $response | jsonValue
comparedFaildCounts`
unComparedCounts=`echo $response | jsonValue unComparedCounts`
if [ $notStartCounts == 0 ] && [ $processingCounts
== 0 ]; then
echo "End of run."
break
else
echo "API Testing is still running, please
wait..."
sleep 5
fi
done
############# Print Log ###################
echo "APITestingInfo->TotalCounts: $totalCounts"
>> ${BUILD_LOG}
echo "APITestingInfo->ErrorCounts: $faildCounts"
>> ${BUILD_LOG}
echo "APITestingInfo->ComparedPassedCounts:
$comparedCounts" >> ${BUILD_LOG}
echo "APITestingInfo->ComparedFailedCounts:
$comparedFaildCounts" >> ${BUILD_LOG}
echo "APITestingInfo->UnComparedCounts:
$unComparedCounts" >> ${BUILD_LOG}
###### Call Report Job ######
curl -d --user "jadmin:71103407" -s
http://vm10686.global.xxx.net:8080/view/Template/job/Template_Service_Report/build
--data json='{"parameter": [{"name":"PROJECT_NAME","value":"'$PROJECT_NAME'"},{"name":"PIPELINE_NUM","value":"'$PIPELINE_NUM'"}]}'
fi
fi |
7)Template_Service_Report
ÕâÀïÖ÷ÒªÊÇÉú³ÉReport²¢ÇÒ·¢ËÍEmail£¬ÓÃJavaдµÄÒ»¸öjar·Åµ½linuxÉÏÖ´Ðеģ¬ÓÃhtmlÖ±½ÓÌùÔÚÓʼþÀï·¢ËÍemailµÄ£¬¼òµ¥µÄÆäʵ¿ÉÒÔÓÃPerlд¸öexcel,ͳ¼ÆÏ²âÊÔÇé¿ö£¬×ö¸ö±¨±í¡£
rm -rf ${WORKSPACE}/*
###### Import config file ######
cd ~/jenkins/common/Config
. Project_Config.txt
###### Initial parameters ######
LOG_NAME=${PROJECT_NAME}"_BUILD_"${PIPELINE_NUM}".log"
BUILD_LOG_FOLDER=${SHARED_FOLDER}/Log/${PROJECT_NAME}"_"${PIPELINE_NUM}
BUILD_LOG=${SHARED_FOLDER}/Log/${PROJECT_NAME}"_"${PIPELINE_NUM}/$LOG_NAME
SERVICE_NAME=${PROJECT_NAME}"_SERVICE_NAME"
SERVICE_NAME=$(eval echo \${$SERVICE_NAME})
INSTANCES=${PROJECT_NAME}"_INSTANCES"
INSTANCES=$(eval echo \${$INSTANCES})
EMAIL_LIST=${PROJECT_NAME}"_EMAIL_LIST"
EMAIL_LIST=$(eval echo \${$EMAIL_LIST})
EMAIL_CC_LIST=${PROJECT_NAME}"_EMAIL_CC_LIST"
EMAIL_CC_LIST=$(eval echo \${$EMAIL_CC_LIST})
TESTPLAN_ID=${PROJECT_NAME}"_TESTPLAN_ID"
TESTPLAN_ID=$(eval echo \${$TESTPLAN_ID})
export SCRIPTS_HOME=${SHARED_FOLDER}/Scripts/
cd ${SCRIPTS_HOME}
chmod 755 *
export PATH=$PATH:`pwd`
export XML_REPORT=${WORKSPACE}/interface.xml
report.pl --log-path="$BUILD_LOG_FOLDER"
--output ${XML_REPORT}
REPORT_PATH=${WORKSPACE}/Report.html
echo ${REPORT_PATH}
java -Dxmlpath="${XML_REPORT}" -Dreport="${REPORT_PATH}"
-jar Reporter.jar
report_context=`cat $REPORT_PATH`
errorCounts=`cat $BUILD_LOG | grep "APITestingInfo->ErrorCounts"
| awk -F ": " '{print $2}'`
comparedFailedCounts=`cat $BUILD_LOG | grep "APITestingInfo->ComparedFailedCounts"
| awk -F ": " '{print $2}'`
sonarPath=`cat $BUILD_LOG | grep "SonarPath"
| awk -F ": " '{print $2}'`
############## Send Email ##################
if [ ${errorCounts} -gt 0 ] || [ ${comparedFailedCounts}
-gt 0 ]
then
mail_subject=${PROJECT_NAME}"_Service_Report
Job - Build # "${BUILD_NUMBER}" Failure"'!'
mail_body="Hi, ${PROJECT_NAME} project member
<BR><BR>The latest build package has
been installed to service - ${SERVICE_NAME} [$INSTANCES],
but the API testing has some test case failed.<BR><BR>Errored
Test Case: ${errorCounts}<BR>Failed Test
Case: ${comparedFailedCounts}<BR><BR>For
details please refer to Test Management System
- http://vm10765.global.xxx.net:8080/tms/login.spring<BR><BR>SonarQube
- $sonarPath<BR><BR>Report as below:<BR><BR>""$report_context"
sendEmail.pl --subject "${mail_subject}"
--emaillist "${EMAIL_LIST}" --emailcclist
"${EMAIL_CC_LIST}" --mailbody "$mail_body"
--attached ${REPORT_PATH}
else
if [[ $TESTPLAN_ID == "" ]]; then
mail_subject=${PROJECT_NAME}"_Service_Report
Job - Build # "${BUILD_NUMBER}" Success"'!'"
[No TestPlan for API testing]"
mail_body="Hi, ${PROJECT_NAME} project member
<BR><BR>The latest build package has
been installed to service - ${SERVICE_NAME} [$INSTANCES].<BR><BR>SonarQube
- $sonarPath<BR><BR>Report as below:<BR><BR>""$report_context"
else
mail_subject=${PROJECT_NAME}"_Service_Report
Job - Build # "${BUILD_NUMBER}" Success"'!'
mail_body="Hi, ${PROJECT_NAME} project member
<BR><BR>The latest build package has
been installed to service - ${SERVICE_NAME} [$INSTANCES]
and API testing has passed.<BR><BR>For
detailed test results, please refer to Test Management
System - http://vm10765.global.xxx.net:8080/tms/login.spring<BR><BR>SonarQube
- $sonarPath<BR><BR>Report as below:<BR><BR>""$report_context"
fi
sendEmail.pl --subject "${mail_subject}"
--emaillist "${EMAIL_LIST}" --emailcclist
"${EMAIL_CC_LIST}" --mailbody "$mail_body"
--attached ${REPORT_PATH}
fi
########### Tear Down ###########
rm -rf ${BUILD_LOG_FOLDER} |
ÎÒÉèÖõÄÊÇÿÌìÔËÐÐÒ»´ÎËùÓеÄprojectµÄ³ÖÐø¼¯³É£¬ ÊÕµ½µÄEmailÈçÏÂͼËùʾ£º


ReportÖеĺܶàÐÅÏ¢¶¼ÊÇÀ´Ô´ÓÚSonar
µ½ÕâÀï¾Í½áÊøÁËÂ𣬻¹Ã»ÓУ¬ Èç¹ûBuild job,µ¥Ôª²âÊÔ²»Í¨¹ý»òÕ߯äËûÔÒòµ¼ÖÂBuild Failure,
ÄÇÔõô°ì£¿
ÔÙ¼ÓÒ»¸öPost Build job, À´¼à¿ØBuild job£¬ Èç¹û¹ÒÁË£¬·¢email֪ͨÏîÄ¿ÈËÔ±¡£
ÏÂͼΪBuild job ¼ÓÒ»¸öAction, µ±Job Failedʱ´¥·¢Template_Service_Post_Build
job

Template_Service_Post_Build ½Å±¾ÈçÏ£º
rm -rf ${WORKSPACE}/* ######## Import config file ######### cd ~/jenkins/common/Config . Project_Config.txt
####### SET ENV #############
export SCRIPTS_HOME=${SHARED_FOLDER}/Scripts
cd ${SCRIPTS_HOME}
chmod 755 *
export PATH=$PATH:`pwd`
###### Initial parameters #############
LOG_NAME=${PROJECT_NAME}"_BUILD_"${PIPELINE_NUM}".log"
BUILD_LOG=${SHARED_FOLDER}/Log/${PROJECT_NAME}"_"${PIPELINE_NUM}/$LOG_NAME
EMAIL_LIST=${PROJECT_NAME}"_EMAIL_LIST"
EMAIL_LIST=$(eval echo \${$EMAIL_LIST})
EMAIL_CC_LIST=${PROJECT_NAME}"_EMAIL_CC_LIST"
EMAIL_CC_LIST=$(eval echo \${$EMAIL_CC_LIST})
author_list=`cat $BUILD_LOG | grep "Author"`
|| true
###### Monitor Service Build Job ########
build_job_url=`cat $BUILD_LOG | sed -n '/overview->logURL/p'
| awk -F ": " '{print $2}'`
build_job_build_number=`echo $build_job_url |
awk -F "/" '{print $(NF-1)}'`
build_job_log_url=$build_job_url"logText/progressiveText?start=0"
build_job_console_output=$build_job_url"console"
mail_subject=${PROJECT_NAME}"_Service_Build
Job - Build # "${build_job_build_number}"
Failure"'!'
mail_body="Hi, ${PROJECT_NAME}""
project member"$'\n'$'\n'"Build Failure"'!'$'\n'$'\n'"For
details please refer to Console Output - ${build_job_console_output}"$'\n'$'\n'"The
latest code author list as below:"$'\n'"${author_list}"
sendEmail.pl --subject "${mail_subject}"
--emaillist "${EMAIL_LIST}" --emailcclist
"${EMAIL_CC_LIST}" --mailbody "$mail_body"
--msg_type "text" |
ͬÀí»¹ÐèÒª¼ÓÒ»¸öTemplate_Service_Post_Polling jobÀ´¼à¿ØTemplate_Service_Polling
job£¬ Èç¹ûÂÖѯServiceµÄ½á¹ûÊÇÖØÆôʧ°Ü£¬ÔòÓʼþ֪ͨÏîÄ¿×éÈËÔ±¡£
½Å±¾ÈçÏ£º
rm -rf ${WORKSPACE}/* ######## Import config file ######### cd ~/jenkins/common/Config . Project_Config.txt
####### SET ENV #############
export SCRIPTS_HOME=${SHARED_FOLDER}/Scripts
cd ${SCRIPTS_HOME}
chmod 755 *
export PATH=$PATH:`pwd`
###### Initial parameters #############
LOG_NAME=${PROJECT_NAME}"_BUILD_"${PIPELINE_NUM}".log"
BUILD_LOG=${SHARED_FOLDER}/Log/${PROJECT_NAME}"_"${PIPELINE_NUM}/$LOG_NAME
EMAIL_LIST=${PROJECT_NAME}"_EMAIL_LIST"
EMAIL_LIST=$(eval echo \${$EMAIL_LIST})
EMAIL_CC_LIST=${PROJECT_NAME}"_EMAIL_CC_LIST"
EMAIL_CC_LIST=$(eval echo \${$EMAIL_CC_LIST})
author_list=`cat $BUILD_LOG | grep "Author"`
###### Monitor Service Polling Job ########
polling_job_url=`cat $BUILD_LOG | sed -n '/pollingjob->logURL/p'
| awk -F ": " '{print $2}'`
polling_job_build_number=`echo $polling_job_url
| awk -F "/" '{print $(NF-1)}'`
polling_job_log_url=$polling_job_url"logText/progressiveText?start=0"
polling_job_console_output=$polling_job_url"console"
mail_subject=${PROJECT_NAME}"_Service_Polling
Job - Build # "${polling_job_build_number}"
Failure"'!'
mail_body="Hi, ${PROJECT_NAME}""
project member"$'\n'$'\n'"Service Restart
Failure"'!'$'\n'$'\n'"For details please
refer to Console Output - ${polling_job_console_output}"$'\n'$'\n'"The
latest code author list as below:"$'\n'"${author_list}"
sendEmail.pl --subject "${mail_subject}"
--emaillist "${EMAIL_LIST}" --emailcclist
"${EMAIL_CC_LIST}" --mailbody "$mail_body"
--msg_type "text" |
ÏÖÔÚÎÒÃÇÀ´¿´Ò»Ï¸üкóµÄCI Á÷³Ìͼ

ÄÇô£¬Õâ¸öflowµÄǰÌáÊÇ ËùÓеÄÏîÄ¿¶¼Êǰ´Õâ¸öÁ÷³ÌÀ´µÄ£¬ÍòÒ»ÓÐÐ©ÌØ±ðµÄÏîÄ¿ÄØ? ±ÈÈçÒ»¸öÏîÄ¿£¬ËüÔÚBuild֮ǰ
ÐèÒªPre-BuildÒ»¸öCommonUtils°ü£¬ ÄÇÔõô°ìÄØ£¬¼òµ¥Ò»µã¾ÍÊÇΪÁËÕâ¸öÏîÄ¿¶¨ÖÆÒ»Ï¡£
ΪÁ˸ü¾ßͨÓÃÐÔ£¬À©Õ¹ÐÔ£¬·½±ãµÄ²åÈëһЩspecial job, ÎÒÃÇ¿ÉÒÔÔÚÿ¸öjobÖ®¼ä¼ÓÈë Exit
Point, ÒÔÊÊÓ¦Ò»Ð©ÌØ±ðµÄÏîÄ¿ÏëÔÚÈÎÒâµãPlug inÒ»Ð©ÌØ±ðµÄjob£¬
³ýÁËÒªÔÚConfig job ¼ÓÉÏһЩ¹æÔò£¬ ±ÈÈç export ProjectX_EXIT_POINT=Template_Service_Commit_Auto_Build|Special
ProjectX-PreBuild job
»¹ÒªÔÚÿ¸öjobÀï¼ÓһЩÅжÏÓï¾ä£¬±ÈÈ統ǰrunµÄjob name µÈÓÚProjectX_EXIT_POINTÒÔÊúÏß·Ö¸îµÄµÚÒ»¸öÖµ£¬Ôò±íÃ÷ÒªÔÚÕâ¸öjobÍ˳ö£¬
µÚ¶þ¸öÖµ±íÃ÷Ҫȥµ÷µÄspecial job name£¬µ±È» special job Àï×öÍêÁË×Ô¼ºµÄÊÂÖ®ºó»¹ÊÇÒª»Øµ÷ÔÀ´flowµÄÏÂÒ»¸öjob
Á÷³Ìͼ¸üÐÂÈçÏÂËùʾ£º

|