jenkins Android打包shell脚本解析
作者:互联网
#!/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列表显示样式
标签:shell,log,echo,buildNumber,apk,git,workspace,jenkins,Android 来源: https://www.cnblogs.com/wuaihua/p/16435252.html