安卓apk在CentOS上自动化编译打包发布
如果你还在 手动
clean
->build
->上传apk到OSS
->执行app更新操作...
*本文 不含三方加固 等操作!!!
已经厌倦了每次手动发布版本, 请接着往下看!
步骤
- 在服务器上使用
Git
拉取最新代码 - 使用
Gradle
编译打包安卓项目 - 将打包好的
Apk
上传至OSS服务器 - 连接服务器执行
Sql
更新app (app版本号等信息存库, 不是读取xml文件) - 编写
Shell
脚本
准备工作
- CentOS服务器 (已安装
mysql
并正常运行) - OSS (已获取到
ACCESS_KEY_ID
和ACCESS_KEY_SECRET
) - Git 上已有安卓项目
1. 在服务器上使用Git拉取最新代码
- 安装Git
yum install git
- 查看是否已安装成功
git --version
- 新建文件夹存放新项目(比如我的项目叫
oa-app
) 然后cd进入oa-app
文件夹
mkdir oa-app
- 将
git
账号密码全局保存一下, 防止每次都需要输入 (懒得配置的直接看步骤2)
//全局保存
git config --global credential.helper store
//清除重置
git config --system --unset credential.helper
- 克隆
git
项目到服务器
git clone https://gitee.com/xxxxx.git //填写自己的git项目地址
- 当然这里也可以更换使用ssh地址
git remote rm origin
git remote add origin git@gitee.com:xxxxx.git
git remote -v
- 将服务器和远程关联起来
//如果本地新建了一个分支 branch_name,但是在远程没有
git branch --set-upstream-to=origin/master master
//如果远程新建了一个分支,本地没有该分支
git checkout --track origin/branch_name
- 执行
git pull
等命令可能会提示无权限, 需要在git项目管理页面
生成sshkey
ssh-keygen -t rsa -C "xxxxxx.com"
- 打开
/root/.ssh/id_rsa.pub
文件内容拷贝到git ssh公钥处
保存
2. 使用gradle编译打包安卓项目
安装编译所需的SDK
-
下载并安装
linux版的sdkmanager
管理工具 https://developer.android.google.cn/studio 最下面有个Command line tools only
点此下载后上传到服务器 或者
-
或者 回到
oa-app
项目文件夹下:
wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
- 下载成功, 然后解压 ,没有
unzip
命令 先下载yum install -y unzip zip
unzip sdk-tools-linux-4333796.zip //解压后是tools文件夹
tools
目录结构:
- 需要通过
bin/sdkmanager
来下载sdk
, 所以我们先配置一下环境变量
vim /etc/profile
在最后添加
#android
export ANDROID_HOME=/root/oa-app
export PATH=$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools:$PATH
wq
保存退出并刷新生效一下
source /etc/profile
附图环境变量配置: (注意路径)
- 根据项目
build-tools
版本和sdk
版本下载对应的版本, 比如我这里使用的是api 25
//查看打印出版本号确认是否配置成功
sdkmanager --version
//下载build-tools
sdkmanager "build-tools;27.0.3"
//下载platform
sdkmanager "platform-tools" "platforms;android-25"
中间会提示Accept? (y/N): y 回车
- 下载完成会保存在刚才的
oa-app
文件夹下, 查看已安装的和可用的sdk
列表
sdkmanager --list
安装Gradle
- 下载
Gradle
到oa-app
项目文件夹下, 根据自己项目gradle-wapper
下的distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
下载相应的gradle
版本
//下载 我这里是 4.10.1
wget https://downloads.gradle.org/distributions/gradle-4.10.1-all.zip
//解压
unzip gradle-4.10.1-all.zip
- 配置
gradle
环境变量
vim /etc/profile
//文件最后继续添加
#gradle
export GRADLE_HOME=/root/oa-app/gradle-4.10.1
export PATH=${GRADLE_HOME}/bin:$PATH
//保存退出并刷新
source /etc/profile
//查看配置是否成功
gradle -v
- 修改
app
项目中local.properties
配置刚才服务器上的sdk
路径
执行编译项目
- 进入
项目
所在目录
//先clean
gradle clean
//再build
gradle assembleRelease
第一次会下载依赖什么的, 比较慢耐心等待…
最后提示 BUILD SUCCESSFUL
打包成功, 默认 apk
在 /app/build/outputs/
下
- 附上一张
/root/oa-app/
下的目录结构: (OA
为as项目 ,刚才下载的一些工具已经删掉了)
3. 将打包好的apk上传至OSS
- 下载阿里OSS提供的
ossutil
工具
wget http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/50452/cn_zh/1524643963683/ossutil64
- 给
ossutil64
赋予可执行权限
chmod +x ossutil64
- 查看下载成功
./ossutil64 help ls -L ch
- 配置
ACCESS_KEY_ID
和ACCESS_KEY_SECRET
./ossutil64 config -e oss.aliyuncs.com -i ak -k sk
- 查看OSS上
bucket
列表
./ossutil64 ls
- 找到自己需要上传apk到OSS的存放位置
//根据自己路径创建, 我保存在office-auto/app/apk/文件夹下
oss://office-auto/app/apk
- 可以修改
ak
和sk
endPoint
等参数
vim /root/.ossutilconfig
- 上传文件命令, 查找刚才打好的
apk
是否可以上传成功, 上传后也可以到OSS后台管理查看
find /root/oa-app/OA/app/build/outputs -name '*.apk' -exec ./ossutil64 cp -f '{}' oss://office-auto/app/apk/ \;
- 修改自定义
apk
文件名
variant.outputs.all { output ->
outputFileName = "${variant.name.replace("Release", "")}${defaultConfig.versionName}.apk"
}
由于我是多渠道打包并在 build.gradle
中修改了输出的 目录名字
和 apk文件名
这里就不再修改了, 直接执行上传
4. 连接服务器执行sql更新app (app版本号等信息存库, 不是读取xml文件)
- 通过
shell
脚本解析output.json
文件获取versionCode
和versionName
,当然还有apk
大小
//方法1: 获取指定文件大小 人性化格式
du -sh /root/oa-app/OA/app/build/outputs/apk/app-release.apk | awk '{print $1}'
>> 13M
//方法2: 查询获取文件大小 字节
find oa-app/OA/app/build/outputs -name '*.apk' -exec stat -c '%s' '{}' \;
>> 12816027
//通过awk命令截取versionCode
cat /root/oa-app/OA/app/build/outputs/apk/output.json | awk -F "[:]" '/:/{print $7}' | awk -F "[,]" '/,/{print $1}'
>> 192
//通过awk命令截取versionName
cat /root/oa-app/OA/app/build/outputs/apk/ggxq/release/output.json | awk -F "[:]" '/:/{print $8}' | awk -F "[,]" '/,/{print $1}' | awk -F "[\"]" '/\"/{print $2}'
>> 1.9.2
- 连接数据库和拼接
insert_sql
语句
根据自己的
app更新表
来写sql语句
参数
update_content
更新内容可以使用read
命令输入
# 数据库
hostname="xx.xx.xx.xx"
port="xx"
username="xx"
password="xxxx"
dbname="xx"
tablename="t_xxxx"
# id 我这里是时间戳拼接的32位字符串
current_id=`date +%Y%m%d%H%M%SAAAAAAAAAAAAAAAAAA`
# create_time
create_time=`date +"%Y-%m-%d %H:%M:%S"`
# 拼接sql (根据自己的表结构写)
insert_sql="insert into ${tablename} values('${current_id}',${version_code},'${version_name}','${apk_size}','${update_content}',1,0,'${create_time}','',NULL,NULL,NULL)"
# ECS上的mysql
mysql -h${hostname} -P${port} -u${username} -p${password} ${dbname} -e "${insert_sql}"
# ECS服务器连接RDS数据库: mysql -h RDS的内网地址 -u RDS用户名 -p密码 要进入的数据库 -e "要执行的sql语句"
#mysql -h${hostname} -u${username} -p${password} ${dbname} -e "${insert_sql}"
RDS配置注意:
- 查看
RDS
内网地址 ECS
实例查看ECS
的vpc
路由器,确保两者用的是同一个路由器RDS
添加白名单分组,把你的ECS
服务器的ip
加入到白名单中
5. 编写 Shell
脚本
在
/root
目录下新建updateApp.sh
文件并编写shell
脚本
//新建文件
touch updateApp.sh
//编辑
vim updateApp.sh (下面有下载地址)
//赋予可执行权限
chmod +x updateApp.sh
- 最后, 执行Shell脚本即可
./updateApp.sh
附件: