mirror of
				https://github.com/docker/setup-buildx-action.git
				synced 2025-11-04 06:34:19 +08:00 
			
		
		
		
	Merge pull request #14 from crazy-max/array-driver-opt
driver-opt as array of inputs (renamed driver-opts)
This commit is contained in:
		
						commit
						5636be6c3b
					
				
							
								
								
									
										8
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							@ -107,9 +107,11 @@ jobs:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        driver-opt:
 | 
			
		||||
        driver-opts:
 | 
			
		||||
          - image=moby/buildkit:latest
 | 
			
		||||
          - image=moby/buildkit:master
 | 
			
		||||
          - |
 | 
			
		||||
            image=moby/buildkit:master
 | 
			
		||||
            network=host
 | 
			
		||||
    steps:
 | 
			
		||||
      -
 | 
			
		||||
        name: Checkout
 | 
			
		||||
@ -119,7 +121,7 @@ jobs:
 | 
			
		||||
        uses: ./
 | 
			
		||||
        with:
 | 
			
		||||
          driver: docker-container
 | 
			
		||||
          driver-opt: ${{ matrix.driver-opt }}
 | 
			
		||||
          driver-opts: ${{ matrix.driver-opts }}
 | 
			
		||||
 | 
			
		||||
  docker-driver:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								README.md
									
									
									
									
									
								
							@ -130,11 +130,21 @@ Following inputs can be used as `step.with` keys
 | 
			
		||||
|--------------------|---------|-----------------------------------|
 | 
			
		||||
