From dee3cfee5039fac3bf198b26d1aad4a6ae6ada6f Mon Sep 17 00:00:00 2001 From: Shivam Mathur Date: Mon, 5 Oct 2020 12:52:57 +0530 Subject: [PATCH] Improve problem matchers section in README --- README.md | 65 +++++++++++++++++++++++++------ dist/index.js | 103 ++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 137 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 23df839d..c56ec978 100644 --- a/README.md +++ b/README.md @@ -300,31 +300,72 @@ If you have a number of workflows which setup multiple tools or have many compos ### Problem Matchers -#### PHPUnit +Problem matchers are `json` configurations which identify errors and warnings in your logs and surface that information prominently in the GitHub Actions UI by highlighting them and creating code annotations. -You can setup problem matchers for your `PHPUnit` output by adding this step after the `setup-php` step. This will scan the logs for failing tests and surface that information prominently in the GitHub Actions UI by creating annotations and log file decorations. +#### PHP + +Setup problem matchers for your `PHP` output by adding this step after the `setup-php` step. ```yaml -- name: Setup Problem Matchers for PHPUnit +- name: Setup problem matchers for PHP + run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" +``` + +#### PHPUnit + +Setup problem matchers for your `PHPUnit` output by adding this step after the `setup-php` step. + +```yaml +- name: Setup problem matchers for PHPUnit run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" ``` -#### Other Tools +#### PHPStan -For tools that support `checkstyle` reporting like `phpstan`, `psalm`, `php-cs-fixer` and `phpcs` you can use `cs2pr` to annotate your code. -For examples refer to [cs2pr documentation](https://github.com/staabm/annotate-pull-request-from-checkstyle). - -> Here is an example with `phpstan`. +PHPStan supports error reporting in GitHub Actions, so no problem matchers are required. ```yaml - name: Setup PHP - uses: shivammathur/setup-php@v1 + uses: shivammathur/setup-php@v2 with: php-version: '7.4' - tools: cs2pr, phpstan + tools: phpstan -- name: PHPStan - run: phpstan analyse src --error-format=checkstyle | cs2pr +- name: Run PHPStan + run: phpstan analyse src +``` + +#### Psalm + +Psalm supports error reporting in GitHub Actions with an output format `github`. + +```yaml +- name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '7.4' + tools: psalm + +- name: Run Psalm + run: psalm --output-format=github +``` + +#### Tools with checkstyle support + +For tools that support `checkstyle` reporting like `phpstan`, `psalm`, `php-cs-fixer` and `phpcs` you can use `cs2pr` to annotate your code. +For examples refer to [cs2pr documentation](https://github.com/staabm/annotate-pull-request-from-checkstyle). + +> Here is an example with `phpcs`. + +```yaml +- name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '7.4' + tools: cs2pr, phpcs + +- name: Run phpcs + run: phpcs -q --report=checkstyle src | cs2pr ``` ### Examples diff --git a/dist/index.js b/dist/index.js index 69659afa..f5b869ce 100644 --- a/dist/index.js +++ b/dist/index.js @@ -953,6 +953,32 @@ class ExecState extends events.EventEmitter { /***/ }), +/***/ 82: +/***/ (function(__unusedmodule, exports) { + +"use strict"; + +// We use any as a valid input type +/* eslint-disable @typescript-eslint/no-explicit-any */ +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Sanitizes an input into a string so it can be passed into issueCommand safely + * @param input input to sanitize into a string + */ +function toCommandValue(input) { + if (input === null || input === undefined) { + return ''; + } + else if (typeof input === 'string' || input instanceof String) { + return input; + } + return JSON.stringify(input); +} +exports.toCommandValue = toCommandValue; +//# sourceMappingURL=utils.js.map + +/***/ }), + /***/ 86: /***/ (function(__unusedmodule, exports, __webpack_require__) { @@ -1002,6 +1028,42 @@ module.exports = require("os"); /***/ }), +/***/ 102: +/***/ (function(__unusedmodule, exports, __webpack_require__) { + +"use strict"; + +// For internal use, subject to change. +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// We use any as a valid input type +/* eslint-disable @typescript-eslint/no-explicit-any */ +const fs = __importStar(__webpack_require__(747)); +const os = __importStar(__webpack_require__(87)); +const utils_1 = __webpack_require__(82); +function issueCommand(command, message) { + const filePath = process.env[`GITHUB_${command}`]; + if (!filePath) { + throw new Error(`Unable to find environment variable for file command ${command}`); + } + if (!fs.existsSync(filePath)) { + throw new Error(`Missing file at path: ${filePath}`); + } + fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, { + encoding: 'utf8' + }); +} +exports.issueCommand = issueCommand; +//# sourceMappingURL=file-command.js.map + +/***/ }), + /***/ 129: /***/ (function(module) { @@ -1270,6 +1332,7 @@ var __importStar = (this && this.__importStar) || function (mod) { }; Object.defineProperty(exports, "__esModule", { value: true }); const os = __importStar(__webpack_require__(87)); +const utils_1 = __webpack_require__(82); /** * Commands * @@ -1323,28 +1386,14 @@ class Command { return cmdStr; } } -/** - * Sanitizes an input into a string so it can be passed into issueCommand safely - * @param input input to sanitize into a string - */ -function toCommandValue(input) { - if (input === null || input === undefined) { - return ''; - } - else if (typeof input === 'string' || input instanceof String) { - return input; - } - return JSON.stringify(input); -} -exports.toCommandValue = toCommandValue; function escapeData(s) { - return toCommandValue(s) + return utils_1.toCommandValue(s) .replace(/%/g, '%25') .replace(/\r/g, '%0D') .replace(/\n/g, '%0A'); } function escapeProperty(s) { - return toCommandValue(s) + return utils_1.toCommandValue(s) .replace(/%/g, '%25') .replace(/\r/g, '%0D') .replace(/\n/g, '%0A') @@ -1378,6 +1427,8 @@ var __importStar = (this && this.__importStar) || function (mod) { }; Object.defineProperty(exports, "__esModule", { value: true }); const command_1 = __webpack_require__(431); +const file_command_1 = __webpack_require__(102); +const utils_1 = __webpack_require__(82); const os = __importStar(__webpack_require__(87)); const path = __importStar(__webpack_require__(622)); /** @@ -1404,9 +1455,17 @@ var ExitCode; */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function exportVariable(name, val) { - const convertedVal = command_1.toCommandValue(val); + const convertedVal = utils_1.toCommandValue(val); process.env[name] = convertedVal; - command_1.issueCommand('set-env', { name }, convertedVal); + const filePath = process.env['GITHUB_ENV'] || ''; + if (filePath) { + const delimiter = '_GitHubActionsFileCommandDelimeter_'; + const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`; + file_command_1.issueCommand('ENV', commandValue); + } + else { + command_1.issueCommand('set-env', { name }, convertedVal); + } } exports.exportVariable = exportVariable; /** @@ -1422,7 +1481,13 @@ exports.setSecret = setSecret; * @param inputPath */ function addPath(inputPath) { - command_1.issueCommand('add-path', {}, inputPath); + const filePath = process.env['GITHUB_PATH'] || ''; + if (filePath) { + file_command_1.issueCommand('PATH', inputPath); + } + else { + command_1.issueCommand('add-path', {}, inputPath); + } process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; } exports.addPath = addPath;