From ac03ceb5e6f8d71a0de6b2284c300d443f3061e6 Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Sun, 16 Aug 2020 02:30:03 +0200 Subject: [PATCH] Check if buildx installed (builder alias) Signed-off-by: CrazyMax --- dist/index.js | 27 ++++++++++++++++++++++++--- src/buildx.ts | 24 ++++++++++++++++++++++++ src/main.ts | 6 ++++-- 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/dist/index.js b/dist/index.js index 94cabd9..d0beef2 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1015,11 +1015,13 @@ function run() { return; } const inputs = yield context_helper_1.loadInputs(); + const buildxAvailable = yield buildx.isAvailable(); + const buildxInstalled = buildxAvailable && (yield buildx.isInstalled()); + const buildxEnabled = (yield context_helper_1.mustBuildx(inputs)) || buildxInstalled; let buildArgs = []; - const buildxEnabled = yield context_helper_1.mustBuildx(inputs); // Check buildx if (buildxEnabled) { - if (yield !buildx.isAvailable()) { + if (!buildxAvailable) { core.setFailed(`Buildx is required but not available`); return; } @@ -1893,8 +1895,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; Object.defineProperty(exports, "__esModule", { value: true }); -exports.use = exports.isAvailable = void 0; +exports.use = exports.isInstalled = exports.isAvailable = void 0; +const fs_1 = __importDefault(__webpack_require__(747)); +const path_1 = __importDefault(__webpack_require__(622)); +const os_1 = __importDefault(__webpack_require__(87)); const exec = __importStar(__webpack_require__(807)); function isAvailable() { return __awaiter(this, void 0, void 0, function* () { @@ -1907,6 +1915,19 @@ function isAvailable() { }); } exports.isAvailable = isAvailable; +function isInstalled() { + var _a; + return __awaiter(this, void 0, void 0, function* () { + const dockerHome = process.env.DOCKER_CONFIG || path_1.default.join(os_1.default.homedir(), '.docker'); + const dockerCfgFile = path_1.default.join(dockerHome, 'config.json'); + if (!fs_1.default.existsSync(dockerCfgFile)) { + return false; + } + const dockerCfg = JSON.parse(fs_1.default.readFileSync(dockerCfgFile, { encoding: 'utf-8' })); + return ((_a = dockerCfg.aliases) === null || _a === void 0 ? void 0 : _a.builder) == 'buildx'; + }); +} +exports.isInstalled = isInstalled; function use(builder) { return __awaiter(this, void 0, void 0, function* () { return yield exec.exec(`docker`, ['buildx', 'use', '--builder', builder], false).then(res => { diff --git a/src/buildx.ts b/src/buildx.ts index 38f38ef..1790f55 100644 --- a/src/buildx.ts +++ b/src/buildx.ts @@ -1,5 +1,17 @@ +import fs from 'fs'; +import path from 'path'; +import os from 'os'; import * as exec from './exec'; +interface DockerConfig { + credsStore?: string; + experimental?: string; + stackOrchestrator?: string; + aliases?: { + builder?: string; + }; +} + export async function isAvailable(): Promise { return await exec.exec(`docker`, ['buildx'], true).then(res => { if (res.stderr != '' && !res.success) { @@ -9,6 +21,18 @@ export async function isAvailable(): Promise { }); } +export async function isInstalled(): Promise { + const dockerHome: string = process.env.DOCKER_CONFIG || path.join(os.homedir(), '.docker'); + + const dockerCfgFile: string = path.join(dockerHome, 'config.json'); + if (!fs.existsSync(dockerCfgFile)) { + return false; + } + + const dockerCfg: DockerConfig = JSON.parse(fs.readFileSync(dockerCfgFile, {encoding: 'utf-8'})); + return dockerCfg.aliases?.builder == 'buildx'; +} + export async function use(builder: string): Promise { return await exec.exec(`docker`, ['buildx', 'use', '--builder', builder], false).then(res => { if (res.stderr != '' && !res.success) { diff --git a/src/main.ts b/src/main.ts index d783888..1f43d79 100644 --- a/src/main.ts +++ b/src/main.ts @@ -13,12 +13,14 @@ async function run(): Promise { } const inputs: Inputs = await loadInputs(); + const buildxAvailable = await buildx.isAvailable(); + const buildxInstalled = buildxAvailable && (await buildx.isInstalled()); + const buildxEnabled = (await mustBuildx(inputs)) || buildxInstalled; let buildArgs: Array = []; - const buildxEnabled = await mustBuildx(inputs); // Check buildx if (buildxEnabled) { - if (await !buildx.isAvailable()) { + if (!buildxAvailable) { core.setFailed(`Buildx is required but not available`); return; }