Jenkins配置自动构建,自动加固,自动上传

在Android自动化构建中,可以使用Jenkins自动构建版本发布。

一,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,配置自定义的项目路径

Jenkins标记格式器设置为Safe HTML_加固

2,配置Git地址(也可以是其他的版本管理)

Jenkins标记格式器设置为Safe HTML_java_02

3,配置文件删除时间限制

Jenkins标记格式器设置为Safe HTML_Android_03

5,配置apk构建

Jenkins标记格式器设置为Safe HTML_jar_04

4,构建完成后执行加固和上传的python

Jenkins标记格式器设置为Safe HTML_jar_05

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")
三,Jenkins全局配置
1,全局工具设置

Jenkins标记格式器设置为Safe HTML_Jenkins_06

Jenkins标记格式器设置为Safe HTML_jar_07

Jenkins标记格式器设置为Safe HTML_jar_08

2,系统设置环境变量

Jenkins标记格式器设置为Safe HTML_Android_09