renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
163 lines (162 loc) • 6.88 kB
JavaScript
import "../../constants/error-messages.js";
import { pkg } from "../../expose.js";
import { GlobalConfig } from "../../config/global.js";
import { resetRepositoryLogLevelRemaps } from "../../logger/remap.js";
import { logger, setMeta } from "../../logger/index.js";
import { getInheritedOrGlobal } from "../../util/common.js";
import { deleteLocalFile, privateCacheDir } from "../../util/fs/index.js";
import { applySecretsAndVariablesToConfig } from "../../config/secrets.js";
import { ATTR_RENOVATE_SPLIT } from "../../instrumentation/types.js";
import { AbandonedPackageStats, DatasourceCacheStats, GetDatasourceReleasesStats, GitOperationStats, HttpCacheStats, HttpStats, LookupStats, ObsoleteCacheHitLogger, PackageCacheStats } from "../../util/stats.js";
import { instrument } from "../../instrumentation/index.js";
import { clear } from "../../util/http/queue.js";
import { clear as clear$1 } from "../../util/http/throttle.js";
import { removeDanglingContainers } from "../../util/exec/docker/index.js";
import { isCloned } from "../../util/git/index.js";
import { processResult } from "./result.js";
import { addExtractionStats } from "../../instrumentation/reporting.js";
import { detectSemanticCommits } from "../../util/git/semantic.js";
import { addSplit, getSplits, splitInit } from "../../util/split.js";
import { setBranchCache } from "./cache.js";
import { extractRepoProblems } from "./common.js";
import { OnboardingState } from "./onboarding/common.js";
import { configMigration } from "./config-migration/index.js";
import { ensureDependencyDashboard } from "./dependency-dashboard.js";
import handleError from "./error.js";
import { extractDependencies, updateRepo } from "./process/index.js";
import { pruneStaleBranches } from "./finalize/prune.js";
import { finalizeRepo } from "./finalize/index.js";
import { initRepo } from "./init/index.js";
import { ensureOnboardingPr } from "./onboarding/pr/index.js";
import fs from "fs-extra";
//#region lib/workers/repository/index.ts
// istanbul ignore next
async function renovateRepository(repoConfig, canRetry = true) {
splitInit();
let repoResult;
const { config, localDir, error } = await instrument("init", async () => {
let config = GlobalConfig.set(applySecretsAndVariablesToConfig({
config: repoConfig,
deleteVariables: false,
deleteSecrets: false
}));
await removeDanglingContainers();
setMeta({ repository: config.repository });
logger.info({ renovateVersion: pkg.version }, "Repository started");
logger.trace({ config });
clear();
clear$1();
const localDir = GlobalConfig.get("localDir");
try {
await fs.ensureDir(localDir);
logger.debug(`Using localDir: ${localDir}`);
config = await initRepo(config);
addSplit("init");
} catch (err) /* istanbul ignore next */ {
setMeta({ repository: config.repository });
const errorRes = await handleError(config, err);
if ([
"disabled-by-config",
"fork",
"disabled-no-config"
].includes(errorRes)) await pruneStaleBranches(config, []);
repoResult = processResult(config, errorRes);
return {
config,
localDir,
error: err
};
}
return {
config,
localDir
};
}, { attributes: { [ATTR_RENOVATE_SPLIT]: "init" } });
if (error === void 0) try {
const performExtract = config.repoIsOnboarded || !OnboardingState.onboardingCacheValid || OnboardingState.prUpdateRequested;
const extractResult = performExtract ? await extractDependencies(config) : emptyExtract();
addExtractionStats(config, extractResult);
const { branches, branchList, packageFiles } = extractResult;
if (config.semanticCommits === "auto") config.semanticCommits = await detectSemanticCommits();
if (GlobalConfig.get("dryRun") !== "lookup" && GlobalConfig.get("dryRun") !== "extract") {
await instrument("onboarding", () => ensureOnboardingPr(config, packageFiles, branches), { attributes: { [ATTR_RENOVATE_SPLIT]: "onboarding" } });
addSplit("onboarding");
const res = await instrument("update", () => updateRepo(config, branches), { attributes: { [ATTR_RENOVATE_SPLIT]: "update" } });
setMeta({ repository: config.repository });
addSplit("update");
if (performExtract) await setBranchCache(branches);
if (res === "automerged") {
if (canRetry) {
logger.info("Restarting repository job after automerge result");
return await renovateRepository(repoConfig, false);
}
logger.debug(`Automerged but already retried once`);
} else await ensureDependencyDashboard(config, branches, packageFiles, await configMigration(config, branchList));
await finalizeRepo(config, branchList, repoConfig);
repoResult = processResult(config, res);
}
printRepositoryProblems(config.repository);
} catch (err) /* istanbul ignore next */ {
setMeta({ repository: config.repository });
const errorRes = await handleError(config, err);
if ([
"disabled-by-config",
"fork",
"disabled-no-config"
].includes(errorRes)) await pruneStaleBranches(config, []);
repoResult = processResult(config, errorRes);
}
else logger.debug({ error }, "Skipping the rest to the Renovate run due to error in `init` phase");
if (localDir && !repoConfig.persistRepoData) try {
await deleteLocalFile(".");
} catch (err) /* istanbul ignore if */ {
logger.warn({ err }, "localDir deletion error");
}
try {
await fs.remove(privateCacheDir());
} catch (err) /* istanbul ignore if */ {
logger.warn({ err }, "privateCacheDir deletion error");
}
const splits = getSplits();
logger.debug(splits, "Repository timing splits (milliseconds)");
PackageCacheStats.report();
DatasourceCacheStats.report();
HttpStats.report();
HttpCacheStats.report();
LookupStats.report();
GetDatasourceReleasesStats.report();
ObsoleteCacheHitLogger.report();
AbandonedPackageStats.report();
GitOperationStats.report();
const cloned = isCloned();
/* v8 ignore next 11 -- coverage not required of these `undefined` checks, as we're happy receiving an `undefined` in the logs */
logger.info({
cloned,
durationMs: splits.total,
result: repoResult?.res,
status: repoResult?.status,
enabled: repoResult?.enabled,
onboarded: repoResult?.onboarded
}, "Repository finished");
resetRepositoryLogLevelRemaps();
return repoResult;
}
// istanbul ignore next: renovateRepository is ignored
function emptyExtract() {
return instrument("extract", () => {
addSplit("extract");
addSplit("lookup");
return {
branches: [],
branchList: [getInheritedOrGlobal("onboardingBranch")],
packageFiles: {}
};
}, { attributes: { [ATTR_RENOVATE_SPLIT]: "extract" } });
}
function printRepositoryProblems(repository) {
const repoProblems = extractRepoProblems(repository);
if (repoProblems.size) logger.debug({ repoProblems: Array.from(repoProblems) }, "repository problems");
}
//#endregion
export { renovateRepository };
//# sourceMappingURL=index.js.map