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、查看日志

在左下角可以看到运行中的任务,点击“控制台输出”查看日志

posted @ 2022-08-29 20:03  Boxin-kim  阅读(261)  评论(0)    收藏  举报
Web Analytics
Guang Zhou Boxin