使用Jenkins编译系统并且生成ota包,以及复制相关文件。

因为在工作中会遇到编译系统,并且我们有多个不同的芯片,所以编译的过程不太一样,即使是同一个芯片也有不同的model以及brand。而且在编译通过以后没有消息提示。以前用过Jenkins,所以想用Jenkins解决这些问题。

话不多说,先说一下解决思路,然后贴上代码。

实际上这个最核心的是编写shell脚本。为什么不直接使用shell脚本呢?因为Jenkins是使用了web页面操作简单,而且Jenkins可以通过不同的配置设置环境变量。

我们同一个芯片有不同的model和brand,这样我们通过脚本的sed命令对文件进行修改,并且可以在Jenkins里面设置参数化,这样我需编译那个版本就直接选择哪个版本。

此脚本具有以下功能:

  • 版本号自增;
  • 自动替换原来系统变量相关的参数,当然这个需要根据自己项目的情况来定;
  • 可以自定义版本编号;
  • 编译并且自动复制所需要的image文件,当然这个也需要自己手动先
    修改shell脚本;
  • 编译完成后自动发送钉钉消息,这个也需要自己手动先修改shell脚本;
  • 编译并且自动复制fota文件;
  • debug版本和user版本在保存到版本目录时,debug版本会在前面加“0debug”;
  • 复制生成的文件的时候会自动判断文件夹中是否已存在该版本,如果存在,则在后面加日期以及时间戳。
#!/bin/sh
echo $PATH

cur_project_path=~/D169HMC_OS/alps/
cur_version_path=~/version/

cd $cur_project_path

echo diy_version=${diy_version}

if [ $diy_version = 'diy_version' ] ; then
	old_version=`sed -n /\`echo $J_MODEL\`_VERSION/p mediatek/config/fars72_w_kk/cur_version.sh`
	# old_version= TWNSCT_VERSION=NEO-G700_HW1.3_PU_EN_GE_release.03.00.33
	echo old_version=$old_version
	# echo ${old_version##*.} | awk '{print int($0)+1}'

	if [ $isDebug = user ] ; then
		new_version=`echo ${old_version%.*}.\`echo ${old_version##*.} | awk '{print int($0)+1}'\``
		sed -i s/"$old_version"/"$new_version"/g mediatek/config/fars72_w_kk/cur_version.sh
		# new_version= TWNSCT_VERSION=NEO-G700_HW1.3_PU_EN_GE_release.03.00.34
	else
		new_version=`echo ${old_version%.*}.\`echo ${old_version##*.} | awk '{print int($0)+0}'\``
		# new_version= TWNSCT_VERSION=NEO-G700_HW1.3_PU_EN_GE_release.03.00.33
	fi
	echo new_version=$new_version
	J_VERSION=`echo ${new_version##*=}`.`date +%Y%m%d`
	# J_VERSION= NEO-G700_HW1.3_PU_EN_GE_release.03.00.34
else
	J_VERSION=${diy_version}
fi
echo J_VERSION=$J_VERSION

sed -i s/"^`sed -n /^P_MODEL/p mediatek/config/fars72_w_kk/ProjectConfig.mk`"/"P_MODEL=$J_MODEL"/g mediatek/config/fars72_w_kk/ProjectConfig.mk

if [ $J_MODEL = "TWNSCT" ] ; then
	sed -i s/"^`sed -n /^MTK_PRODUCT_LOCALE/p mediatek/config/fars72_w_kk/ProjectConfig.mk`"/"MTK_PRODUCT_LOCALES=pt_PT en_GB zh_CN"/g mediatek/config/fars72_w_kk/ProjectConfig.mk
elif [ $J_MODEL = "ZAFTEL" ] ; then
	sed -i s/"^`sed -n /^MTK_PRODUCT_LOCALE/p mediatek/config/fars72_w_kk/ProjectConfig.mk`"/"MTK_PRODUCT_LOCALES=en_GB pt_PT zh_CN"/g mediatek/config/fars72_w_kk/ProjectConfig.mk
elif [ $J_MODEL = "ZAFTHE" ] ; then
	sed -i s/"^`sed -n /^MTK_PRODUCT_LOCALE/p mediatek/config/fars72_w_kk/ProjectConfig.mk`"/"MTK_PRODUCT_LOCALES=en_GB pt_PT zh_CN"/g mediatek/config/fars72_w_kk/ProjectConfig.mk
else
	echo ${J_MODE}'is not exites'
	exit 2
fi

sed -i s/"^`sed -n /^P_DISPLAY_ID/p mediatek/config/fars72_w_kk/ProjectConfig.mk`"/"P_DISPLAY_ID=$J_VERSION"/g mediatek/config/fars72_w_kk/ProjectConfig.mk

OLD_P_INTERNAL_VERSION=`sed -n /^P_INTERNAL_VERSION/p mediatek/config/fars72_w_kk/ProjectConfig.mk`
# OLD_P_INTERNAL_VERSION= P_INTERNAL_VERSION=140
#if [ $isDebug = user ] ; then
NEW_P_INTERNAL_VERSION=P_INTERNAL_VERSION=`echo ${OLD_P_INTERNAL_VERSION##*=} | awk '{print int($0)+1}'`
	# NEW_P_INTERNAL_VERSION= P_INTERNAL_VERSION= P_INTERNAL_VERSION=141
