Automatické testování coding style pro změněné soubory Mozektevidi.net - Píše Olda Šálek.

Automatické testování coding style pro změněné soubory

Máte rozjetý projekt, který nemá ve všech souborech opravený coding style a oprava všech chyb by trvala moc dlouho? Ani v tomto případně neodkládejte automatickou kontrolu coding standards. Každý nový pull request zlepší váš kód. Jak nastavit kontrolu kódu jen pro změněné soubory? PHP + Travis + git + PHP CodeSniffer

Soubor .travis.yml

before_script:
  - if [ ! -d "vendor/php-parallel-lint" ]; then composer create-project --prefer-dist --no-interaction jakub-onderka/php-parallel-lint vendor/php-parallel-lint; fi
  - php vendor/php-parallel-lint/parallel-lint.php -e php --exclude vendor .

První řádek mi nainstaluje paraller lint, dalším řádkem se pak spustí rychlá kontrola, zda v souboru není parse error.

script:
  - composer global require "squizlabs/php_codesniffer=*"
  - touch app/cache/cs.sh
  - git remote add upstream git@github.com:mzk/foo.git
  - php app/run-cs.php
  - chmod +x app/cache/cs.sh
  - app/cache/cs.sh
  1. Nejprve se nainstaluje php code sniffer. XML soubor s pravidli našeho projektuje v git repozitáři.
  2. Vytvořím prázdný soubor cs.sh (kvůli právům)
  3. do repozitáře přidám remote upstream. Je to protože travis si naklonuje pouze branch, ve které je pull request. (git fetch origin +refs/pull/272/merge:) A my potřebuje větve master + stable, abychom věděli jaké soubory jsou změněné.
  4. spustím soubor run-cs.php, který obsahuje toto:
run-cs.php
<?php

exec('git diff --name-only master', $changedAllFilesMaster); //změněné soubory oproti větvi master
exec('git diff --name-only upstream/stable', $changedAllFilesStable); //změněné soubory oproti větvi stable

//less changed files => probable pull request master / stable
if (count($changedAllFilesMaster) < count($changedAllFilesStable)) {
    $changedAllFiles = $changedAllFilesMaster;
} else {
    $changedAllFiles = $changedAllFilesStable;
}

print_r($changedAllFiles);

//ne všechny soubory chci kontrolovat. Ty které mají v commit message `--no-check` se nekontrolují + ty co jsou v souboru `.csignore`
$filteredFiles = [];
foreach ($changedAllFiles as $file) {
    $file = trim($file);
    exec('git log --oneline -n 1 -- ' . $file, $output);
    if (isset($output[0])) {
        $output = $output[0];
    } else {
        $output = ''; //new file = output empty array.
    }

    $fileNames = [];
    if (file_exists(__DIR__ . '/.csignore')) {
        $fileNames = explode("\n", file_get_contents(__DIR__ . '/.csignore'));
    }

    if (!strpos($output, '--no-check') && strpos($file, '.php') && file_exists($file)) {
        $filteredFiles[] = $file;
    }

    $filteredFiles = array_diff($filteredFiles, $fileNames);
}

print_r($filteredFiles);
$str = '#!/usr/bin/env bash' . "\n";
if ($filteredFiles) {
    $str .= '~/.composer/vendor/bin/phpcs --standard=ruleset.xml --extensions=php --warning-severity=0 --encoding=utf-8 --tab-width=4 -sp';
    foreach ($filteredFiles as $file) {
        $str .= ' ' . $file;
    }
}

file_put_contents(__DIR__ . '/../app/cache/cs.sh', $str);
chmod(__DIR__ . '/../app/cache/cs.sh', 777);
  1. Nastavím práva na spuštění a vytvořený soubor spustím.

Zbytečné psát, ale přecijen.

Pokud ještě nemáte napsané testy pro coding style, určitě si je napište. Ušetříte si zbytečné komentování pull requestů, kde bude plno zbytečných zpráv typu cs, fix cs, remove whitespace, add new line... Tyto testy se dají pouštět i na localhostu ještě před posláním pull requestu.

Nám se toto v praxi hodně osvědčilo. Pull requesty, které opravovali coding style měli i 5 tisíc změněných řádků. A než na to někdo kouknul a dal merge, tak byly konflikty. Navíc se to nikomu nechce opravovat ani dělat review.

Tímto prostě musí, jakmile soubor změní. A to je fajn "buzerace" :).


autor článku Oldřich Šálek | datum publikování 29.říjen.2016 21:44 | články ze světa počítačů IT |

Kometáře


Komentáře a diskuze ke článku tady
diskuze ke článku