| `version`          | String  | [Buildx](https://github.com/docker/buildx) version. (e.g. `v0.3.0`, `latest`) |
 | 
			
		||||
| `driver`           | String  | Sets the [builder driver](https://github.com/docker/buildx#--driver-driver) to be used (default `docker-container`) |
 | 
			
		||||
| `driver-opt`       | String  | Passes additional [driver-specific options](https://github.com/docker/buildx#--driver-opt-options) |
 | 
			
		||||
| `driver-opts`      | CSV     | List of additional [driver-specific options](https://github.com/docker/buildx#--driver-opt-options) |
 | 
			
		||||
| `buildkitd-flags`  | String  | [Flags for buildkitd](https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md) daemon |
 | 
			
		||||
| `install`          | Bool    | Sets up `docker build` command as an alias to `docker buildx` (default `false`) |
 | 
			
		||||
| `use`              | Bool    | Switch to this builder instance (default `true`) |
 | 
			
		||||
 | 
			
		||||
> `CSV` type must be a newline-delimited string
 | 
			
		||||
> ```yaml
 | 
			
		||||
> driver-opts: image=moby/buildkit:master
 | 
			
		||||
> ```
 | 
			
		||||
> ```yaml
 | 
			
		||||
> driver-opts: |
 | 
			
		||||
>   image=moby/buildkit:master
 | 
			
		||||
>   network=host
 | 
			
		||||
> ```
 | 
			
		||||
 | 
			
		||||
### outputs
 | 
			
		||||
 | 
			
		||||
Following outputs are available
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										74
									
								
								__tests__/context.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								__tests__/context.test.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,74 @@
 | 
			
		||||
import * as context from '../src/context';
 | 
			
		||||
 | 
			
		||||
describe('getInputList', () => {
 | 
			
		||||
  it('handles single line correctly', async () => {
 | 
			
		||||
    await setInput('foo', 'bar');
 | 
			
		||||
    const res = await context.getInputList('foo');
 | 
			
		||||
    console.log(res);
 | 
			
		||||
    expect(res).toEqual(['bar']);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('handles multiple lines correctly', async () => {
 | 
			
		||||
    setInput('foo', 'bar\nbaz');
 | 
			
		||||
    const res = await context.getInputList('foo');
 | 
			
		||||
    console.log(res);
 | 
			
		||||
    expect(res).toEqual(['bar', 'baz']);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('handles comma correctly', async () => {
 | 
			
		||||
    setInput('foo', 'bar,baz');
 | 
			
		||||
    const res = await context.getInputList('foo');
 | 
			
		||||
    console.log(res);
 | 
			
		||||
    expect(res).toEqual(['bar', 'baz']);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('handles different new lines correctly', async () => {
 | 
			
		||||
    setInput('foo', 'bar\r\nbaz');
 | 
			
		||||
    const res = await context.getInputList('foo');
 | 
			
		||||
    console.log(res);
 | 
			
		||||
    expect(res).toEqual(['bar', 'baz']);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('handles different new lines and comma correctly', async () => {
 | 
			
		||||
    setInput('foo', 'bar\r\nbaz,bat');
 | 
			
		||||
    const res = await context.getInputList('foo');
 | 
			
		||||
    console.log(res);
 | 
			
		||||
    expect(res).toEqual(['bar', 'baz', 'bat']);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('handles multiple lines and ignoring comma correctly', async () => {
 | 
			
		||||
    setInput('driver-opts', 'image=moby/buildkit:master\nnetwork=host');
 | 
			
		||||
    const res = await context.getInputList('driver-opts', true);
 | 
			
		||||
    console.log(res);
 | 
			
		||||
    expect(res).toEqual(['image=moby/buildkit:master', 'network=host']);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('handles different new lines and ignoring comma correctly', async () => {
 | 
			
		||||
    setInput('driver-opts', 'image=moby/buildkit:master\r\nnetwork=host');
 | 
			
		||||
    const res = await context.getInputList('driver-opts', true);
 | 
			
		||||
    console.log(res);
 | 
			
		||||
    expect(res).toEqual(['image=moby/buildkit:master', 'network=host']);
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
describe('asyncForEach', () => {
 | 
			
		||||
  it('executes async tasks sequentially', async () => {
 | 
			
		||||
    const testValues = [1, 2, 3, 4, 5];
 | 
			
		||||
    const results: number[] = [];
 | 
			
		||||
 | 
			
		||||
    await context.asyncForEach(testValues, async value => {
 | 
			
		||||
      results.push(value);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    expect(results).toEqual(testValues);
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// See: https://github.com/actions/toolkit/blob/master/packages/core/src/core.ts#L67
 | 
			
		||||
function getInputName(name: string): string {
 | 
			
		||||
  return `INPUT_${name.replace(/ /g, '_').toUpperCase()}`;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function setInput(name: string, value: string): void {
 | 
			
		||||
  process.env[getInputName(name)] = value;
 | 
			
		||||
}
 | 
			
		||||
@ -14,8 +14,8 @@ inputs:
 | 
			
		||||
    description: 'Sets the builder driver to be used'
 | 
			
		||||
    default: 'docker-container'
 | 
			
		||||
    required: false
 | 
			
		||||
  driver-opt:
 | 
			
		||||
    description: 'Passes additional driver-specific options. Eg. image=moby/buildkit:master'
 | 
			
		||||
  driver-opts:
 | 
			
		||||
    description: 'List of additional driver-specific options. Eg. image=moby/buildkit:master'
 | 
			
		||||
    required: false
 | 
			
		||||
  buildkitd-flags:
 | 
			
		||||
    description: 'Flags for buildkitd daemon'
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										115
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										115
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -501,6 +501,7 @@ const exec = __importStar(__webpack_require__(514));
 | 
			
		||||
const os = __importStar(__webpack_require__(87));
 | 
			
		||||
const path = __importStar(__webpack_require__(622));
 | 
			
		||||
const buildx = __importStar(__webpack_require__(295));
 | 
			
		||||
const context = __importStar(__webpack_require__(842));
 | 
			
		||||
const mexec = __importStar(__webpack_require__(757));
 | 
			
		||||
const stateHelper = __importStar(__webpack_require__(647));
 | 
			
		||||
function run() {
 | 
			
		||||
@ -510,38 +511,33 @@ function run() {
 | 
			
		||||
                core.setFailed('Only supported on linux platform');
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            const bxVersion = core.getInput('version');
 | 
			
		||||
            const bxDriver = core.getInput('driver') || 'docker-container';
 | 
			
		||||
            const bxDriverOpt = core.getInput('driver-opt');
 | 
			
		||||
            const bxBuildkitdFlags = core.getInput('buildkitd-flags');
 | 
			
		||||
            const bxInstall = /true/i.test(core.getInput('install'));
 | 
			
		||||
            const bxUse = /true/i.test(core.getInput('use'));
 | 
			
		||||
            const inputs = yield context.getInputs();
 | 
			
		||||
            const dockerConfigHome = process.env.DOCKER_CONFIG || path.join(os.homedir(), '.docker');
 | 
			
		||||
            if (!(yield buildx.isAvailable()) || bxVersion) {
 | 
			
		||||
                yield buildx.install(bxVersion || 'latest', dockerConfigHome);
 | 
			
		||||
            if (!(yield buildx.isAvailable()) || inputs.version) {
 | 
			
		||||
                yield buildx.install(inputs.version || 'latest', dockerConfigHome);
 | 
			
		||||
            }
 | 
			
		||||
            core.info('📣 Buildx info');
 | 
			
		||||
            yield exec.exec('docker', ['buildx', 'version']);
 | 
			
		||||
            const builderName = bxDriver == 'docker' ? 'default' : `builder-${process.env.GITHUB_JOB}-${(yield buildx.countBuilders()) + 1}`;
 | 
			
		||||
            const builderName = inputs.driver == 'docker' ? 'default' : `builder-${process.env.GITHUB_JOB}-${(yield buildx.countBuilders()) + 1}`;
 | 
			
		||||
            core.setOutput('name', builderName);
 | 
			
		||||
            stateHelper.setBuilderName(builderName);
 | 
			
		||||
            if (bxDriver != 'docker') {
 | 
			
		||||
            if (inputs.driver !== 'docker') {
 | 
			
		||||
                core.info('🔨 Creating a new builder instance...');
 | 
			
		||||
                let createArgs = ['buildx', 'create', '--name', builderName, '--driver', bxDriver];
 | 
			
		||||
                if (bxDriverOpt) {
 | 
			
		||||
                    createArgs.push('--driver-opt', bxDriverOpt);
 | 
			
		||||
                let createArgs = ['buildx', 'create', '--name', builderName, '--driver', inputs.driver];
 | 
			
		||||
                yield context.asyncForEach(inputs.driverOpts, (driverOpt) => __awaiter(this, void 0, void 0, function* () {
 | 
			
		||||
                    createArgs.push('--driver-opt', driverOpt);
 | 
			
		||||
                }));
 | 
			
		||||
                if (inputs.buildkitdFlags) {
 | 
			
		||||
                    createArgs.push('--buildkitd-flags', inputs.buildkitdFlags);
 | 
			
		||||
                }
 | 
			
		||||
                if (bxBuildkitdFlags) {
 | 
			
		||||
                    createArgs.push('--buildkitd-flags', bxBuildkitdFlags);
 | 
			
		||||
                }
 | 
			
		||||
                if (bxUse) {
 | 
			
		||||
                if (inputs.use) {
 | 
			
		||||
                    createArgs.push('--use');
 | 
			
		||||
                }
 | 
			
		||||
                yield exec.exec('docker', createArgs);
 | 
			
		||||
                core.info('🏃 Booting builder...');
 | 
			
		||||
                yield exec.exec('docker', ['buildx', 'inspect', '--bootstrap']);
 | 
			
		||||
            }
 | 
			
		||||
            if (bxInstall) {
 | 
			
		||||
            if (inputs.install) {
 | 
			
		||||
                core.info('🤝 Setting buildx as default builder...');
 | 
			
		||||
                yield exec.exec('docker', ['buildx', 'install']);
 | 
			
		||||
            }
 | 
			
		||||
@ -1942,15 +1938,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.install = exports.platforms = exports.countBuilders = exports.isAvailable = void 0;
 | 
			
		||||
const fs = __importStar(__webpack_require__(747));
 | 
			
		||||
const os = __importStar(__webpack_require__(87));
 | 
			
		||||
const path = __importStar(__webpack_require__(622));
 | 
			
		||||
const semver = __importStar(__webpack_require__(383));
 | 
			
		||||
const util = __importStar(__webpack_require__(669));
 | 
			
		||||
const context = __importStar(__webpack_require__(842));
 | 
			
		||||
const exec = __importStar(__webpack_require__(757));
 | 
			
		||||
const github = __importStar(__webpack_require__(928));
 | 
			
		||||
const core = __importStar(__webpack_require__(186));
 | 
			
		||||
const tc = __importStar(__webpack_require__(784));
 | 
			
		||||
const osPlat = os.platform();
 | 
			
		||||
function isAvailable() {
 | 
			
		||||
    return __awaiter(this, void 0, void 0, function* () {
 | 
			
		||||
        return yield exec.exec(`docker`, ['buildx'], true).then(res => {
 | 
			
		||||
@ -2010,7 +2005,7 @@ function install(inputVersion, dockerConfigHome) {
 | 
			
		||||
        if (!fs.existsSync(pluginsDir)) {
 | 
			
		||||
            fs.mkdirSync(pluginsDir, { recursive: true });
 | 
			
		||||
        }
 | 
			
		||||
        const filename = osPlat == 'win32' ? 'docker-buildx.exe' : 'docker-buildx';
 | 
			
		||||
        const filename = context.osPlat == 'win32' ? 'docker-buildx.exe' : 'docker-buildx';
 | 
			
		||||
        const pluginPath = path.join(pluginsDir, filename);
 | 
			
		||||
        core.debug(`Plugin path is ${pluginPath}`);
 | 
			
		||||
        fs.copyFileSync(path.join(toolPath, filename), pluginPath);
 | 
			
		||||
@ -2023,10 +2018,10 @@ exports.install = install;
 | 
			
		||||
function download(version) {
 | 
			
		||||
    return __awaiter(this, void 0, void 0, function* () {
 | 
			
		||||
        version = semver.clean(version) || '';
 | 
			
		||||
        const platform = osPlat == 'win32' ? 'windows' : osPlat;
 | 
			
		||||
        const ext = osPlat == 'win32' ? '.exe' : '';
 | 
			
		||||
        const platform = context.osPlat == 'win32' ? 'windows' : context.osPlat;
 | 
			
		||||
        const ext = context.osPlat == 'win32' ? '.exe' : '';
 | 
			
		||||
        const filename = util.format('buildx-v%s.%s-amd64%s', version, platform, ext);
 | 
			
		||||
        const targetFile = osPlat == 'win32' ? 'docker-buildx.exe' : 'docker-buildx';
 | 
			
		||||
        const targetFile = context.osPlat == 'win32' ? 'docker-buildx.exe' : 'docker-buildx';
 | 
			
		||||
        const downloadUrl = util.format('https://github.com/docker/buildx/releases/download/v%s/%s', version, filename);
 | 
			
		||||
        let downloadPath;
 | 
			
		||||
        try {
 | 
			
		||||
@ -6489,6 +6484,78 @@ module.exports = require("url");
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 842:
 | 
			
		||||
/***/ (function(__unusedmodule, exports, __webpack_require__) {
 | 
			
		||||
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
 | 
			
		||||
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
 | 
			
		||||
    return new (P || (P = Promise))(function (resolve, reject) {
 | 
			
		||||
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
 | 
			
		||||
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
 | 
			
		||||
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
 | 
			
		||||
        step((generator = generator.apply(thisArg, _arguments || [])).next());
 | 
			
		||||
    });
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.asyncForEach = exports.getInputList = exports.getInputs = exports.osPlat = void 0;
 | 
			
		||||
const os = __importStar(__webpack_require__(87));
 | 
			
		||||
const core = __importStar(__webpack_require__(186));
 | 
			
		||||
exports.osPlat = os.platform();
 | 
			
		||||
function getInputs() {
 | 
			
		||||
    return __awaiter(this, void 0, void 0, function* () {
 | 
			
		||||
        return {
 | 
			
		||||
            version: core.getInput('version'),
 | 
			
		||||
            driver: core.getInput('driver') || 'docker-container',
 | 
			
		||||
            driverOpts: yield getInputList('driver-opts', true),
 | 
			
		||||
            buildkitdFlags: core.getInput('buildkitd-flags'),
 | 
			
		||||
            install: /true/i.test(core.getInput('install')),
 | 
			
		||||
            use: /true/i.test(core.getInput('use'))
 | 
			
		||||
        };
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
exports.getInputs = getInputs;
 | 
			
		||||
function getInputList(name, ignoreComma) {
 | 
			
		||||
    return __awaiter(this, void 0, void 0, function* () {
 | 
			
		||||
        const items = core.getInput(name);
 | 
			
		||||
        if (items == '') {
 | 
			
		||||
            return [];
 | 
			
		||||
        }
 | 
			
		||||
        return items
 | 
			
		||||
            .split(/\r?\n/)
 | 
			
		||||
            .reduce((acc, line) => acc.concat(!ignoreComma ? line.split(',') : line).map(pat => pat.trim()), []);
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
exports.getInputList = getInputList;
 | 
			
		||||
exports.asyncForEach = (array, callback) => __awaiter(void 0, void 0, void 0, function* () {
 | 
			
		||||
    for (let index = 0; index < array.length; index++) {
 | 
			
		||||
        yield callback(array[index], index, array);
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
//# sourceMappingURL=context.js.map
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 848:
 | 
			
		||||
/***/ (function(module, __unusedexports, __webpack_require__) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,15 +1,13 @@
 | 
			
		||||
import * as fs from 'fs';
 | 
			
		||||
import * as os from 'os';
 | 
			
		||||
import * as path from 'path';
 | 
			
		||||
import * as semver from 'semver';
 | 
			
		||||
import * as util from 'util';
 | 
			
		||||
import * as context from './context';
 | 
			
		||||
import * as exec from './exec';
 | 
			
		||||
import * as github from './github';
 | 
			
		||||
import * as core from '@actions/core';
 | 
			
		||||
import * as tc from '@actions/tool-cache';
 | 
			
		||||
 | 
			
		||||
const osPlat: string = os.platform();
 | 
			
		||||
 | 
			
		||||
export async function isAvailable(): Promise<Boolean> {
 | 
			
		||||
  return await exec.exec(`docker`, ['buildx'], true).then(res => {
 | 
			
		||||
    if (res.stderr != '' && !res.success) {
 | 
			
		||||
@ -65,7 +63,7 @@ export async function install(inputVersion: string, dockerConfigHome: string): P
 | 
			
		||||
    fs.mkdirSync(pluginsDir, {recursive: true});
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const filename: string = osPlat == 'win32' ? 'docker-buildx.exe' : 'docker-buildx';
 | 
			
		||||
  const filename: string = context.osPlat == 'win32' ? 'docker-buildx.exe' : 'docker-buildx';
 | 
			
		||||
  const pluginPath: string = path.join(pluginsDir, filename);
 | 
			
		||||
  core.debug(`Plugin path is ${pluginPath}`);
 | 
			
		||||
  fs.copyFileSync(path.join(toolPath, filename), pluginPath);
 | 
			
		||||
@ -78,10 +76,10 @@ export async function install(inputVersion: string, dockerConfigHome: string): P
 | 
			
		||||
 | 
			
		||||
async function download(version: string): Promise<string> {
 | 
			
		||||
  version = semver.clean(version) || '';
 | 
			
		||||
  const platform: string = osPlat == 'win32' ? 'windows' : osPlat;
 | 
			
		||||
  const ext: string = osPlat == 'win32' ? '.exe' : '';
 | 
			
		||||
  const platform: string = context.osPlat == 'win32' ? 'windows' : context.osPlat;
 | 
			
		||||
  const ext: string = context.osPlat == 'win32' ? '.exe' : '';
 | 
			
		||||
  const filename: string = util.format('buildx-v%s.%s-amd64%s', version, platform, ext);
 | 
			
		||||
  const targetFile: string = osPlat == 'win32' ? 'docker-buildx.exe' : 'docker-buildx';
 | 
			
		||||
  const targetFile: string = context.osPlat == 'win32' ? 'docker-buildx.exe' : 'docker-buildx';
 | 
			
		||||
 | 
			
		||||
  const downloadUrl = util.format('https://github.com/docker/buildx/releases/download/v%s/%s', version, filename);
 | 
			
		||||
  let downloadPath: string;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										40
									
								
								src/context.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/context.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,40 @@
 | 
			
		||||
import * as os from 'os';
 | 
			
		||||
import * as core from '@actions/core';
 | 
			
		||||
 | 
			
		||||
export const osPlat: string = os.platform();
 | 
			
		||||
 | 
			
		||||
export interface Inputs {
 | 
			
		||||
  version: string;
 | 
			
		||||
  driver: string;
 | 
			
		||||
  driverOpts: string[];
 | 
			
		||||
  buildkitdFlags: string;
 | 
			
		||||
  install: boolean;
 | 
			
		||||
  use: boolean;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function getInputs(): Promise<Inputs> {
 | 
			
		||||
  return {
 | 
			
		||||
    version: core.getInput('version'),
 | 
			
		||||
    driver: core.getInput('driver') || 'docker-container',
 | 
			
		||||
    driverOpts: await getInputList('driver-opts', true),
 | 
			
		||||
    buildkitdFlags: core.getInput('buildkitd-flags'),
 | 
			
		||||
    install: /true/i.test(core.getInput('install')),
 | 
			
		||||
    use: /true/i.test(core.getInput('use'))
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function getInputList(name: string, ignoreComma?: boolean): Promise<string[]> {
 | 
			
		||||
  const items = core.getInput(name);
 | 
			
		||||
  if (items == '') {
 | 
			
		||||
    return [];
 | 
			
		||||
  }
 | 
			
		||||
  return items
 | 
			
		||||
    .split(/\r?\n/)
 | 
			
		||||
    .reduce<string[]>((acc, line) => acc.concat(!ignoreComma ? line.split(',') : line).map(pat => pat.trim()), []);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const asyncForEach = async (array, callback) => {
 | 
			
		||||
  for (let index = 0; index < array.length; index++) {
 | 
			
		||||
    await callback(array[index], index, array);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										35
									
								
								src/main.ts
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								src/main.ts
									
									
									
									
									
								
							@ -3,6 +3,7 @@ import * as exec from '@actions/exec';
 | 
			
		||||
import * as os from 'os';
 | 
			
		||||
import * as path from 'path';
 | 
			
		||||
import * as buildx from './buildx';
 | 
			
		||||
import * as context from './context';
 | 
			
		||||
import * as mexec from './exec';
 | 
			
		||||
import * as stateHelper from './state-helper';
 | 
			
		||||
 | 
			
		||||
@ -13,48 +14,40 @@ async function run(): Promise<void> {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const bxVersion: string = core.getInput('version');
 | 
			
		||||
    const bxDriver: string = core.getInput('driver') || 'docker-container';
 | 
			
		||||
    const bxDriverOpt: string = core.getInput('driver-opt');
 | 
			
		||||
    const bxBuildkitdFlags: string = core.getInput('buildkitd-flags');
 | 
			
		||||
    const bxInstall: boolean = /true/i.test(core.getInput('install'));
 | 
			
		||||
    const bxUse: boolean = /true/i.test(core.getInput('use'));
 | 
			
		||||
 | 
			
		||||
    const inputs: context.Inputs = await context.getInputs();
 | 
			
		||||
    const dockerConfigHome: string = process.env.DOCKER_CONFIG || path.join(os.homedir(), '.docker');
 | 
			
		||||
 | 
			
		||||
    if (!(await buildx.isAvailable()) || bxVersion) {
 | 
			
		||||
      await buildx.install(bxVersion || 'latest', dockerConfigHome);
 | 
			
		||||
    if (!(await buildx.isAvailable()) || inputs.version) {
 | 
			
		||||
      await buildx.install(inputs.version || 'latest', dockerConfigHome);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    core.info('📣 Buildx info');
 | 
			
		||||
    await exec.exec('docker', ['buildx', 'version']);
 | 
			
		||||
 | 
			
		||||
    const builderName: string =
 | 
			
		||||
      bxDriver == 'docker' ? 'default' : `builder-${process.env.GITHUB_JOB}-${(await buildx.countBuilders()) + 1}`;
 | 
			
		||||
 | 
			
		||||
      inputs.driver == 'docker' ? 'default' : `builder-${process.env.GITHUB_JOB}-${(await buildx.countBuilders()) + 1}`;
 | 
			
		||||
    core.setOutput('name', builderName);
 | 
			
		||||
    stateHelper.setBuilderName(builderName);
 | 
			
		||||
 | 
			
		||||
    if (bxDriver != 'docker') {
 | 
			
		||||
    if (inputs.driver !== 'docker') {
 | 
			
		||||
      core.info('🔨 Creating a new builder instance...');
 | 
			
		||||
      let createArgs: Array<string> = ['buildx', 'create', '--name', builderName, '--driver', bxDriver];
 | 
			
		||||
      if (bxDriverOpt) {
 | 
			
		||||
        createArgs.push('--driver-opt', bxDriverOpt);
 | 
			
		||||
      let createArgs: Array<string> = ['buildx', 'create', '--name', builderName, '--driver', inputs.driver];
 | 
			
		||||
      await context.asyncForEach(inputs.driverOpts, async driverOpt => {
 | 
			
		||||
        createArgs.push('--driver-opt', driverOpt);
 | 
			
		||||
      });
 | 
			
		||||
      if (inputs.buildkitdFlags) {
 | 
			
		||||
        createArgs.push('--buildkitd-flags', inputs.buildkitdFlags);
 | 
			
		||||
      }
 | 
			
		||||
      if (bxBuildkitdFlags) {
 | 
			
		||||
        createArgs.push('--buildkitd-flags', bxBuildkitdFlags);
 | 
			
		||||
      }
 | 
			
		||||
      if (bxUse) {
 | 
			
		||||
      if (inputs.use) {
 | 
			
		||||
        createArgs.push('--use');
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      await exec.exec('docker', createArgs);
 | 
			
		||||
 | 
			
		||||
      core.info('🏃 Booting builder...');
 | 
			
		||||
      await exec.exec('docker', ['buildx', 'inspect', '--bootstrap']);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (bxInstall) {
 | 
			
		||||
    if (inputs.install) {
 | 
			
		||||
      core.info('🤝 Setting buildx as default builder...');
 | 
			
		||||
      await exec.exec('docker', ['buildx', 'install']);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user