Průběžná integrace/vstupní body
Entry points
Standardizované testy pro projekty.
Jazyk | Příkazový řádek | Linting | Styl kódu | Statická analýza | Testy jednotek | Dokumentace |
---|---|---|---|---|---|---|
PHP | composer | php-parallel-lint
|
PHP CodeSniffer s mediawiki-tools-codesniffer | Phan s mediawiki-phan-config | PHPUnit | Doxygen |
JavaScript | npm & grunt | grunt-eslint s eslint-config-wikimedia | grunt-eslint s eslint-config-wikimedia | QUnit | JSDoc | |
JSON | N/A | json-schema | N/A | N/A | ||
i18n | grunt-banana-checker | N/A | N/A | N/A | Dokumentace lokalizačních zpráv | |
CSS/LESS | grunt-stylelint s stylelint-config-wikimedia | N/A | N/A | N/A | ||
Java | maven wrapper (maven) | ? | ? | ? | ? | ? |
Python | tox | flake8 | unittest
pytest[1] |
sphinx? | ||
Ruby | bundler | rubocop | ? | rake test | ? |
Dokumentaci o konfiguraci a nastavení těchto nástrojů naleznete níže.
JavaScript
Testování JavaScriptu
Jako vstupní bod používáme npm test
.
Pokud váš projekt obsahuje nějaké soubory JavaScriptu, měl by mít alespoň soubor package.json
, který definuje skript test
, a související soubor package-lock.json
, aby byla zajištěna konzistence běhů CI a upgradů zabezpečení.
U rozšíření a vzhledů MediaWiki by neměl skript npm test
spouštět projektové testy, pouze linters.
Cokoli jiného než linters (např. testy jednotky/integrace) se spouští přes normální kanály MediaWiki. Pokud chcete samostatný běžec, měli byste to dát do jiného skriptu.
Ve svém projektu budete potřebovat konfigurační soubor .eslintrc.json
(viz P59ru4ka:Kódovací konvence/JavaScript#Linting).
Podívejte se na jeden z projektů uvedených v příklad sekce níže, kde najdete příklad těchto souborů.
npm
s "node: No such file or directory" (uzel: žádný takový soubor nebo adresář), možná budete muset nainstalovat balíček "nodejs-legacy
".
Spouštěč úlohy Grunt
Pokud má váš projekt složité procesy sestavování nebo se jedná o rozšíření či vzhled, který bude těžit z kontroly i18n a lintingu souborů JSON, je konvencí používat Grunt jako spouštěče úloh.
Váš projekt má stále soubor package.json
, který je závislý na grunt
a nastavuje "test": "grunt test"
.
Soubor Gruntfile.js
zase implementuje grunt test
, což může spouštět širokou škálu nástrojů a testů:
eslint
, který kontroluje soubory JS i JSON.stylelint
, který kontroluje soubory CSS i LESS.banana-checker
, který kontroluje zprávy v souborech MediaWiki i18n.
Nastavení konfigurace pro tyto nástroje můžete zadat v Gruntfile.js
.
Měl by však obsahovat malou nebo žádnou konfiguraci pro nástroje, které mohou běžet mimo grunt
, aby fungovaly stejně, když jsou spuštěny samostatně nebo z pluginu textového editoru.
Vždy používejte nativní konfigurační soubory, kde je to možné, včetně výše uvedeného .eslintrc.json
.
Dokumentace JavaScriptu
Jako vstupní bod použijte npm run doc
.
Konvencí je používat JSDoc .
Skriptové háčky predoc
a postdoc
v package.json
lze použít ke spuštění jakýchkoli dalších skriptů (např. sestavení souborů pro zahrnutí předem nebo zkopírování dalších souborů pro pozdější publikování).
Příklady
Pokročilé nastavení pomocí Grunt
package.json
{ "private":true, "scripts":{ "test":"grunt test" }, "devDependencies":{ "eslint-config-wikimedia":"0.15.0", "grunt":"1.0.4", "grunt-banana-checker":"0.8.1", "grunt-eslint":"22.0.0", "grunt-stylelint":"0.12.0", "stylelint-config-wikimedia":"0.7.0" } }
Gruntfile.js
/* eslint-env node, es6 */ module.exports=function(grunt){ grunt.loadNpmTasks('grunt-banana-checker'); grunt.loadNpmTasks('grunt-eslint'); grunt.loadNpmTasks('grunt-stylelint'); grunt.initConfig({ eslint:{ options:{ extensions:['.js','.json'], cache:true }, all:[ '**/*.{js,json}', '!{vendor,node_modules}/**' ] }, stylelint:{ all:[ '**/*.{css,less}', '!{vendor,node_modules}/**' ] }, banana:{ all:'i18n/' } }); grunt.registerTask('test',['eslint','stylelint','banana']); grunt.registerTask('default','test'); };
Příklady projektů
- Extension:BoilerPlate má
Gruntfile.js
, na kterém běží jshint, jscs a banana-checker (pro soubory JSON MediaWikii18n
). - jquery-client: package.json (jshint, jscs, karma; není potřeba Grunt)
- CSSJanus: package.json / Gruntfile.js (jshint, jscs, vlastní test)
- TemplateData: package.json / Gruntfile.js (jshint, jscs, banana-checker)
Další čtení
- [formát https://docs.npmjs.com/files/package.json package.json] na docs.npmjs.org
- [životní cyklus "scriptů" balíčku https://docs.npmjs.com/misc/scripts] na docs.npmjs.org
PHP
- K vytvoření nové knihovny PHP použijte mediawiki-tools-cookiecutter-library.
Testování PHP
Jako vstupní bod používáme composer test
.
Pokud váš projekt obsahuje soubory PHP, měl by uvést potřebné balíčky testovacího rámce v composer.json
pod require-dev
a uvést příkazy, které mají být spuštěny, ve vlastnosti scripts.test
:
{ "require-dev":{ "mediawiki/mediawiki-codesniffer":"44.0.0", "mediawiki/mediawiki-phan-config":"0.14.0", "mediawiki/minus-x":"1.1.3", "ockcyp/covers-validator":"1.6.0", "php-parallel-lint/php-console-highlighter":"1.0.0", "php-parallel-lint/php-parallel-lint":"1.4.0", "phpunit/phpunit":"9.6.16" }, "scripts":{ "test":[ "parallel-lint . --exclude vendor --exclude node_modules", "php -d 'extension=pcov.so' vendor/bin/phpunit", "covers-validator", "phpcs -sp", "phan --allow-polyfill-parser --long-progress-bar", "minus-x check ." ], "fix":[ "minus-x fix .", "phpcbf" ] }, "config":{ "allow-plugins":{ "dealerdirect/phpcodesniffer-composer-installer":true } } }
Dobrý příklad naleznete v článku composer.json z projektu cdb.
Všimněte si, že Rozšíření MediaWiki nejsou samostatné projekty a nemohou spouštět vlastní testovací sadu PHPUnit od skladatele.
Tato úložiště mají samostatnou úlohu mediawiki-extensions
.
PHPCS a PHP lint stále běží přes composer.json
a composer test
:
{ "require-dev":{ "mediawiki/mediawiki-codesniffer":"44.0.0", "mediawiki/mediawiki-phan-config":"0.14.0", "mediawiki/minus-x":"1.1.3", "php-parallel-lint/php-console-highlighter":"1.0.0", "php-parallel-lint/php-parallel-lint":"1.4.0" }, "scripts":{ "test":[ "parallel-lint . --exclude vendor --exclude node_modules", "phpcs -sp --cache", "minus-x check ." ], "fix":[ "minus-x fix .", "phpcbf" ], "phan":"phan -d . --long-progress-bar" }, "config":{ "allow-plugins":{ "dealerdirect/phpcodesniffer-composer-installer":true } } }
Dobrý příklad naleznete v článku composer.json z rozšíření AbuseFilter MediaWiki.
Dokumentace PHP
Viz: Doxygen .
Pomocí programu doxygen vygenerujte soubor Doxyfile
v kořenovém adresáři projektu.
Testování Pythonu
Viz Nepřetržitá integrace/Výukové programy/Otestujte svého pythona .
Ruby
Rake
Pomocí Rake definujte své příkazy, budou prováděny prostřednictvím Bundleru.
Příklad Rakefile
:
require'bundler/setup' require'rubocop/rake_task' RuboCop::RakeTask.new(:rubocop)do|task| # pokud použijete mediawiki-vagrant, rubocop bude ve výchozím nastavení používat .rubocop.yml # další řádek jasně uvádí, že chcete z adresáře .rubocop.yml # kde se provede 'bundle exec rake' task.options=['-c','.rubocop.yml'] end require'mediawiki_selenium/rake_task' MediawikiSelenium::RakeTask.new taskdefault:[:test] desc'Run all build/tests commands (CI entry point)' tasktest:[:rubocop]
Výše uvedený kód vytvoří následující cíle Rake.
$ bundle exec rake -T rake rubocop # Spusťte RuboCop rake rubocop:auto_correct # Automatická oprava přestupků RuboCop rake selenium # Spusťte funkce Cucumber rake test # Spustit všechny příkazy sestavení/testy (vstupní bod CI)
Jenkinsova úloha rake-jessie
vyvolá cíl test
spuštěním bundle exec rake test
.
Odkaz: phab:T104024
ladicí tip ruby
Můžete použít gem pry
k přerušení chyby a zobrazení konzole v kontextu selhání.
Ke svému Gemfile přidejte gem 'pry'
a poté prolomte:
require'pry' binding.pry yourcallthatfail
Poté budete v konzoli před rozbitím, které vám umožní prohlédnout si prostředí (1 $). Podrobnosti viz https://github.com/pry/pry.
ci.yml
Máme sadu úloh Jenkins, které běží denně a provádějí testy Ruby + Selenium .
Úlohy se jmenují selenium*
.
Každé úložiště má v Jenkins definováno pouze jednu úlohu.
Jedná se o více konfigurační úlohu, která vytváří jednu nebo více podřízených úloh na základě konfigurace v každém úložišti: tests/browser/ci.yml
.
Hlavní úloha pak vytvoří podřízené úlohy na základě jejího obsahu.
Příklad jednoduchého ci.yml
je v mediawiki/core
.
BROWSER: -firefox MEDIAWIKI_ENVIRONMENT: -beta PLATFORM: -Linux
Jak vidíte, existují tři proměnné, BROWSER
, MEDIAWIKI_ENVIRONMENT
a PLATFORM
.
BROWSER
a PLATFORM
může být jakákoli platná [kombinace https://saucelabs.com/platforms/ Sauce Labs prohlížeč/OS/verze].
MEDIAWIKI_ENVIRONMENT
může mít hodnoty beta
, mediawiki
a test
nebo jakékoli jiné prostředí nakonfigurované v environments.yml
.
Například:
BROWSER: -chrome -firefox -internet_explorer 9.0 -safari MEDIAWIKI_ENVIRONMENT: -beta -mediawiki -test PLATFORM: -Linux -OS X 10.9 -Windows 8.1
Příklad komplikované ci.yml
je v mediawiki/extensions/MultimediaViewer
.
Další informace viz Jenkins Yaml Axis Plugin.
Odkaz: phab:T128190