最近比较忙,拖更很长时间。
今天分享给各位关于使用jenkins自动构建安卓项目并自动提交到fir.im(类似蒲公英一样的app托管平台,app开发的同学应该都知道这里不多说),同时会在构建历史里看到二维码。如下这样子,左侧是二维码可以收集扫描下载,右侧是fir.im的连接打开也是二维码,多种方式都可以。
jenkins+gradlew 打包 生成二维码
##############################################################################################
开始:
一、jenkins环境这里不描述了,很简单网上教程也很多,jenkins.io上下载一个war包 用tomcat或者java -jar jenkins.war就可以了。而且jenkins也支持docker 、docker file部署等等
二、安装插件:
系统管理-管理插件-可选插件里搜索:description setter plugin,因为我这里安装了所以实在已安装里。未安装的同学,自己要去可选插件里搜索。
description setter plugin 安装
三、fir-cli安装
正常fir.im提供一个jenkins插件的,而且jenkins本身也可以搜到,但是我亲测不好用,不如直接用fir-cli的命令行,这个实用太多。
使用fir.im需要去这个网站上注册一个账号,然后在账号信息里拿到一个token号,后面用于登录使用。
fir.im个人资料里
api token
安装fir-cli需要借助ruby的gem,并且这个对ruby的版本有要求,2.0以下都不行,建议安装最新的,最新应该是2.3.4
# wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.4.tar.gz -p /usr/local/src
#cd !$
#tar -zvxf ruby-2.3.4.tar.gz
#cd ruby-2.3.4
#./configure && make && make install
安装完成后:
#ruby -v
可以看到版本号
安装fir-cli:
#gem install fir-cli
fir-cli安装完成后可以使用fir命令 login或者publish你的应用了常用的几个参数如下:
fir helpCommands:
全局参数说明
alias <short command> 意味着可以用 alias 别名来代替该指令, 例如 fir b
-T 用户在 fir.im 上的 api_token
-L 指定 fir-cli 的输出 log, 默认为 STDOUT
-V Verbose, 默认为输出所有信息( INFO 和 ERROR), 如果设置--no-verbose, 则只输出 ERROR 信息
-q 静默模式, 默认关闭
-h 查看相关命令帮助
这个项目在github上开源了,各位也可以去github上看详细内容。我这里说我用到的参数:
fir publish -s $shorturl -T $token -Q /xx/xx.apk
解释下:
$shorturl 是短连接,这里是变量记得替换成你想定义的短连接名称。 最后你的app上传到fir.im之后的连接例如:fir.im/shorturl 打开之后就是你的app下载页。
$token 就是上面我说的去个人信息里获取的token一串数字
-Q生成二维码 路径在你的app路径里
最后是你要上传的app
PS:短连接中不允许下划线,否则会提交不上。
这里先不说打包,先说打完包后的处理。
事先我们可以在命令行里输入
fir publish -s testurl -T 883540111111111c9587fc61c7284b64 -Q /tmp/soft/product/yqh_qa/merchant.apk
日志如下:
四、创建一个job
jenkins 环境准备完成后新建的一个test的自由风格的软件项目即可。
创建自由风格软件项目
这里只说几个重要的配置:
项目管理:比如你是svn,那你就配置svn的版本库地址和用户名密码
git的话,那你可能需要把你jenkins的服务器公钥配置到git服务器上,然后你才可以使用git clone 或者fetch
剩下就是构建:
构建我们选择 Execute shell构建
然后app打包很简单 ,上面从版本库取下代码之后,android会自带一个gradew打包工具执行以下即可
xxx是你的项目名称,这里要cd到你的项目里才能执行gradlew ,否则你也找不到这个命令不是。$WORKSPACE是jenkins的全局变量,就是你当前的工作目录。
#cd $WORKSPACE/xxxx
这里还有一个是android的sdk安装,否则你也是打包不了的。这个这里不讲,有需要可以留言。
#./gradew
打完包之后执行fir的publish命令即可。
#fri publish -s testurl -T xxxxxxxxxxxxx -Q /xx/xxx/xxx/xx/xx.apk
五、提取二维码和下载连接
前面publish成功之后,我们需要将二维码还有下载连接(这两个在上面的日志里可以看到,我们需要用正则提取出来)放到构建历史里
需要的插件就是我们前面安装的 description setter plugin 这个安装成功后在jenkins的构建后里。规则如下:
第一个是提取下载连接,第二个是把二维码用html标签的形式加载出来。
这里需要做的操作是 我们需要将上面publish时候生成的二维码复制到tomcat的webapps/qrcode文件夹里 这里才可以被访问到。所以要求我们每次构建cp的时候加-u参数就会自动替换上一次的了。
另外还需要有一个设置,这个二维码才可以正常显示出来就是jenkins 系统管理--》全局安全管理(Configure Global Security)下Markup Formatter这一项改为Safe Html,默认是Plain text。
配置玩这些,保存即可。
小Tips:
这里也有一些小提醒给各位:
1.token这里我们可以通过参数化构建设置一个参数String类型的。这样我们可以在构建的时候填写。我暂时不清楚这个token的有效期。所以建议把token作为一个参数来用,不要再构建过程的shell里写死。
2.我们实际测试环境中需要打包多个apk,正如我第一个图中我们打了四个包。提取url 就一套正则即可。显示的时候把四个都写上即可。但是需要注册四个fir.im账号,需要四个token。如下
<img src='/qrcode/release.png' height="100" width="100">\n<a >release.apk</a><br><img src='/qrcode/debug.png' height="100" width="100">\n<a >debug.apk</a><br><img src='/qrcode/update.png' height="100" width="100">\n<a >update.apk</a><br><img src='/qrcode/debug_update.png' height="100" width="100">\n<a >debug_update.apk</a>
复制的时候注意改名,否则下一次会覆盖上一次,如果你是一个app的话。
3.发下我的测试环境构建shell有兴趣看下,没兴趣可以略过。
export ANDROID_HOME="/usr/local/sdk"
yqh_branch_name="qa"
cd $WORKSPACE
cd Merchant
#测试环境、研发环境
version_Code=$(grep "versionCode" app/build.gradle |awk '{print $2}')
#获取版本号+1
update_version_Code=$(( version_Code +1 ))
#app命名加上版本号
init_app_name=$app_name
app_name=${app_name}_${version_Code}
if [ -e ./app/build/outputs/apk/app-release.apk ];then
rm -rf ./app/build/outputs/apk/app-release.apk
fi
if [ -e ./app/build/outputs/apk/app-debug.apk ];then
rm -rf ./app/build/outputs/apk/app-debug.apk
fi
./gradlew assembleRelease
./gradlew assembleDebug
if [ $yqh_branch_name = 'qa' ];then
go_env="qa"
yqh_output="yqh_qa"
host="yqh_test_web"
elif [ $yqh_branch_name = 'develop' ];then
go_env="dev"
yqh_output="yqh_dev"
host="yqh_dev_web"
else
exit -1
fi
source="/tmp/soft/product/$yqh_output/"
if [ -e "$source/${app_name}_release.apk" ];then
rm -f $source/${app_name}_release.apk
cp ./app/build/outputs/apk/app-release.apk $source/${app_name}_release.apk
else
cp ./app/build/outputs/apk/app-release.apk $source/${app_name}_release.apk
fi
#上传release.apk至fir,并输出短连接和二维码
/usr/local/bin/fir publish -T $fir_token_1 -s releaseurl -Q $source/${app_name}_release.apk
echo "png nme"$(ls *png)
cp -u /tmp/soft/product/yqh_qa/fir-91商户中心.png /home/ops/tomcat_jenkins/webapps/qrcode/release.png
######debug
if [ -e "$source/${app_name}_debug.apk" ];then
rm -f $source/${app_name}_debug.apk
cp ./app/build/outputs/apk/app-debug.apk $source/${app_name}_debug.apk
else
cp ./app/build/outputs/apk/app-debug.apk $source/${app_name}_debug.apk
fi
#上传release.apk至fir,并输出短连接和二维码
/usr/local/bin/fir publish -T $fir_token_2 -s debugurl -Q $source/${app_name}_debug.apk
cp -u /tmp/soft/product/yqh_qa/fir-91商户中心.png /home/ops/tomcat_jenkins/webapps/qrcode/debug.png
#########
cd $source
chk_sum=$(md5sum ${app_name}_release.apk)
#debug
ansible $host -m copy -a "src=$source/${app_name}_debug.apk dest=/home/91product/resource/app/apk/"
ansible $host -m copy -a "src=$source/${app_name}_release.apk dest=/home/91product/resource/app/apk/"
ansible $host -m shell -a "echo $chk_sum > /home/91product/resource/app/apk/chk_sum.txt"
############################################################
#测试升级包编译
app_name=${init_app_name}_${update_version_Code}
#修改版本号
sed -n "s/versionCode.*/versionCode ${update_version_Code}/p" $WORKSPACE/Merchant/app/build.gradle
sed -i "s/versionCode.*/versionCode ${update_version_Code}/g " $WORKSPACE/Merchant/app/build.gradle
cd $WORKSPACE/Merchant
#判断apk是否存在,存在删除
if [ -e ./app/build/outputs/apk/app-release.apk ];then
rm -rf ./app/build/outputs/apk/app-release.apk
fi
if [ -e ./app/build/outputs/apk/app-debug.apk ];then
rm -rf ./app/build/outputs/apk/app-debug.apk
fi
./gradlew assembleRelease
./gradlew assembleDebug
if [ -e "$source/${app_name}_update.apk" ];then
rm -f $source/${app_name}_update.apk
cp ./app/build/outputs/apk/app-release.apk $source/${app_name}_update.apk
else
cp ./app/build/outputs/apk/app-release.apk $source/${app_name}_update.apk
fi
#上传update.apk至fir,并输出短连接和二维码
/usr/local/bin/fir publish -T $fir_token_3 -s updateurl -Q $source/${app_name}_update.apk
cp -u /tmp/soft/product/yqh_qa/fir-91商户中心.png /home/ops/tomcat_jenkins/webapps/qrcode/update.png
######debug
if [ -e "$source/${app_name}_debug_update.apk" ];then
rm -f $source/${app_name}_debug_update.apk
cp ./app/build/outputs/apk/app-debug.apk $source/${app_name}_debug_update.apk
else
cp ./app/build/outputs/apk/app-debug.apk $source/${app_name}_debug_update.apk
fi
#上传debug_update.apk至fir,并输出短连接和二维码
/usr/local/bin/fir publish -T $fir_token_4 -s debugupdateurl -Q $source/${app_name}_debug_update.apk
cp -u /tmp/soft/product/yqh_qa/fir-91商户中心.png /home/ops/tomcat_jenkins/webapps/qrcode/debug_update.png
####
cd $source
chk_sum=$(md5sum ${app_name}_update.apk)
#debug
ansible $host -m copy -a "src=$source/${app_name}_debug_update.apk dest=/home/91product/resource/app/apk/"
ansible $host -m copy -a "src=$source/${app_name}_update.apk dest=/home/91product/resource/app/apk/"
ansible $host -m shell -a "echo $chk_sum > /home/91product/resource/app/apk/chk_sum_update.txt"
本文暂时没有评论,来添加一个吧(●'◡'●)