Files
QSfera/Server/tests/config/woodpecker/skip_if_unchanged.js
T
Курнат Андрей 2315f25754 Initial QSfera import
2026-06-07 10:20:04 +03:00

91 lines
1.9 KiB
JavaScript

const fs = require("node:fs");
const { minimatch } = require("minimatch");
const type = process.argv[2];
function getSkipPatterns(type) {
const base = [
".github/**",
".vscode/**",
"docs/**",
"deployments/**",
"CHANGELOG.md",
"CONTRIBUTING.md",
"LICENSE",
"README.md",
];
const unit = ["**/*_test.go"];
const acceptance = ["tests/acceptance/**"];
if (
type === "acceptance-tests" ||
type === "e2e-tests" ||
type === "lint"
) {
return [...base, ...unit];
}
if (type === "unit-tests") {
return [...base, ...acceptance];
}
if (
type === "build-binary" ||
type === "build-docker" ||
type === "litmus"
) {
return [...base, ...unit, ...acceptance];
}
if (type === "cache" || type === "base") {
return base;
}
return [];
}
function main() {
const skipPatterns = getSkipPatterns(type);
if (skipPatterns.length === 0) {
process.exit(0);
}
const rawFiles = process.env.CI_PIPELINE_FILES;
// If CI_PIPELINE_FILES is not set, we assume the pipeline should run
if (!rawFiles) {
console.log("[INFO] CI_PIPELINE_FILES not set → run pipeline");
process.exit(0);
}
let changedFiles;
try {
changedFiles = JSON.parse(rawFiles);
} catch {
console.error("[ERROR] Failed to parse CI_PIPELINE_FILES:", rawFiles);
process.exit(1);
}
if (changedFiles.length === 0) {
process.exit(0);
}
console.log("[INFO] Changed files:", changedFiles);
const onlySkippable = changedFiles.every((file) =>
skipPatterns.some((pattern) =>
minimatch(file, pattern, { dot: true, matchBase: true })
)
);
if (onlySkippable) {
console.log("[INFO] Only skippable files changed → SKIP WORKFLOW");
fs.appendFileSync(".woodpecker.env", "SKIP_WORKFLOW=true\n");
} else {
console.log("[INFO] Relevant changes detected → run pipeline");
}
}
main();