Jenkins配置自动构建,自动加固,自动上传
在Android自动化构建中,可以使用Jenkins自动构建版本发布。
Jenkins的安装可以参考,加固使用的是360加固
一,apk包名的自动生成
发布版本的时候需要把apk名进行修改,添加上版本号,渠道,日期等信息。
使用方式是在app包下的build.gradle文件中添加:
static def moduleName(){
return 'BASE'
}
static def releaseTime() {
return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}
android{
....
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
//这里修改apk文件名
def fileName = "${moduleName()}-V${defaultConfig.versionName}-RC-${releaseTime()}-chs.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
修改后的文件还在build》outputs》apk文件夹下
二,配置Android的构建Jenkins
这里只写几个特殊的配置项。
1,配置自定义的项目路径
2,配置Git地址(也可以是其他的版本管理)
3,配置文件删除时间限制
5,配置apk构建
4,构建完成后执行加固和上传的python
5,配置加固的脚本文件
360加固的使用手册
https://bbs.360.cn/forum.php?mod=viewthread&tid=6294457&extra=page%3D1&page=1&archive_src=bbs_safe
加固的代码
# coding=utf-8
import os
import subprocess
import sys
import shutil
import time
def file_name(root,ex):
root1=[]
for i in os.listdir(root): #os.listdir(root) 读取root目录下的文件和目录
root1=os.path.splitext('/'+root+'/'+i) #os.path.splitext()读取文件扩展名
if root1[1]:
if i.count(ex)>0:
return (root+'/'+i)
#sys.argv[1]工程目录,在工程目录下查找包含RC的apk文件
apkfile = file_name(sys.argv[1]+/app/build/outputs/apk/','RC');
#base cmd
java = "java"
cmd = '-jar'
jar = 'E:/360jiagubao_windows_64/jiagu/jiagu.jar'
#login
cmd_login = '-login'
#用户名 需要补齐
name = ''
#密码 需要补齐
pwd = ''
#sign
cmd_sign = '-importsign'
//app签名文件的路径
key_path = 'E:/360jiagubao_windows_64/jiagu/appkey/' + sys.argv[2]
print(key_path)
key_pwd = sys.argv[3]
alise = sys.argv[4]
alise_pwd = sys.argv[5]
#jiagu
cmd_jiagu = '-jiagu'
apkTarget = apkfile
print(apkTarget)
date = time.strftime('%Y%m%d',time.localtime(time.time()))
//apk加固后的输出目录
apkOutPutPath = 'E:/360jiagubao_windows_64/jiagu/output/'+sys.argv[6]+'/'+date+'/'
# 判断路径是否存在
# 存在 True
# 不存在 False
isExists=os.path.exists(apkOutPutPath)
if not isExists:
os.makedirs(apkOutPutPath)
else:
ds = list(os.walk(apkOutPutPath)) #获得所有文件夹的信息列表
dsr = ds[::-1] #反转该列表,从最底层的文件夹开始清算
for d in dsr: #遍历该列表
print(d) #打印出列表项,观察规律
if d[2] != []: #如果该路径下有文件
for x in d[2]: #先将文件清理干净
os.remove(os.path.join(d[0], x))
for d in dsr: #再次遍历该列表
if d[1] != []: #如果该路径下有子文件夹
for y in d[1]: #将子文件夹清理干净
os.rmdir(os.path.join(d[0], y))
#autosign
cmd_autosign = '-autosign'
#showsign
cmd_showsign = '-showsign'
auto_login_cmd = [java,cmd,jar,cmd_login,name,pwd]
auto_importsign_cmd = [java,cmd,jar,cmd_sign,key_path,key_pwd,alise,alise_pwd]
auto_show_sign_cmd = [java,cmd,jar,cmd_showsign]
auto_jiagu_sign_cmd = [java,cmd,jar,cmd_jiagu,apkTarget,apkOutPutPath,cmd_autosign,'-automulpkg']
#subprocess.call(cd_path)
subprocess.call(auto_login_cmd)
subprocess.call(auto_importsign_cmd)
subprocess.call(auto_show_sign_cmd)
subprocess.call(auto_jiagu_sign_cmd)
#查找到加固的apk文件
apkJiaguFile = file_name(apkOutPutPath,"jiagu_sign")
print(apkJiaguFile)
//复制到原来的目录下
shutil.copyfile(apkJiaguFile,apkTarget)
6,文件上传
使用python脚本上传Ftp
# coding=utf-8
from ftplib import FTP
import sys,getpass,os.path,getopt
import time
def file_name(root,ex):
root1=[]
for i in os.listdir(root): #os.listdir(root) 读取root目录下的文件和目录
root1=os.path.splitext('/'+root+'/'+i) #os.path.splitext()读取文件扩展名
if root1[1]:
if i.count(ex)>0:
return (root+'/'+i)
#sys.argv[1]工程目录,在工程目录下查找包含RC的apk文件
apkfile = file_name(sys.argv[1]+/app/build/outputs/apk/','RC');
host = ' '
username = ' '
password = ' '
remotepath = '/ '
f.connect(host,10000)
f.login(username,password)
print ("Welcome:",f.getwelcome())
buffersize = 1024
f.cwd(remotepath)
fd1 = open(apkfile,'rb')
f.storbinary('STOR %s' % os.path.basename(apkfile),fd1,buffersize)
fd1.close()
f.quit()
print ("ftp upload OK")