Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .github/workflows/external-plugin-pr-quality-gates.yml
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,18 @@ jobs:
: qualityResult.overall_status === 'pass' || !shouldRun
? '## ✅ External plugin PR checks passed'
: '## ⚠️ External plugin PR checks need maintainer follow-up';
const formatGateOutput = (pluginName, gateName, gateStatus, rawOutput) => {
const output = String(rawOutput || '').trim() || '_No output captured._';
return [
'<details>',
`<summary>${pluginName} — ${gateName} (${gateStatus || 'not_run'})</summary>`,
'',
'```text',
output,
'```',
'</details>',
].join('\n');
};
Comment on lines +203 to +214

const rows = checkedPlugins.length > 0
? checkedPlugins.map((entry) => {
Expand All @@ -211,6 +223,21 @@ jobs:
return `| ${name} | ${quality.vally_lint_status || 'not_run'} | ${quality.smoke_status || 'not_run'} | ${quality.overall_status || 'not_run'} | ${sourceCell} |`;
})
: ['| _none_ | not_run | not_run | not_run | _n/a_ |'];
const failureDetails = checkedPlugins.flatMap((entry) => {
const name = String(entry?.name || 'unknown');
const quality = entry?.quality || {};
const shouldShowVally = quality.vally_lint_status === 'fail' || quality.vally_lint_status === 'infra_error' || String(quality.vally_lint_output || '').trim().length > 0;
const shouldShowSmoke = quality.smoke_status === 'fail' || quality.smoke_status === 'infra_error' || String(quality.smoke_output || '').trim().length > 0;

const details = [];
if (shouldShowVally) {
details.push(formatGateOutput(name, 'vally lint', quality.vally_lint_status, quality.vally_lint_output));
}
if (shouldShowSmoke) {
details.push(formatGateOutput(name, 'install smoke test', quality.smoke_status, quality.smoke_output));
}
return details;
});

const body = [
marker,
Expand All @@ -225,6 +252,14 @@ jobs:
'|---|---|---|---|---|',
...rows,
'',
...(failureDetails.length > 0
? [
'### Gate output details',
'',
...failureDetails,
'',
]
: []),
String(qualityResult.summary || '').trim() || '_No summary provided._',
].join('\n');

Expand Down
2 changes: 1 addition & 1 deletion eng/external-plugin-quality-gates.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ function cloneSubmissionRepository(workDir, plugin) {
// NOTE: Keep in sync with EXTERNAL_PLUGIN_ROOT_MANIFEST_PATHS in external-plugin-validation.mjs
const PLUGIN_JSON_CANDIDATES = [
[".github", "plugin", "plugin.json"],
[".plugins", "plugin.json"],
[".plugin", "plugin.json"],
["plugin.json"],
];

Expand Down
2 changes: 1 addition & 1 deletion eng/external-plugin-validation.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export const EXTERNAL_PLUGIN_POLICIES = Object.freeze({
const EXTERNAL_PLUGIN_ROOT_MANIFEST_PATHS = Object.freeze([
"plugin.json",
".github/plugin/plugin.json",
".plugins/plugin.json",
".plugin/plugin.json",
]);

function resolvePolicy(policy) {
Expand Down
Loading