UNPKG

setup-cpp

Version:

Install all the tools required for building and testing C++/C projects.

103 lines 13.9 kB
import { defaultExecOptions, execRootSync } from "admina"; import { info, warning } from "ci-log"; import { getAptEnv } from "./apt-env.js"; import { addAptKey } from "./apt-key.js"; import { addAptRepository } from "./apt-repository.js"; import { aptTimeout } from "./apt-timeout.js"; import { getApt } from "./get-apt.js"; import { initAptMemoized } from "./init-apt.js"; import { filterAndQualifyAptPackages } from "./qualify-install.js"; import { updateAptReposMemoized } from "./update.js"; const retryErrors = [ "E: Could not get lock", "dpkg: error processing archive", "dpkg: error: dpkg status database is locked by another process", ]; /** * Install a package using apt * * @param packages The packages to install (name, and optional info like version and repositories) * @param update Whether to update the package list before installing (Defaults to `false`) * * @returns The installation information * * @example * ```ts * await installAptPack([{ name: "ca-certificates" }, { name: "gnupg" }]) * ``` * * @example * ```ts await installAptPack([ { name: "gcc", version, repository: "ppa:ubuntu-toolchain-r/test", key: { key: "1E9377A2BA9EF27F", fileName: "ubuntu-toolchain-r-test.gpg" }, }, ]) * ``` */ export async function installAptPack(packages, update = false) { try { const apt = getApt(); for (const { name, version } of packages) { info(`Installing ${name} ${version ?? ""} via ${apt}`); } if (update) { // Force update the repos updateAptReposMemoized.clear(); } // Update the repos if needed updateAptReposMemoized(apt); // Add the repos if needed await addRepositories(apt, packages); const needToInstall = await filterAndQualifyAptPackages(packages, apt); if (needToInstall.length === 0) { info("All packages are already installed"); return { binDir: "/usr/bin/" }; } // Initialize apt if needed await initAptMemoized(apt); try { // Add the keys if needed await addAptKeys(packages); // Install execRootSync(apt, ["install", "--fix-broken", "-y", ...needToInstall], { ...defaultExecOptions, env: getAptEnv(apt), }); } catch (err) { if (isExecaError(err)) { if (retryErrors.some((error) => typeof err.stderr === "string" && err.stderr.includes(error))) { warning(`Failed to install packages ${needToInstall}. Retrying...`); execRootSync(apt, ["install", "--fix-broken", "-y", "-o", aptTimeout, ...needToInstall], { ...defaultExecOptions, env: getAptEnv(apt) }); } } else { throw err; } } return { binDir: "/usr/bin/" }; } catch (err) { const msg = err instanceof Error ? `${err.message}\n${err.stack}` : String(err); throw new Error(`Failed to install apt packages: ${msg}`); } } async function addRepositories(apt, packages) { const allRepositories = [...new Set(packages.flatMap((pack) => pack.repository ?? []))]; await Promise.all(allRepositories.map((repo) => addAptRepository(repo, apt))); } async function addAptKeys(packages) { await Promise.all(packages.map(async (pack) => { if (pack.key !== undefined) { await addAptKey(pack.key); } })); } function isExecaError(err) { return typeof err.stderr === "string"; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnN0YWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDekQsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFFdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN4QyxPQUFPLEVBQXlCLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDN0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQy9DLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ2xFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQWlDcEQsTUFBTSxXQUFXLEdBQUc7SUFDbEIsdUJBQXVCO0lBQ3ZCLGdDQUFnQztJQUNoQyxnRUFBZ0U7Q0FDakUsQ0FBQTtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FBQyxRQUFzQixFQUFFLE1BQU0sR0FBRyxLQUFLO0lBQ3pFLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFXLE1BQU0sRUFBRSxDQUFBO1FBRTVCLEtBQUssTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksT0FBTyxJQUFJLEVBQUUsUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFBO1FB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SUFDOUMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQzVDLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMzQixNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDM0IsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDTCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsR0FBWTtJQUNoQyxPQUFPLE9BQVEsR0FBa0IsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFBO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZhdWx0RXhlY09wdGlvbnMsIGV4ZWNSb290U3luYyB9IGZyb20gXCJhZG1pbmFcIlxuaW1wb3J0IHsgaW5mbywgd2FybmluZyB9IGZyb20gXCJjaS1sb2dcIlxuaW1wb3J0IHR5cGUgeyBFeGVjYUVycm9yIH0gZnJvbSBcImV4ZWNhXCJcbmltcG9ydCB7IGdldEFwdEVudiB9IGZyb20gXCIuL2FwdC1lbnYuanNcIlxuaW1wb3J0IHsgdHlwZSBBZGRBcHRLZXlPcHRpb25zLCBhZGRBcHRLZXkgfSBmcm9tIFwiLi9hcHQta2V5LmpzXCJcbmltcG9ydCB7IGFkZEFwdFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9hcHQtcmVwb3NpdG9yeS5qc1wiXG5pbXBvcnQgeyBhcHRUaW1lb3V0IH0gZnJvbSBcIi4vYXB0LXRpbWVvdXQuanNcIlxuaW1wb3J0IHsgZ2V0QXB0IH0gZnJvbSBcIi4vZ2V0LWFwdC5qc1wiXG5pbXBvcnQgeyBpbml0QXB0TWVtb2l6ZWQgfSBmcm9tIFwiLi9pbml0LWFwdC5qc1wiXG5pbXBvcnQgeyBmaWx0ZXJBbmRRdWFsaWZ5QXB0UGFja2FnZXMgfSBmcm9tIFwiLi9xdWFsaWZ5LWluc3RhbGwuanNcIlxuaW1wb3J0IHsgdXBkYXRlQXB0UmVwb3NNZW1vaXplZCB9IGZyb20gXCIuL3VwZGF0ZS5qc1wiXG5cbi8qKlxuICogVGhlIGluZm9ybWF0aW9uIGFib3V0IGFuIGluc3RhbGxhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbGF0aW9uSW5mbyA9IHtcbiAgLyoqIFRoZSBpbnN0YWxsIGRpciBvZiB0aGUgcGFja2FnZSAoRGVmYXVsdHMgdG8gYHVuZGVmaW5lZGApICovXG4gIGluc3RhbGxEaXI/OiBzdHJpbmdcbiAgLyoqIFRoZSBiaW4gZGlyIG9mIHRoZSBwYWNrYWdlIChEZWZhdWx0cyB0byBgL3Vzci9iaW5gKSAqL1xuICBiaW5EaXI6IHN0cmluZ1xuICAvKiogVGhlIGJpbiBwYXRoIG9mIHRoZSBwYWNrYWdlIChEZWZhdWx0cyB0byBgdW5kZWZpbmVkYCkgKi9cbiAgYmluPzogc3RyaW5nXG59XG5cbi8qKlxuICogVGhlIGluZm9ybWF0aW9uIGFib3V0IGFuIGFwdCBwYWNrYWdlXG4gKi9cbmV4cG9ydCB0eXBlIEFwdFBhY2thZ2UgPSB7XG4gIC8qKiBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSAqL1xuICBuYW1lOiBzdHJpbmdcbiAgLyoqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlIChvcHRpb25hbCkgKi9cbiAgdmVyc2lvbj86IHN0cmluZ1xuICAvKiogVGhlIHJlcG9zaXRvcnkgdG8gYWRkIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBwYWNrYWdlIChvcHRpb25hbCkgKi9cbiAgcmVwb3NpdG9yeT86IHN0cmluZ1xuICAvKiogVGhlIGtleSB0byBhZGQgYmVmb3JlIGluc3RhbGxpbmcgdGhlIHBhY2thZ2UgKG9wdGlvbmFsKSAqL1xuICBrZXk/OiBBZGRBcHRLZXlPcHRpb25zXG4gIC8qKlxuICAgKiBJZiB0aGUgZ2l2ZW4gdmVyc2lvbiBpcyBub3QgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBmYWxsQmFja1RvTGF0ZXN0PzogYm9vbGVhblxufVxuXG5jb25zdCByZXRyeUVycm9ycyA9IFtcbiAgXCJFOiBDb3VsZCBub3QgZ2V0IGxvY2tcIixcbiAgXCJkcGtnOiBlcnJvciBwcm9jZXNzaW5nIGFyY2hpdmVcIixcbiAgXCJkcGtnOiBlcnJvcjogZHBrZyBzdGF0dXMgZGF0YWJhc2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzc1wiLFxuXVxuXG4vKipcbiAqIEluc3RhbGwgYSBwYWNrYWdlIHVzaW5nIGFwdFxuICpcbiAqIEBwYXJhbSBwYWNrYWdlcyBUaGUgcGFja2FnZXMgdG8gaW5zdGFsbCAobmFtZSwgYW5kIG9wdGlvbmFsIGluZm8gbGlrZSB2ZXJzaW9uIGFuZCByZXBvc2l0b3JpZXMpXG4gKiBAcGFyYW0gdXBkYXRlIFdoZXRoZXIgdG8gdXBkYXRlIHRoZSBwYWNrYWdlIGxpc3QgYmVmb3JlIGluc3RhbGxpbmcgKERlZmF1bHRzIHRvIGBmYWxzZWApXG4gKlxuICogQHJldHVybnMgVGhlIGluc3RhbGxhdGlvbiBpbmZvcm1hdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogYXdhaXQgaW5zdGFsbEFwdFBhY2soW3sgbmFtZTogXCJjYS1jZXJ0aWZpY2F0ZXNcIiB9LCB7IG5hbWU6IFwiZ251cGdcIiB9XSlcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICBhd2FpdCBpbnN0YWxsQXB0UGFjayhbXG4gICAge1xuICAgICAgbmFtZTogXCJnY2NcIixcbiAgICAgIHZlcnNpb24sXG4gICAgICByZXBvc2l0b3J5OiBcInBwYTp1YnVudHUtdG9vbGNoYWluLXIvdGVzdFwiLFxuICAgICAga2V5OiB7IGtleTogXCIxRTkzNzdBMkJBOUVGMjdGXCIsIGZpbGVOYW1lOiBcInVidW50dS10b29sY2hhaW4tci10ZXN0LmdwZ1wiIH0sXG4gICAgfSxcbiAgXSlcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFwdFBhY2socGFja2FnZXM6IEFwdFBhY2thZ2VbXSwgdXBkYXRlID0gZmFsc2UpOiBQcm9taXNlPEluc3RhbGxhdGlvbkluZm8+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBhcHQ6IHN0cmluZyA9IGdldEFwdCgpXG5cbiAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdmVyc2lvbiB9IG9mIHBhY2thZ2VzKSB7XG4gICAgICBpbmZvKGBJbnN0YWxsaW5nICR7bmFtZX0gJHt2ZXJzaW9uID8/IFwiXCJ9IHZpYSAke2FwdH1gKVxuICAgIH1cblxuICAgIGlmICh1cGRhdGUpIHtcbiAgICAgIC8vIEZvcmNlIHVwZGF0ZSB0aGUgcmVwb3NcbiAgICAgIHVwZGF0ZUFwdFJlcG9zTWVtb2l6ZWQuY2xlYXIoKVxuICAgIH1cbiAgICAvLyBVcGRhdGUgdGhlIHJlcG9zIGlmIG5lZWRlZFxuICAgIHVwZGF0ZUFwdFJlcG9zTWVtb2l6ZWQoYXB0KVxuXG4gICAgLy8gQWRkIHRoZSByZXBvcyBpZiBuZWVkZWRcbiAgICBhd2FpdCBhZGRSZXBvc2l0b3JpZXMoYXB0LCBwYWNrYWdlcylcblxuICAgIGNvbnN0IG5lZWRUb0luc3RhbGwgPSBhd2FpdCBmaWx0ZXJBbmRRdWFsaWZ5QXB0UGFja2FnZXMocGFja2FnZXMsIGFwdClcblxuICAgIGlmIChuZWVkVG9JbnN0YWxsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyhcIkFsbCBwYWNrYWdlcyBhcmUgYWxyZWFkeSBpbnN0YWxsZWRcIilcbiAgICAgIHJldHVybiB7IGJpbkRpcjogXCIvdXNyL2Jpbi9cIiB9XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhcHQgaWYgbmVlZGVkXG4gICAgYXdhaXQgaW5pdEFwdE1lbW9pemVkKGFwdClcblxuICAgIHRyeSB7XG4gICAgICAvLyBBZGQgdGhlIGtleXMgaWYgbmVlZGVkXG4gICAgICBhd2FpdCBhZGRBcHRLZXlzKHBhY2thZ2VzKVxuXG4gICAgICAvLyBJbnN0YWxsXG4gICAgICBleGVjUm9vdFN5bmMoYXB0LCBbXCJpbnN0YWxsXCIsIFwiLS1maXgtYnJva2VuXCIsIFwiLXlcIiwgLi4ubmVlZFRvSW5zdGFsbF0sIHtcbiAgICAgICAgLi4uZGVmYXVsdEV4ZWNPcHRpb25zLFxuICAgICAgICBlbnY6IGdldEFwdEVudihhcHQpLFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChpc0V4ZWNhRXJyb3IoZXJyKSkge1xuICAgICAgICBpZiAocmV0cnlFcnJvcnMuc29tZSgoZXJyb3IpID0+IHR5cGVvZiBlcnIuc3RkZXJyID09PSBcInN0cmluZ1wiICYmIGVyci5zdGRlcnIuaW5jbHVkZXMoZXJyb3IpKSkge1xuICAgICAgICAgIHdhcm5pbmcoYEZhaWxlZCB0byBpbnN0YWxsIHBhY2thZ2VzICR7bmVlZFRvSW5zdGFsbH0uIFJldHJ5aW5nLi4uYClcbiAgICAgICAgICBleGVjUm9vdFN5bmMoXG4gICAgICAgICAgICBhcHQsXG4gICAgICAgICAgICBbXCJpbnN0YWxsXCIsIFwiLS1maXgtYnJva2VuXCIsIFwiLXlcIiwgXCItb1wiLCBhcHRUaW1lb3V0LCAuLi5uZWVkVG9JbnN0YWxsXSxcbiAgICAgICAgICAgIHsgLi4uZGVmYXVsdEV4ZWNPcHRpb25zLCBlbnY6IGdldEFwdEVudihhcHQpIH0sXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBiaW5EaXI6IFwiL3Vzci9iaW4vXCIgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vyci5tZXNzYWdlfVxcbiR7ZXJyLnN0YWNrfWAgOiBTdHJpbmcoZXJyKVxuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGluc3RhbGwgYXB0IHBhY2thZ2VzOiAke21zZ31gKVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFkZFJlcG9zaXRvcmllcyhhcHQ6IHN0cmluZywgcGFja2FnZXM6IEFwdFBhY2thZ2VbXSkge1xuICBjb25zdCBhbGxSZXBvc2l0b3JpZXMgPSBbLi4ubmV3IFNldChwYWNrYWdlcy5mbGF0TWFwKChwYWNrKSA9PiBwYWNrLnJlcG9zaXRvcnkgPz8gW10pKV1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoYWxsUmVwb3NpdG9yaWVzLm1hcCgocmVwbykgPT4gYWRkQXB0UmVwb3NpdG9yeShyZXBvLCBhcHQpKSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gYWRkQXB0S2V5cyhwYWNrYWdlczogQXB0UGFja2FnZVtdKSB7XG4gIGF3YWl0IFByb21pc2UuYWxsKHBhY2thZ2VzLm1hcChhc3luYyAocGFjaykgPT4ge1xuICAgIGlmIChwYWNrLmtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhd2FpdCBhZGRBcHRLZXkocGFjay5rZXkpXG4gICAgfVxuICB9KSlcbn1cblxuZnVuY3Rpb24gaXNFeGVjYUVycm9yKGVycjogdW5rbm93bik6IGVyciBpcyBFeGVjYUVycm9yIHtcbiAgcmV0dXJuIHR5cGVvZiAoZXJyIGFzIEV4ZWNhRXJyb3IpLnN0ZGVyciA9PT0gXCJzdHJpbmdcIlxufVxuIl19