#!/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 android jenkinsandroid打包shell获取版本号_bash

构建成功后在jenkins,bulid history列表显示样式

jenkins android jenkinsandroid打包shell获取版本号_hive_02