前言

最近在使用jenkins研究集成测试方面,并且使用reportNg来生成测试的报告,发现每次运行后的测试报告都会覆盖掉我们之前的测试报告,这个不是我们想要的结果,我们需要的应该是根据执行的日期生成一个目录,接着报告文件都在对应的时间目录下面。所以就需要引入Dynamic Parameter 这个插件了。

正文

Dynamic Parameter 可以动态的生成我们想要的一些参数,使用的语言是groovy,跟java有部分的类似,只是说groovy是个动态类型。首先我们需要在jenkins上安装对应的插件 ,
进入系统管理->插件管理->可选插件中找到 Dynamic Parameter Plug-in 进行安装,安装完后,我们在配置项目中勾选参数化构建过程后,就可以新建一个 Dynamic Parameter,

这里写图片描述,取名为mtime

这里我需要返回一个当前的时间,并且还需要根据时间生成一个对应的时间目录,到时候这个目录就是用来存放我们转移过来的测试报告的地方了。
具体的代码

def time = new Date().format('yyyy-MM-dd_HH_mm_ss')
filepath = "/opt/apache-tomcat-7.0.64/webapps/report/"+time 
def file = new File(filepath);
file.mkdir()
return time

现在我们已经有了一个时间了,那要如何对文件进行转移呢,这里使用的是python,我们在Post steps中新增一个步骤,Execute shell,运行一个shell命令。这里的话直接使用
这里写图片描述

pythonScript的具体代码如下:

# -*- coding: utf-8 -*-
#!/usr/bin/env python

import sys,os

def get_current_path():
    path = sys.path[0]
    #判断为脚本文件还是py2exe编译后的文件,如果是脚本文件,则返回的是脚本的目录,如果是py2exe编译后的文件,则返回的是编译后的文件路径
    if os.path.isdir(path):
       return path+"/"
    elif os.path.isfile(path):
       return os.path.dirname(path)+"/"   
    pass


def copyFiles(sourceDir,  targetDir):

    print os.listdir(sourceDir)
    for file in os.listdir(sourceDir): 
        sourceFile = os.path.join(sourceDir,  file) 
        targetFile = os.path.join(targetDir,  file) 
        if os.path.isfile(sourceFile): 
            if not os.path.exists(targetDir):  
                os.makedirs(targetDir)  
            if not os.path.exists(targetFile) or(os.path.exists(targetFile) and (os.path.getsize(targetFile) != os.path.getsize(sourceFile))):  
                    open(targetFile, "wb").write(open(sourceFile, "rb").read()) 
        if os.path.isdir(sourceFile): 
            First_Directory = False 
            copyFiles(sourceFile, targetFile)


def main(argv):
    workspace = get_current_path()
    if len(argv) > 1 and argv[1] != None :
        target_path = getlastdir(workspace,5)+argv[1]
        print target_path
        copyFiles(workspace+"/target/surefire-reports/html",target_path)


def getlastdir(filepath,num):
    for i in range(num):
        filepath = os.path.dirname(filepath)

    filepath += '/report/'
    return filepath


if __name__ == '__main__':
    main(sys.argv)

代码其实不难,就是获取到输入的命令行的参数,接着构造出我们存放报告的目录,接着进行文件的copy。但是这里的实现有一点很糟糕的就是把目录都写死了,按照原先的想法的话是应该在外部传参的时候将文件目录传进来,这样子就可以避免了后续如果修改路径的话,pythonScript也要进行同样的修改,但是目前还没有好的解决方法。

最后再来配置下我们发送的邮件内容了:
这里写图片描述
收到的实际邮件效果如图:

这里写图片描述
这样子我们就可以直接点击对应的路径就看到了测试报告的结果了。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