UNPKG

@cloudsnorkel/cdk-github-runners

Version:

CDK construct to create GitHub Actions self-hosted runners. Creates ephemeral runners on demand. Easy to deploy and highly customizable.

90 lines 12.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AmiRecipe = void 0; exports.defaultBaseAmi = defaultBaseAmi; const cdk = require("aws-cdk-lib"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const base_image_1 = require("./base-image"); const providers_1 = require("../../providers"); const common_1 = require("../common"); /** * Image builder recipe for Amazon Machine Image (AMI). * * @internal */ class AmiRecipe extends cdk.Resource { constructor(scope, id, props) { super(scope, id); let components = props.components.map(component => { return { componentArn: component.arn, }; }); const blockDeviceMappings = props.storageSize ? [ { deviceName: (0, providers_1.amiRootDevice)(this, props.baseAmi.image).ref, ebs: { volumeSize: props.storageSize.toGibibytes(), deleteOnTermination: true, }, }, ] : undefined; this.name = (0, common_1.uniqueImageBuilderName)(this); let workingDirectory; if (props.platform == 'Linux') { workingDirectory = '/home/runner'; } else if (props.platform == 'Windows') { workingDirectory = 'C:/'; // must exist or Image Builder fails and must not be empty or git will stall installing from the default windows\system32 } else { throw new Error(`Unsupported AMI recipe platform: ${props.platform}`); } const recipe = new aws_cdk_lib_1.aws_imagebuilder.CfnImageRecipe(this, 'Recipe', { name: this.name, version: '1.0.x', parentImage: props.baseAmi.image, components, workingDirectory, tags: props.tags, blockDeviceMappings, }); this.arn = recipe.attrArn; this.version = recipe.getAtt('Version', cdk.ResolutionTypeHint.STRING).toString(); } } exports.AmiRecipe = AmiRecipe; /** * Default base AMI for given OS and architecture. * * @internal */ function defaultBaseAmi(scope, os, architecture) { let arch; if (architecture.is(providers_1.Architecture.X86_64)) { arch = 'x86'; } else if (architecture.is(providers_1.Architecture.ARM64)) { arch = 'arm64'; } else { throw new Error(`Unsupported architecture for base AMI: ${architecture.name}`); } if (os.is(providers_1.Os.LINUX_UBUNTU) || os.is(providers_1.Os.LINUX_UBUNTU_2204) || os.is(providers_1.Os.LINUX)) { return base_image_1.BaseImage.fromImageBuilder(scope, `ubuntu-server-22-lts-${arch}`); } if (os.is(providers_1.Os.LINUX_UBUNTU_2404)) { return base_image_1.BaseImage.fromImageBuilder(scope, `ubuntu-server-24-lts-${arch}`); } if (os.is(providers_1.Os.LINUX_AMAZON_2)) { return base_image_1.BaseImage.fromImageBuilder(scope, `amazon-linux-2-${arch}`); } if (os.is(providers_1.Os.LINUX_AMAZON_2023)) { return base_image_1.BaseImage.fromImageBuilder(scope, `amazon-linux-2023-${arch}`); } if (os.is(providers_1.Os.WINDOWS)) { return base_image_1.BaseImage.fromImageBuilder(scope, `windows-server-2022-english-full-base-${arch}`); } throw new Error(`OS ${os.name} not supported for AMI runner image`); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1pLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ltYWdlLWJ1aWxkZXJzL2F3cy1pbWFnZS1idWlsZGVyL2FtaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF5R0Esd0NBK0JDO0FBeElELG1DQUFtQztBQUNuQyw2Q0FBK0Q7QUFFL0QsNkNBQXlDO0FBRXpDLCtDQUFrRTtBQUNsRSxzQ0FBbUQ7QUF1Q25EOzs7O0dBSUc7QUFDSCxNQUFhLFNBQVUsU0FBUSxHQUFHLENBQUMsUUFBUTtJQUt6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTBCO1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDaEQsT0FBTztnQkFDTCxZQUFZLEVBQUUsU0FBUyxDQUFDLEdBQUc7YUFDNUIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUM5QztnQkFDRSxVQUFVLEVBQUUsSUFBQSx5QkFBYSxFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUc7Z0JBQ3hELEdBQUcsRUFBRTtvQkFDSCxVQUFVLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7b0JBQzNDLG1CQUFtQixFQUFFLElBQUk7aUJBQzFCO2FBQ0Y7U0FDRixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFZCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUEsK0JBQXNCLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFFekMsSUFBSSxnQkFBZ0IsQ0FBQztRQUNyQixJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksT0FBTyxFQUFFLENBQUM7WUFDOUIsZ0JBQWdCLEdBQUcsY0FB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LEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLHFDQUFxQyxDQUFDLENBQUM7QUFDdEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBhd3NfaW1hZ2VidWlsZGVyIGFzIGltYWdlYnVpbGRlciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQmFzZUltYWdlIH0gZnJvbSAnLi9iYXNlLWltYWdlJztcbmltcG9ydCB7IEltYWdlQnVpbGRlckNvbXBvbmVudCB9IGZyb20gJy4vYnVpbGRlcic7XG5pbXBvcnQgeyBhbWlSb290RGV2aWNlLCBBcmNoaXRlY3R1cmUsIE9zIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzJztcbmltcG9ydCB7IHVuaXF1ZUltYWdlQnVpbGRlck5hbWUgfSBmcm9tICcuLi9jb21tb24nO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIEFtaVJlY2lwZSBjb25zdHJ1Y3QuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmludGVyZmFjZSBBbWlSZWNpcGVQcm9wZXJ0aWVzIHtcbiAgLyoqXG4gICAqIFRhcmdldCBwbGF0Zm9ybS4gTXVzdCBtYXRjaCBidWlsZGVyIHBsYXRmb3JtLlxuICAgKi9cbiAgcmVhZG9ubHkgcGxhdGZvcm06ICdMaW51eCcgfCAnV2luZG93cyc7XG5cbiAgLyoqXG4gICAqIFRhcmdldCBhcmNoaXRlY3R1cmUuIE11c3QgbWF0Y2ggYnVpbGRlciBwbGF0Zm9ybS5cbiAgICovXG4gIHJlYWRvbmx5IGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBCYXNlIEFNSSB0byB1c2UgZm9yIHRoZSBuZXcgcnVubmVyIEFNSS5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VBbWk6IEJhc2VJbWFnZTtcblxuICAvKipcbiAgICogU3RvcmFnZSBzaXplIGZvciB0aGUgYnVpbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2VTaXplPzogY2RrLlNpemU7XG5cbiAgLyoqXG4gICAqIENvbXBvbmVudHMgdG8gYWRkIHRvIHRhcmdldCBjb250YWluZXIgaW1hZ2UuXG4gICAqL1xuICByZWFkb25seSBjb21wb25lbnRzOiBJbWFnZUJ1aWxkZXJDb21wb25lbnRbXTtcblxuICAvKipcbiAgICogVGFncyB0byBhcHBseSB0byB0aGUgcmVjaXBlIGFuZCBpbWFnZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogSW1hZ2UgYnVpbGRlciByZWNpcGUgZm9yIEFtYXpvbiBNYWNoaW5lIEltYWdlIChBTUkpLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQW1pUmVjaXBlIGV4dGVuZHMgY2RrLlJlc291cmNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBBbWlSZWNpcGVQcm9wZXJ0aWVzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGxldCBjb21wb25lbnRzID0gcHJvcHMuY29tcG9uZW50cy5tYXAoY29tcG9uZW50ID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBvbmVudEFybjogY29tcG9uZW50LmFybixcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBibG9ja0RldmljZU1hcHBpbmdzID0gcHJvcHMuc3RvcmFnZVNpemUgPyBbXG4gICAgICB7XG4gICAgICAgIGRldmljZU5hbWU6IGFtaVJvb3REZXZpY2UodGhpcywgcHJvcHMuYmFzZUFtaS5pbWFnZSkucmVmLFxuICAgICAgICBlYnM6IHtcbiAgICAgICAgICB2b2x1bWVTaXplOiBwcm9wcy5zdG9yYWdlU2l6ZS50b0dpYmlieXRlcygpLFxuICAgICAgICAgIGRlbGV0ZU9uVGVybWluYXRpb246IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0gOiB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLm5hbWUgPSB1bmlxdWVJbWFnZUJ1aWxkZXJOYW1lKHRoaXMpO1xuXG4gICAgbGV0IHdvcmtpbmdEaXJlY3Rvcnk7XG4gICAgaWYgKHByb3BzLnBsYXRmb3JtID09ICdMaW51eCcpIHtcbiAgICAgIHdvcmtpbmdEaXJlY3RvcnkgPSAnL2hvbWUvcnVubmVyJztcbiAgICB9IGVsc2UgaWYgKHByb3BzLnBsYXRmb3JtID09ICdXaW5kb3dzJykge1xuICAgICAgd29ya2luZ0RpcmVjdG9yeSA9ICdDOi8nOyAvLyBtdXN0IGV4aXN0IG9yIEltYWdlIEJ1aWxkZXIgZmFpbHMgYW5kIG11c3Qgbm90IGJlIGVtcHR5IG9yIGdpdCB3aWxsIHN0YWxsIGluc3RhbGxpbmcgZnJvbSB0aGUgZGVmYXVsdCB3aW5kb3dzXFxzeXN0ZW0zMlxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIEFNSSByZWNpcGUgcGxhdGZvcm06ICR7cHJvcHMucGxhdGZvcm19YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjaXBlID0gbmV3IGltYWdlYnVpbGRlci5DZm5JbWFnZVJlY2lwZSh0aGlzLCAnUmVjaXBlJywge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgdmVyc2lvbjogJzEuMC54JyxcbiAgICAgIHBhcmVudEltYWdlOiBwcm9wcy5iYXNlQW1pLmltYWdlLFxuICAgICAgY29tcG9uZW50cyxcbiAgICAgIHdvcmtpbmdEaXJlY3RvcnksXG4gICAgICB0YWdzOiBwcm9wcy50YWdzLFxuICAgICAgYmxvY2tEZXZpY2VNYXBwaW5ncyxcbiAgICB9KTtcblxuICAgIHRoaXMuYXJuID0gcmVjaXBlLmF0dHJBcm47XG4gICAgdGhpcy52ZXJzaW9uID0gcmVjaXBlLmdldEF0dCgnVmVyc2lvbicsIGNkay5SZXNvbHV0aW9uVHlwZUhpbnQuU1RSSU5HKS50b1N0cmluZygpO1xuICB9XG59XG5cbi8qKlxuICogRGVmYXVsdCBiYXNlIEFNSSBmb3IgZ2l2ZW4gT1MgYW5kIGFyY2hpdGVjdHVyZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRCYXNlQW1pKHNjb3BlOiBDb25zdHJ1Y3QsIG9zOiBPcywgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUpOiBCYXNlSW1hZ2Uge1xuICBsZXQgYXJjaDtcbiAgaWYgKGFyY2hpdGVjdHVyZS5pcyhBcmNoaXRlY3R1cmUuWDg2XzY0KSkge1xuICAgIGFyY2ggPSAneDg2JztcbiAgfSBlbHNlIGlmIChhcmNoaXRlY3R1cmUuaXMoQXJjaGl0ZWN0dXJlLkFSTTY0KSkge1xuICAgIGFyY2ggPSAnYXJtNjQnO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIGZvciBiYXNlIEFNSTogJHthcmNoaXRlY3R1cmUubmFtZX1gKTtcbiAgfVxuXG4gIGlmIChvcy5pcyhPcy5MSU5VWF9VQlVOVFUpIHx8IG9zLmlzKE9zLkxJTlVYX1VCVU5UVV8yMjA0KSB8fCBvcy5pcyhPcy5MSU5VWCkpIHtcbiAgICByZXR1cm4gQmFzZUltYWdlLmZyb21JbWFnZUJ1aWxkZXIoc2NvcGUsIGB1YnVudHUtc2VydmVyLTIyLWx0cy0ke2FyY2h9YCk7XG4gIH1cblxuICBpZiAob3MuaXMoT3MuTElOVVhfVUJVTlRVXzI0MDQpKSB7XG4gICAgcmV0dXJuIEJhc2VJbWFnZS5mcm9tSW1hZ2VCdWlsZGVyKHNjb3BlLCBgdWJ1bnR1LXNlcnZlci0yNC1sdHMtJHthcmNofWApO1xuICB9XG5cbiAgaWYgKG9zLmlzKE9zLkxJTlVYX0FNQVpPTl8yKSkge1xuICAgIHJldHVybiBCYXNlSW1hZ2UuZnJvbUltYWdlQnVpbGRlcihzY29wZSwgYGFtYXpvbi1saW51eC0yLSR7YXJjaH1gKTtcbiAgfVxuXG4gIGlmIChvcy5pcyhPcy5MSU5VWF9BTUFaT05fMjAyMykpIHtcbiAgICByZXR1cm4gQmFzZUltYWdlLmZyb21JbWFnZUJ1aWxkZXIoc2NvcGUsIGBhbWF6b24tbGludXgtMjAyMy0ke2FyY2h9YCk7XG4gIH1cblxuICBpZiAob3MuaXMoT3MuV0lORE9XUykpIHtcbiAgICByZXR1cm4gQmFzZUltYWdlLmZyb21JbWFnZUJ1aWxkZXIoc2NvcGUsIGB3aW5kb3dzLXNlcnZlci0yMDIyLWVuZ2xpc2gtZnVsbC1iYXNlLSR7YXJjaH1gKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgT1MgJHtvcy5uYW1lfSBub3Qgc3VwcG9ydGVkIGZvciBBTUkgcnVubmVyIGltYWdlYCk7XG59XG5cbiJdfQ==