ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

jenkins Android打包shell脚本解析

2022-07-01 17:00:17  阅读:303  来源: 互联网

标签:shell log echo buildNumber apk git workspace jenkins Android


#!/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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有