Contexto
Em nossa equipe, queríamos que os avisos e erros do Google Closure Compiler em execução em nosso aplicativo JavaScript fossem visualizados e rastreados pela construção do CI.
Solução
Felizmente, existe o Plugin de Avisos para Jenkins que é exatamente para esse propósito. Mas falta um analisador capaz de ler os resultados desse compilador. Ainda assim, ele também vem com uma extensão de script, que permite definir seu próprio formato.
Seguindo a descrição para configurar seu próprio analisador nas configurações do sistema do Jenkins, ele se resume a dois campos importantes: A expressão regular e o script Groovy para fornecer o descritor de aviso.
Configuração
Expressão regular
^(.*):(d+): (.+) - ((.*n)+?)[ ]*^n$
Esta expressão pega tudo, desde a primeira linha de uma entrada até (incluindo) a última linha com o ^ que aponta para o erro.
Script de mapeamento
import hudson.plugins.warnings.parser.Warning
String fileName = matcher.group(1)
String lineNumber = matcher.group(2)
String category = matcher.group(3)
String type = "Dynamic Parser"
String message = matcher.group(4)
return new Warning(fileName, Integer.parseInt(lineNumber), type, category, message)
O script é praticamente o mesmo que o script de exemplo, pois os grupos da expressão regular correspondem à sequência esperada.
Limitações
- A primeira linha em uma entrada nem sempre especifica uma mensagem ‘abstrata’, muitas vezes partes do código real são incluídas. Portanto, não pode ser usado como o ‘tipo’.
- Embora algumas entradas tenham várias linhas relatadas do compilador, qualquer exibição no Jenkins remove os caracteres de nova linha e apresenta todo o texto em uma linha. (Substituir ” n” por uma tag HTML br não funciona)
- Como resultado disso, a linha com ^ não faz parte da mensagem para evitar confusão. Tentei calcular o deslocamento e especificar a posição da coluna no aviso, mas parece que essa propriedade não é considerada para realçar o código-fonte.
Notas laterais
- Uma vez que estamos executando uma compilação baseada em Grunt, não vemos nenhum erro, pois eles já fazem o Grunt falhar, causando falha em toda a compilação. Usamos isso para rastrear apenas os avisos.
- Nosso build salva o resultado do compilador em um arquivo de texto que é analisado pelo plugin. Embora não tenha sido testado, o plugin também deve ser capaz de analisar a saída do console com aquela expressão.