sed -i s/"^`sed -n /^P_INTERNAL_VERSION/p mediatek/config/fars72_w_kk/ProjectConfig.mk`"/"$NEW_P_INTERNAL_VERSION"/g mediatek/config/fars72_w_kk/ProjectConfig.mk
#else
#	NEW_P_INTERNAL_VERSION=P_INTERNAL_VERSION=`echo ${P_INTERNAL_VERSION##*=} | awk '{print int($0)+1}'`
	# NEW_P_INTERNAL_VERSION= P_INTERNAL_VERSION= P_INTERNAL_VERSION=140
#fi
echo OLD_P_INTERNAL_VERSION=$OLD_P_INTERNAL_VERSION
echo NEW_P_INTERNAL_VERSION=$NEW_P_INTERNAL_VERSION

rm -rf out/
source build/envsetup.sh
option=""
if [ $isDebug = user ] ; then
	option="-o=TARGET_BUILD_VARIANT=user"
fi
echo option=$option
./mk `echo $option` project n

VERSION_AND_BACKUP_PATH=`sed -n /^ro.build.display.id=/p out/target/product/fars72_w_kk/system/build.prop`
VERSION_AND_BACKUP_PATH=`echo ${VERSION_AND_BACKUP_PATH##*=}`

if [ $isDebug != user ] ; then
	VERSION_AND_BACKUP_PATH=0debug_$VERSION_AND_BACKUP_PATH
fi

if [ -d "$cur_version_path/$VERSION_AND_BACKUP_PATH" ] ; then
	VERSION_AND_BACKUP_PATH=${VERSION_AND_BACKUP_PATH}_`date +%Y%m%d`_`date +%s`
fi

# rm -rf $cur_version_path/$VERSION_AND_BACKUP_PATH

echo VERSION_AND_BACKUP_PATH=$VERSION_AND_BACKUP_PATH

echo 'create dir'
mkdir $cur_version_path/$VERSION_AND_BACKUP_PATH
mkdir $cur_version_path/$VERSION_AND_BACKUP_PATH/db
mkdir $cur_version_path/$VERSION_AND_BACKUP_PATH/fota
mkdir $cur_version_path/$VERSION_AND_BACKUP_PATH/image
echo 'copy files'
cp vendor/vogtec/app/apps/version_log.txt $cur_version_path/$VERSION_AND_BACKUP_PATH

cd out/target/product/fars72_w_kk/

cp obj/CODEGEN/cgen/APDB_MT6572_S01_KK1.MP7_ $cur_version_path/$VERSION_AND_BACKUP_PATH/db
cp obj/CUSTGEN/custom/modem/BPLGUInfo* $cur_version_path/$VERSION_AND_BACKUP_PATH/db
cp obj/CUSTGEN/custom/modem/DbgInfo* $cur_version_path/$VERSION_AND_BACKUP_PATH/db

cp boot.img $cur_version_path/$VERSION_AND_BACKUP_PATH/image
cp cache.img $cur_version_path/$VERSION_AND_BACKUP_PATH/image
cp EBR1 $cur_version_path/$VERSION_AND_BACKUP_PATH/image
cp lk.bin $cur_version_path/$VERSION_AND_BACKUP_PATH/image
cp logo.bin $cur_version_path/$VERSION_AND_BACKUP_PATH/image
cp MBR $cur_version_path/$VERSION_AND_BACKUP_PATH/image
cp MT6572_Android_scatter.txt $cur_version_path/$VERSION_AND_BACKUP_PATH/image
cp preloader_fars72_w_kk.bin $cur_version_path/$VERSION_AND_BACKUP_PATH/image
# cp ramdisk.img $cur_version_path/$VERSION_AND_BACKUP_PATH/image
cp recovery.img $cur_version_path/$VERSION_AND_BACKUP_PATH/image
cp secro.img $cur_version_path/$VERSION_AND_BACKUP_PATH/image
cp system.img $cur_version_path/$VERSION_AND_BACKUP_PATH/image
cp userdata.img $cur_version_path/$VERSION_AND_BACKUP_PATH/image

cp system/build.prop $cur_version_path/$VERSION_AND_BACKUP_PATH/fota

echo 'rar images'
cd $cur_version_path
rar a $VERSION_AND_BACKUP_PATH.rar $VERSION_AND_BACKUP_PATH

curl 'https://oapi.dingtalk.com/robot/send?access_token=*' \
-H 'Content-Type: application/json' \
-X POST \
-d '{"msgtype":"text","text": {"content":"系统编译完成\n项目:${JOB_NAME}\n版本号:'`echo $VERSION_AND_BACKUP_PATH`'"}}'

cd $cur_project_path
./mk `echo $option` project otapackage

echo "copy fota files"
cd out/target/product/fars72_w_kk/
cp fars72_w_kk*.zip $cur_version_path/$VERSION_AND_BACKUP_PATH/fota
cp obj/PACKAGING/target_files_intermediates/fars72_w_kk*.zip $cur_version_path/$VERSION_AND_BACKUP_PATH/fota

if [ $isDebug = user ] && [ $diy_version = 'diy_version' ] ; then
	echo "git commit"
	cd $cur_project_path
	git add .
	git commit -a -m `echo 发布$VERSION_AND_BACKUP_PATH`
fi

curl 'https://oapi.dingtalk.com/robot/send?access_token=*' \
-H 'Content-Type: application/json' \
-X POST \
-d '{"msgtype":"text","text": {"content":"FOTA编译完成\n项目:${JOB_NAME}\n版本号:'`echo $VERSION_AND_BACKUP_PATH`'"}}'

此脚本只是提供一个思路,在我目前的项目里面已经验证过可用了,但是还是缺少一些判断。如果有什么疑问欢迎留言。

You May Also Like

About the Author: ice.zhai

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注