Imaginons que vous disposez d’une plate-forme d’intégration continue (idéalement Jenkins ou Hudson) pour vos projets PHP (si ce n’est pas le cas, je vous invite à lire les excellents billets de Pascal Martin : Intégration continue avec Jenkins : installation et configuration de base et Intégration continue d’un projet PHP avec Jenkins).

Imaginons que vous n’utilisez pas Ant comme outil d’automatisation (de build) mais plutôt Phing parce que vous maîtrisez cet outil.

Imaginons que vous souhaitez également vérifier la qualité de vos développement Javascript (Dans un projet PHP, vous avez sûrement un peu de Javascript, non ?) et que vous souhaitez disposer d’indicateur de suivi de la qualité dans Jenkins.

Il existe plusieurs outils pour vérifier la qualité de son code Javascript :

L’outil JSL n’a pas évolué depuis 2007. Il nécessite d’être installé en suivant l’une de ces procédures. Avantage, il existe une tâche Phing pour exécuter JSL. Inconvénient, il n’est pas possible de générer un fichier XML compréhensible par Jenkins.

Je n’ai pas regardé Google Closure Linter.

JSHint semble intéressant. Mais à nouveau, il ne semble pas y avoir de mécanisme simple permettant de l’intégrer à Jenkins.

Jslint ne permet pas, a priori, nativement de générer un fichier XML compréhensible par Jenkins.

Je me suis donc tourné vers jslint4java. Je me suis inspiré du travail de Stephen Rees (qui utilise Ant) pour implémenter l’exécution de Jslint avec phing.

Voici le résultat :

<<<<<<<<<!<<<<<!<<<<<!p!p!!p/-!!!!t/-!!!!t/-r-r--ap-----at-----at-o-o--ta----ra----rappt<<<t=g<<<<<<<<<<<<<<<<r=g<rFeCecoeieet=aa=e!!p/m!!f/!le!!!!edg=sd=eegirhrrnrnxxe=ty=t--hpk--of-oc----xee=ta=tcecteténcccr=(ta=--phd--ro-ah----elt=_on=hthymyaesllln=jen=n<pie<rdoccpe>=ccs=no>iitxeuuus=snt=acsfp>rccaf/eof>ebpoat=rk=aennnictddde=lt=mr'uarecifaniFxrromse=eel=mfraaoleeet=iip=eéinrdéthlicliéoeims=ae=eimvmnui>=noo==elcaiete<lhceccwfratf=tl==lteeetdnnn=tnu="rtmrepspe>hhusenhi=eaf="ee=r=d=aaa=)r=jni=uaeasapited:drl=Fi=_=m"s"'l"mmm=à=sl'ov"nlrtterreir=ue=ilc=c"ptjuejeee=Tn=leena$iattgoroph"===lih=r$oeJsnss====aco=ix=l{fsmde>epsnpetj$""=esi=e{rmsl_"""=rrm=nri"utit=ireerta--{t$=ste=ataplipffppp=gé=tesdeece"rnlradrmpvbrar{=eer=tei_inaiiuuu=eej="pti=mhf=setneme:arelut=t=emrfnttclbbb=trs=>eer"pisi"eyaet/oplee=Td/=Fpeit4thelll=:_=rn$_eel$tc=ljt/-wo_"m=eet=i_l4jeisiii=af=tpa{dre{o"ysdcjsrjp=xsm=lfcejare"ccc=vui=oamtibnirnasldeoaets_=tp=eio_avnr>///=él=iseertaanetléiedrr}f=f/=slnavassjjj=rpe=r"m}esmsfelsndexi=Tia=eetla"esss=irs=ep"meetin_tdé.$m>l=acl=t_eltJ/=fé=r_p"adujp4éfg{-le=rhl=Tan_vQj=ia=defosl=sajfiojp$_=gi_=elajacuq=cl=etirual"d"rainosr{a=eej=xlnsloeu=aa=ularb_jevniglebl=trs=t_t"unre=tb=sreisdsfJairlidul=:s.="jety.-r=il=tn_rlpi_tiSrenei_=t=slv=ejmy=oe=oPaeearfelLl.tflj=Jx=>}aa"nesi*=n=crlr}imeilec4ds=St="l/at"n.=u=kolcpa"lp=nesoj$d}==lucn/.j=sn=ap_oam>e_"tsma,i"=à=aiehtl>js=y=gejnt=sf$v/vdr==ps=ees"=np=erstt""i{:vapao}=t=pt"mls"=ta=t}eealtar/}c/=r=ee/i'=at=dy"nrbee$rijul=a=ntnef=xt=u=/ans_m{iasmo=i=ddm/ni=ee=">nsfapaableg=t==epvsc=r=ftteil_lblins=e="s/eeh=Jn=ietllfllent/=r=t$rmi=Ss=cmle_i_est,j==rf{sbe=e=hparnjljs4js==uip/lrt=i_easesdjQl=echjesedlfm_}daaui"hisriiieda<unven>inldmrsd"al/sart$egieit"t=nlen/y.{r.nsne>ejts_calsxasptimsajhveombr4fmpd_rlsoiulsJojiioefga}>gcr"fSjacfrsie"aocievhialtv/tnelàcaiéife=a>et/et/esris"ruebnt.jrec_irxrarnsshcatomaalirbdeweimiJeelas}tenSraendee}tsts'/r/4àe$ej/ajJF{lxsealaaSiaeélcvlvnllcihe_aaàelcunocj-ls_ott>s2ytejni4J..srtstojSt0eaT}enaLx.riexvit0txtan".ete-tjr"da>dovr'ce"esrx/résivcrdeucert/=rim"ioatdnirenu=/e"r"tersuoeu"rces/cli.html

Vous devez ensuite appeler cette tâche dans votre tâche principale de build. Quelque chose comme ça :

<t<<app/rhhtgiiaennrtgggcc<en<<<<<<<aa!<taeppppppll-p>mchhhhhhll-hehiiiiiii=onnnnnntton"ggggggaangbmccccccrrcusaaaaaagglaiglllllleeall=llllllttnld"==c"ttttttt""et>âaaaaaappacrrrrrrhhlrhggggggppageeeeeee-uettttttcnvtb======bié=u"""""""tr"ipppppp"ijlhdhhhhfsdpeppppil"-pmcl-cidedpocanon"dcsttcd/"""i""">//o>>nsyntaxiquedeJS

Vous pourrez ensuite configurer dans Jenkins l’appel du fichier de log (build/log/jslint.xml) : Jenkins - Configuration JSlint

Après l’exécution du build, vous devriez avoir dans le menu Violations, quelque chose comme ça : jenkins - violation JSLint