Jenkins任务:创建“发布apk”任务-apk_release
综述:本文将介绍如何在Jenkins上创建和运行“发布apk”的任务:“新建Jenkins任务”、“选择构建一个Freesyle项目,输入任务名”、“配置任务”、“运行Jenkins任务”、“查看运行日志”。
1、新建Jenkins任务
2、选择构建一个Freesyle 项目,输入任务名
3、配置项目
(1)源码管理
选择Subversion,Repository URL填写$CURRENT_ReleaseUrlSVNPos,Credentials选择登录svn的账号密码
Check-out Strategy选择Use 'svn update' as much as posible,with 'svn revert' before update
(2)构建触发器
不用填写
(3)构建环境
不用填写
(4)构建
选择Execute Windows batch command
批处理命令填写
call D:\BXERP\trunk\src\jenkins\apk_release\apk_release_generateApk.py
exit 0
apk_release_generateApk.py主要实现的逻辑:修改build.gradle文件的版本好、名称、服务器场(有多个场)、替换配置文件、修改登录页面login.xml显示的版本号、修改logo图片
代码如下:
apk_release_generateApk.py
# coding=utf-8
import os
# 引用自定义的模块
import sys
sys.path.append('D:/BXERP/trunk/src/jenkins/Common') #引用的自定义模块不与该python文件在同一目录时,需要指定路径
from bxUtility import printInfo
from bxUtility import cover
from bxUtility import replaceLine
from bxUtility import replace
# 需要从jenkins的环境变量读取的参数:现使用场、版本号
CURRENT_Env = os.getenv("CURRENT_Env")
CURRENT_ReleaseNbrVersionNO = os.getenv("CURRENT_ReleaseNbrVersionNO") # 2.0.0
CURRENT_ReleasePosNewVersionCode = os.getenv("CURRENT_ReleasePosNewVersionCode")
# 要修改的配置文件
FILE_BuildGradle_Module = 'D:/Jenkins/workspace/apk_release/build.gradle'
# 原先使用的配置文件
ORIGINAL_SigningProperties = 'D:/Jenkins/workspace/apk_release/signing.properties'
# 对应场现使用的配置文件
CURRENT_SigningProperties = 'D:/NbrConfigFile/signing.properties'
# 不同的场,使用不同的app logo
FILE_AndroidManifest='D:/Jenkins/workspace/apk_release/app/src/main/AndroidManifest.xml'
# 不同的场,使用不同的app logo
FILE_AndroidManifest='D:/Jenkins/workspace/apk_release/app/src/main/AndroidManifest.xml'
# longin1.xml
FILE_LoginVersion='D:/Jenkins/workspace/apk_release/app/src/main/res/layout/login1.xml'
try:
# 修改配置文件build.gradle
ORIGINAL_VersionCodeLine = 'versionCode = 1'
ORIGINAL_VersionNameLine = 'versionName = "1.0.0"'
ORIGINAL_EnvLine = 'env = "SITaa"'
CURRENT_VersionCodeLine = ' versionCode = ' + CURRENT_ReleasePosNewVersionCode + '\n'
CURRENT_VersionNameLine = ' versionName ="' + CURRENT_ReleaseNbrVersionNO + '"' + '\n'
CURRENT_EnvLine = ' env = "' + CURRENT_Env + '"' + '\n'
replaceLine(FILE_BuildGradle_Module, ORIGINAL_VersionCodeLine, CURRENT_VersionCodeLine, "utf-8", 1)
replaceLine(FILE_BuildGradle_Module, ORIGINAL_VersionNameLine, CURRENT_VersionNameLine, "utf-8", 1)
replaceLine(FILE_BuildGradle_Module, ORIGINAL_EnvLine, CURRENT_EnvLine, "utf-8", 1)
printInfo('替换' + CURRENT_Env + '场配置文件' + FILE_BuildGradle_Module + '完毕', 0)
# 替换配置文件(整个文件替换)
print ('正在替换' + CURRENT_Env + '场配置文件...');
cover(CURRENT_SigningProperties, ORIGINAL_SigningProperties)
printInfo('替换' + CURRENT_Env + '场配置文件完毕', 0)
# 替换login1.xml中的版本号
ORIGINAL_LoginVersionLine = 'android:text="v1.0.0"'
CURRENT_LoginVersionLine = 'android:text="v' + CURRENT_ReleaseNbrVersionNO + '"' + '\n'
replaceLine(FILE_LoginVersion, ORIGINAL_LoginVersionLine, CURRENT_LoginVersionLine, "utf-8", 1)
printInfo('替换' + CURRENT_Env + '场配置文件' + FILE_LoginVersion + '完毕', 0)
# 不同的场,使用不同的app logo
print ('正在替换' + CURRENT_Env + '场的logo文件...')
ORIGINAL_Line_Icon = '@drawable/local'
CURRENT_Line_Icon = ''
while True:
if (CURRENT_Env == 'DEV'):
CURRENT_Line_Icon = '@drawable/dev'
elif (CURRENT_Env == 'SIT'):
CURRENT_Line_Icon = '@drawable/sit'
elif (CURRENT_Env == 'UAT'):
CURRENT_Line_Icon = '@drawable/uat'
elif (CURRENT_Env == 'PROD'):
CURRENT_Line_Icon = '@drawable/bxb_logo_new'
else: # local
break
replace(FILE_AndroidManifest, ORIGINAL_Line_Icon, CURRENT_Line_Icon, "utf-8", 2)
break
printInfo('替换' + CURRENT_Env + '场logo文件完毕', 0)
except Exception as e:
printInfo('出现异常:' + str(e), 1)
else:
os._exit(0)
(调用了工具脚本bxUtility.py,可以查看“工具脚本bxUtility.py”文章的介绍)
增加构建步骤:Invoke Gradle script
选择Use Gradle Wrapper,Task填写
clean
assembleRelease
(assembleRelease 会打出release包,生成apk文件)
再增加构建步骤:Execute Windows batch command
批处理命令填写
call D:\BXERP\trunk\src\jenkins\apk_release\apk_release_moveApk.py
exit 0
apk_release_moveApk.py主要完成的逻辑:将Jenkins生成的apk文件备份,复制到指定目录
代码如下:
apk_release_moveApk.py
# coding=utf-8
import shutil
import os
import time
# 引用自定义的模块
import sys
sys.path.append('D:/BXERP/trunk/src/jenkins/Common') #引用的自定义模块不与该python文件在同一目录时,需要指定路径
from bxUtility import printInfo
# 需要从jenkins的环境变量读取的参数:文件夹路径、现使用场
CURRENT_ReleaseNO = os.getenv("CURRENT_ReleaseNO") #示例:CURRENT_ReleaseNO=00004_v1_0_r691_r691
CURRENT_Env = os.getenv("CURRENT_Env")
CURRENT_ReleaseNbrVersionNO = os.getenv("CURRENT_ReleaseNbrVersionNO")
# 此次release放置文件的总路径
CURRENT_ReleasePath = 'D:/Release/' + CURRENT_ReleaseNO
# apk放置的文件夹路径
CURRENT_ApkBackupPath = CURRENT_ReleasePath + '/backup'
#参与apk的命名
CURRENT_Time = time.strftime('%Y%m%d', time.localtime(time.time()))
def apkBackup():
"""
备份apk
"""
print ('正在复制移动apk文件至指定路径...');
shutil.copy('D:/Jenkins/workspace/apk_release/app/build/outputs/apk/publish/release/bxb_' + CURRENT_Env + '_' + CURRENT_ReleaseNbrVersionNO + '.apk', CURRENT_ApkBackupPath + '/bxb_' + CURRENT_Env.lower() + '_' + CURRENT_ReleaseNO + '_' + CURRENT_Time + '.apk')
printInfo('备份apk成功!', 0)
try:
# 备份apk
if os.path.exists(CURRENT_ReleasePath):
Files = os.listdir(CURRENT_ApkBackupPath)
for i in range(len(Files)):
Files[i] = os.path.splitext(Files[i])[1]
if '.apk' in Files:
printInfo('apk文件已存在,无需再次备份。', 0)
else:
printInfo('在进行apk release之前已经进行了nbr的release,若不是请排查错误', 0)
apkBackup();
else:
os.makedirs(CURRENT_ApkBackupPath)
apkBackup();
except Exception as e:
printInfo('出现异常:' + str(e), 1)
else:
os._exit(0)
(5)保存,在主页面可以看到刚创建好的任务
4、运行Jenkins任务
点击Build Now按钮,即可开始运行任务
5、查看日志
在左下角可以看到运行中的任务,点击“控制台输出”查看日志