如何让grunt-tslint生成一个pmd文件以便在jenkins

时间:2015-10-22 19:36:23

标签: jenkins gruntjs pmd tslint

我设法使用grunt-tslint来分析我的打字稿项目。我有几个问题。

默认情况下,为每个输入TS文件创建一个输出文件。这会失败,因为所有输出文件的文件名都相同,并且由于文件已存在而保存第二个输出文件失败。 使用appendOutput可以避免此问题。这会将每个文件的分析输出附加到现有文件。使用此选项可生成一个文件,用于分析整个项目。

问题在于,如果您使用此post中提到的pmd格式化程序。如果分析了一个文件就可以了。创建一个pmd.xml文件并且该文件有效。如果创建了多个文件并且您使用了appendOutput选项,则会在同一个文件中获得多个带有多个根标记的xml文档,类似于:

<pmd>content</pmd>
<pmd>content</pmd>
<pmd>content</pmd>
<pmd>content</pmd>

(我无法粘贴实际文件内容,因为我无法从我的工作PC发布)。 当jenkins分析此文件时,它会失败,因为它不是有效的xml文档。

在我看来,这个问题有一些解决方案:

  1. 输出非pmd文件(可能是json)并创建一个新的grunt任务以将该json文件转换为一个有效的pmd任务
  2. 修复grunt-tslint,以便它可以输出具有不同名称的多个文件(从代码的角度看代码这不会太难)
  3. 创建一个可以修复破碎的xml的grunt任务(这可能是通过查找和替换一些正则表达式来完成的)
  4. 有没有人对此问题有任何经验或有任何其他解决方案?

3 个答案:

答案 0 :(得分:0)

我写了tslint pmd格式化程序。我现在回想起我们也面临着你所谈论的问题。我不太记得,但我认为我们最终使用的是一个自定义格式化程序版本,它不会将<pmd>..</pmd>标记附加到每个文件违规和一些单线程向导以最终包装整个输出。 希望这有帮助

我要做的是: 像这样更改pmd formatter(您可以将其创建为自己的格式化程序):

export class Formatter extends AbstractFormatter {
public format(failures: Lint.RuleFailure[]): string {
   # comment this out
   #let output = "<pmd version=\"tslint\">";
    #insert this instead
    let output ="";
     ...

    #and comment this out
    #output += "</pmd>";

然后在jenkins中创建一个shell命令步骤,例如:

echo '<pmd version="tslint">'`cat tslint.out`'</pmd>' > tslint.out

请注意我是从记忆中写的,但它应该有效。

答案 1 :(得分:0)

我按照上面链接中指定的相同指令操作。 简单的linux命令帮助了我,而不是修改pmd格式化程序。 假设jenkins_tslint_error目录包含包含tslint错误的pmd.xml文件。

在构建步骤中添加任务“执行shell脚本”为

grunt -f jenkins-tslint

cd jenkins_tslint_error

sed -i 's|| |g' pmd.xml

sed -i 's|| |g' pmd.xml

sed -i '1s/^//' pmd.xml

sed -i '$a ' pmd.xml

然后使用Post-build Actions捕获和使用PMD分析结果

答案 2 :(得分:0)

我也需要这个功能,所以我在其他地方做了它并创建了一个允许输出到自定义输出目录和扩展的fork。我的环境使用Checkstyle,但是使用jenkins我可以设置一个文件模式,它可以解析指定自定义输出目录中的所有xml文件(例如reports / checkstyle / ** / * .xml)。

叉子可以在这里找到:

我已经通过这样的行添加到我的packages.json中:

"devDependencies": {
   ..
   "grunt-tslint": "https://github.com/UXabre/grunt-tslint/tarball/master",
   ..
}

在我的grunt文件中,我现在可以指定:

tslint: {
    options: {
        outputFolder: 'reports/checkstyle/',
        ext: '.xml',
        formatter: 'checkstyle'
    },
    files: {
        src: "src/**/*.ts"
    }
}

我可能不是最漂亮的解决方案,因为它会将所有文件放在与插入的模式相同的文件夹结构中;但它至少对我有用。我会看看我是否可以将其正式化为PR,但就目前而言,你可以成为世界上第二个使用它的人!