#!/bin/bash
workspace=$1 # 在打包节点中配置的远程工作目录 路径:对应节点-配置从节点-远程工作目录
buildNumber=$2 # 打包number(外显在jenkins列表中的数)
buildType=$3 # 打包类型
version=$4 # APP版本
branch=$ # 打包分支
versionCode=$6 # 代码版本
gitUrl="git@xgit.xxxxx.cn:app/android/project/XXXXX.git" # APP项目代码git链接
projectName=YYYYY # 项目名称
gradlecmd=gradle # 打包命令
logpath="/home/xxxxx/jenkins/log" # 存放log文件路径
appName=XXXX # APP打包后产物名称开头
echo "workspace : $workspace" # 打印 APP存放目录
echo "buildNumber : $buildNumber" # 打印 当前包 number
echo "buildType : $buildType" # 打印 当前打包类型
echo "branch : $branch" # 打印 当前打包分支
echo "version : $version" # 打印 当前APP版本
echo "versionCode : $versionCode" # 打印 当前APP的代码版本
# .bash_profile中常用于配置环境变量和用户一些自定义别名
# 一般shell脚本开头都会加上source ~/.bash_profile 确保环境变量等生效
source ~/.bash_profile
#updateCode
echo 'updateCode start' # 打印 开始更新代码
cd $workspace/$projectName # 进入到 远程工作目录下的项目文件夹下
git clean -df # git clean 用于清除未被add或被commit的本地修改 -d 删除未被添加到git路径中的文件(将 .gitignore 文件标记的文件全部删除) -f 表示强制执行
git checkout -- . # 放弃工作区全部的修改
git reset --hard # 恢复当前版本,删除工作区和缓存区的所有修改
git status # 用于查看在你上次提交之后是否有对文件进行再次修改 nothing to commit, working directory clean
git pull # 在上一次打包分支上,更新代码
branch_exists=`git branch -a | grep $branch` # 判断预设的代码分支是否存在
if [ "$branch_exists" == "" ]; then
echo "$branch does not exist" # 分支不存在,打印提示
exit 1
fi
git fetch --all # 下载远程仓库最新内容
git checkout $branch # 切换到预设分支
git status
git pull # 拉最新代码
echo 'updateCode success' # 打印提示代码更新成功
#archive des
if [ ! -d "$workspace/$buildNumber" ]; then # 如果目录下不存在对应number目录,新建目录
mkdir ${workspace}/$buildNumber
fi
#build
cd $workspace/$projectName
echo "gradle clean start" # 打印
$gradlecmd clean # gradle clean用于清理所有的中间编译结果。当数据遇到一些莫名其妙的Gradle编译问题时,通常会先执行gradle clean来清理中间数据,这也类似于IDE的clean工作。
echo "gradle clean end"
echo "----start build----"
$gradlecmd assemble${buildType} # gradle assembleRelease 命令行打Realse包 gradle assembleDebug 命令行打Debug包 (需要在项目的根目录下执行)
if [ $? -ne 0 ];then # $?表示上一条命令返回值 -ne 表示不等于 0(命令执行成功会返回0,执行不成功会返回1)
$gradlecmd:app:assemble${buildType} # 再次执行打包命令
fi
if [ $? -ne 0 ];then # 再次确定是否正确执行打包命令
exit 1
fi
echo "end build" # 打印build结束
#archive
debugoutput=$workspace/$projectName"/app/build/outputs/apk/dev/debug/*.apk" # Debug版本app产物路径
releaseoutput=$workspace/$projectName"/app/build/outputs/apk/production/release/*.apk" # Release版本app产物路径
if [ $buildType == 'Debug' ];then # 根据打包类型,确定apk路径
apk=$debugoutput
else
apk=$releaseoutput
fi
echo $apk # 打印apk路径
cp -r $apk $workspace/$buildNumber/${appName}_${buildNumber}.apk # 复制apk至目标路径下
if [ $? -ne 0 ];then
echo "############### build apk failed!! #################"
exit 1
fi
echo 'archive start' # 文件归档
if [ $buildType == 'Release' ];then
cp -r $workspace/$projectName/app/*mapping.txt $workspace/$buildNumber/mapping.txt # 将文件复制到对应number apk所在的目录 mapping.txt用于还原代码混淆
cp -r $workspace/$projectName/app/*seeds.txt $workspace/$buildNumber/seeds.txt #seeds.txt:列出没有被混淆的类和成员
cp -r $workspace/$projectName/app/*used.txt $workspace/$buildNumber/used.txt
if [ $? -ne 0 ];then
echo 'no mapping file'
exit 1
fi
fi
echo 'archive end'
#log bash
cd $workspace/${projectName} # 切换目录至远程工作目录-项目对应目录下
git diff > $workspace/$buildNumber/git_status.log # git diff > patch 不加其他参数时作用是:将我们本仓库工作区的修改拷贝一份到其他机器上使用
logFile=${logpath}/${appName}_${branch}_android.log # 定义log文件变量
if [ ! -f $logFile ];then # -f 文件存在 如果文件不存在,创建log文件
touch $logFile
lastmd5=''
else
lastmd5=`cat $logFile` # 查看 log文件内容
fi
newmd5=`git log | head -n1 | awk -F ' ' '{print $2}'` # 读取git log中第一行数据, 以空格作为分隔符,打印第二个字段(commit 记录)
echo $newmd5 > $logFile # 将日志覆盖到log文件中 commit提交记录
if [ x"$lastmd5" != x ] && [ "$lastmd5" != "$newmd5" ] ;then
git log $lastmd5..$newmd5 > $workspace/$buildNumber/git.log # 比较newmd5 比 lastmd5 有什么不一样,并保存到git.log 文件中
git diff $lastmd5..$newmd5 > $workspace/$buildNumber/git_diff.log # git diff 比较两个分支上最后 commit 的内容的差别,并保存到git_diff.log文件中
fi
#set description
apkurl="http://test-jenkins-cd.xxxx.cn/view/app_build/job/Android_XXX_Build/${buildNumber}/artifact/${buildNumber}/XXXX_${buildNumber}.apk"
myqr $apkurl -d $workspace/$buildNumber/ -p /home/xxxxx/jenkins/buildShell/xngapp.jpg -c # myqr apk 将apk文件生成二维码 -d 存放路径 -p 结合本地图片(背景、logo等)-c 彩色
des="[DESC]分支:${branch}<br/><img src=\"http://test-jenkins-cd.xxxx.cn/view/app_build/job/Android_XXXXX_Build/${buildNumber}/artifact/${buildNumber}/xxxxx.png\" height=\"150\" width=\"150\">" # 构建后操作 打包结果前端显示样式
echo "${des}"
使用正则匹配 [DESC]开头的字符串,\1表示匹配到的第一个结果
构建成功后在jenkins,bulid history列表显示样式