Průběžná integrace/vstupní body
| Continuous integration |
|---|
| Infrastructure |
Máme standardizované nástroje a vstupní body pro úlohy CI napříč více než 1000 repozitáři Git, včetně jádra MediaWiki, rozšíření, PHP knihoven a dalších samostatných projektů. We have standardized tools and entry points that run in WMF CI across over 1000+ Git repositories including MediaWiki core, extensions, PHP libraries, and other standalone projects.
Dokumentaci o konfiguraci a nastavení těchto nástrojů naleznete níže.
| 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 | ? | |
List
Here is a list of the commands that will be executed by the various Jenkins jobs on a MediaWiki core patch. You can control which tests and linters run for a repository's continuous integration by changing how commands such as these are configured.
api-testing- for API testscomposer phpunit:unit- for PHPUnit tests and parser testscomposer test- for PHP lintersexec vendor/bin/phan- for Phan lintingnpm run-script test- for JavaScript linters, Jest tests, and JSDoc warningsselenium-test- for Selenium tests- Special:JavaScriptTest - for QUnit tests
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í.
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
- Použijte rozšíření BoilerPlate jako výchozí bod pro nové rozšíření MediaWiki.
- 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": "48.0.0",
"mediawiki/mediawiki-phan-config": "0.18.0",
"mediawiki/minus-x": "2.0.0",
"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": "10.5.58"
},
"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
task default: [:test]
desc 'Run all build/tests commands (CI entry point)'
task test: [: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
your call that fail
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