专业的编程技术博客社区

网站首页 > 博客文章 正文

运维干货来啦:Jenkins+gradlew自动构建android项目提供下载链接和二维码下载

baijin 2024-08-27 11:20:22 博客文章 3 ℃ 0 评论

最近比较忙,拖更很长时间。

今天分享给各位关于使用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"

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表