Průběžná integrace/vstupní body

This page is a translated version of the page Continuous integration/Entry points and the translation is 100% complete.

Pro testování našeho kódu jsme standardizovali následující nástroje:

Jazyk Příkazový řádek Linting Styl kódu Statická analýza Testy jednotek Dokumentace
PHP composer php-parallel-lint

php -l

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ů.

Pokud na starších linuxových boxech selžou příkazy 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

Použijte rozšíření BoilerPlate jako výchozí bod pro nové rozšíření MediaWiki.

Pokročilé nastavení pomocí Grunt

package.json
{
	"private": true,
	"scripts": {
		"test": "grunt test",
		"doc": "jsduck"
	},
	"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ů

Další čtení

PHP

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": "31.0.0",
		"mediawiki/minus-x": "1.1.0",
		"ockcyp/covers-validator": "1.2.0",
		"php-parallel-lint/php-console-highlighter": "0.5.0",
		"php-parallel-lint/php-parallel-lint": "1.2.0",
		"phpunit/phpunit": "^8.5"
	},
	"scripts": {
		"test": [
			"parallel-lint . --exclude vendor --exclude node_modules",
			"minus-x check .",
			"phpunit",
			"covers-validator",
			"phpcs -p -s"
		],
		"cover": "phpunit --coverage-html coverage",
		"fix": [
			"minus-x fix .",
			"phpcbf"
		]
	}
}

Více vám řekne composer.json projektu cdb jako dobrý příklad.

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": "31.0.0",
		"mediawiki/minus-x": "1.1.0",
		"php-parallel-lint/php-console-highlighter": "0.5.0",
		"php-parallel-lint/php-parallel-lint": "1.2.0"
	},
	"scripts": {
		"test": [
			"parallel-lint . --exclude vendor --exclude node_modules",
			"minus-x check .",
			"phpcs -p -s"
		],
		"fix": [
			"minus-x fix .",
			"phpcbf"
		]
	}
}

Více vám řekne composer.json rozšíření AbuseFilter MediaWiki jako dobrý příklad.

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

Poznámky pod čarou