From 5a5189139aed61a58a9f2970d62418a70fd3f273 Mon Sep 17 00:00:00 2001 From: Weike Qu Date: Tue, 28 Nov 2023 11:58:54 -0800 Subject: [PATCH] feat: update infrastructure to use macOS 14 Signed-off-by: Weike Qu --- cdk.context.json | 6 +- config/runner-config.json | 454 +++++++++++++++++----------------- test/asg-runner-stack.test.ts | 57 +++++ 3 files changed, 289 insertions(+), 228 deletions(-) create mode 100644 test/asg-runner-stack.test.ts diff --git a/cdk.context.json b/cdk.context.json index 422f739..6509722 100644 --- a/cdk.context.json +++ b/cdk.context.json @@ -127,5 +127,9 @@ "ami:account=019528120233:filters.architecture.0=arm64_mac:filters.image-type.0=machine:filters.name.0=amzn-ec2-macos-12.6*:filters.owner-alias.0=amazon:filters.root-device-type.0=ebs:filters.state.0=available:filters.virtualization-type.0=hvm:region=us-east-2": "ami-0c6d905d74b45d00a", "ami:account=019528120233:filters.architecture.0=x86_64_mac:filters.image-type.0=machine:filters.name.0=amzn-ec2-macos-12.6*:filters.owner-alias.0=amazon:filters.root-device-type.0=ebs:filters.state.0=available:filters.virtualization-type.0=hvm:region=us-east-2": "ami-0e64f85d193de79ad", "ami:account=019528120233:filters.architecture.0=arm64_mac:filters.image-type.0=machine:filters.name.0=amzn-ec2-macos-11.7*:filters.owner-alias.0=amazon:filters.root-device-type.0=ebs:filters.state.0=available:filters.virtualization-type.0=hvm:region=us-east-2": "ami-0b6c84efbea5e6bb6", - "ami:account=019528120233:filters.architecture.0=x86_64_mac:filters.image-type.0=machine:filters.name.0=amzn-ec2-macos-11.7*:filters.owner-alias.0=amazon:filters.root-device-type.0=ebs:filters.state.0=available:filters.virtualization-type.0=hvm:region=us-east-2": "ami-06795a977cbd1adf1" + "ami:account=019528120233:filters.architecture.0=x86_64_mac:filters.image-type.0=machine:filters.name.0=amzn-ec2-macos-11.7*:filters.owner-alias.0=amazon:filters.root-device-type.0=ebs:filters.state.0=available:filters.virtualization-type.0=hvm:region=us-east-2": "ami-06795a977cbd1adf1", + "ami:account=090529234398:filters.architecture.0=arm64_mac:filters.image-type.0=machine:filters.name.0=amzn-ec2-macos-14.1*:filters.owner-alias.0=amazon:filters.root-device-type.0=ebs:filters.state.0=available:filters.virtualization-type.0=hvm:region=us-west-2": "ami-0a18d0d3ba8c9596b", + "ami:account=090529234398:filters.architecture.0=x86_64_mac:filters.image-type.0=machine:filters.name.0=amzn-ec2-macos-14.1*:filters.owner-alias.0=amazon:filters.root-device-type.0=ebs:filters.state.0=available:filters.virtualization-type.0=hvm:region=us-west-2": "ami-0a3536378b0dcbcb0", + "ami:account=019528120233:filters.architecture.0=arm64_mac:filters.image-type.0=machine:filters.name.0=amzn-ec2-macos-14.1*:filters.owner-alias.0=amazon:filters.root-device-type.0=ebs:filters.state.0=available:filters.virtualization-type.0=hvm:region=us-east-2": "ami-0fb1a8ce1a0e727d8", + "ami:account=019528120233:filters.architecture.0=x86_64_mac:filters.image-type.0=machine:filters.name.0=amzn-ec2-macos-14.1*:filters.owner-alias.0=amazon:filters.root-device-type.0=ebs:filters.state.0=available:filters.virtualization-type.0=hvm:region=us-east-2": "ami-0513d1dba13c208f0" } diff --git a/config/runner-config.json b/config/runner-config.json index 984c1a4..2a9598f 100644 --- a/config/runner-config.json +++ b/config/runner-config.json @@ -1,228 +1,228 @@ { - "runnerBeta": { - "macLicenseArn": "arn:aws:license-manager:us-west-2:820462304213:license-configuration:lic-7ac3e249bd13f71b44ac34963a8c3353", - "windowsLicenseArn": "arn:aws:license-manager:us-west-2:820462304213:license-configuration:lic-56c55a611976d66a1357e58077b19e93", - "runnerTypes": [ - { - "platform": "mac", - "version": "13.2", - "arch": "arm", - "repo": "finch", - "desiredInstances": 1, - "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] - }, - { - "platform": "mac", - "version": "13.2", - "arch": "x86", - "repo": "finch-core", - "desiredInstances": 1, - "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] - }, - { - "platform": "windows", - "version": "2022", - "arch": "x86", - "repo": "finch", - "desiredInstances": 1, - "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] - }, - { - "platform": "windows", - "version": "2022", - "arch": "x86", - "repo": "finch-core", - "desiredInstances": 1, - "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] - } - ] - }, - "runnerProd": { - "macLicenseArn": "arn:aws:license-manager:us-west-2:090529234398:license-configuration:lic-c0c3e2458f6d2a45b0bcc8d66fbc072e", - "windowsLicenseArn": "arn:aws:license-manager:us-west-2:090529234398:license-configuration:lic-62c55a61d2d9ce6ef100c6ea267216e6", - "runnerTypes": [ - { - "platform": "mac", - "version": "13.2", - "arch": "arm", - "repo": "finch", - "desiredInstances": 2, - "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] - }, - { - "platform": "mac", - "version": "13.2", - "arch": "x86", - "repo": "finch", - "desiredInstances": 2, - "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] - }, - { - "platform": "mac", - "version": "12.6", - "arch": "arm", - "repo": "finch", - "desiredInstances": 2, - "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] - }, - { - "platform": "mac", - "version": "12.6", - "arch": "x86", - "repo": "finch", - "desiredInstances": 2, - "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] - }, - { - "platform": "mac", - "version": "13.2", - "arch": "arm", - "repo": "finch-core", - "desiredInstances": 1, - "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] - }, - { - "platform": "mac", - "version": "13.2", - "arch": "x86", - "repo": "finch-core", - "desiredInstances": 1, - "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] - }, - { - "platform": "mac", - "version": "12.6", - "arch": "arm", - "repo": "finch-core", - "desiredInstances": 1, - "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] - }, - { - "platform": "mac", - "version": "12.6", - "arch": "x86", - "repo": "finch-core", - "desiredInstances": 1, - "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] - }, - { - "platform": "windows", - "version": "2022", - "arch": "x86", - "repo": "finch", - "desiredInstances": 2, - "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] - }, - { - "platform": "windows", - "version": "2022", - "arch": "x86", - "repo": "finch-core", - "desiredInstances": 1, - "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] - } - ] - }, - "runnerRelease": { - "macLicenseArn": "arn:aws:license-manager:us-east-2:019528120233:license-configuration:lic-94c3e244cb74a70c90c82f432e9e0d91", - "windowsLicenseArn": "arn:aws:license-manager:us-east-2:019528120233:license-configuration:lic-2ec55a6280292474f1ea0d7ad6f64987", - "runnerTypes": [ - { - "platform": "mac", - "version": "13.2", - "arch": "arm", - "repo": "finch", - "desiredInstances": 1, - "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] - }, - { - "platform": "mac", - "version": "13.2", - "arch": "x86", - "repo": "finch", - "desiredInstances": 1, - "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] - }, - { - "platform": "mac", - "version": "12.6", - "arch": "arm", - "repo": "finch", - "desiredInstances": 1, - "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] - }, - { - "platform": "mac", - "version": "12.6", - "arch": "x86", - "repo": "finch", - "desiredInstances": 1, - "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] - }, - { - "platform": "mac", - "version": "11.7", - "arch": "arm", - "repo": "finch", - "desiredInstances": 1, - "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] - }, - { - "platform": "mac", - "version": "11.7", - "arch": "x86", - "repo": "finch", - "desiredInstances": 1, - "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] - }, - { - "platform": "mac", - "version": "13.2", - "arch": "arm", - "repo": "finch-core", - "desiredInstances": 1, - "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] - }, - { - "platform": "mac", - "version": "13.2", - "arch": "x86", - "repo": "finch-core", - "desiredInstances": 1, - "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] - }, - { - "platform": "mac", - "version": "11.7", - "arch": "arm", - "repo": "finch-core", - "desiredInstances": 1, - "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] - }, - { - "platform": "mac", - "version": "11.7", - "arch": "x86", - "repo": "finch-core", - "desiredInstances": 1, - "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] - }, - { - "platform": "windows", - "version": "2022", - "arch": "x86", - "repo": "finch", - "desiredInstances": 1, - "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] - }, - { - "platform": "windows", - "version": "2022", - "arch": "x86", - "repo": "finch-core", - "desiredInstances": 1, - "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] - } - ] - } -} \ No newline at end of file + "runnerBeta": { + "macLicenseArn": "arn:aws:license-manager:us-west-2:820462304213:license-configuration:lic-7ac3e249bd13f71b44ac34963a8c3353", + "windowsLicenseArn": "arn:aws:license-manager:us-west-2:820462304213:license-configuration:lic-56c55a611976d66a1357e58077b19e93", + "runnerTypes": [ + { + "platform": "mac", + "version": "13.2", + "arch": "arm", + "repo": "finch", + "desiredInstances": 1, + "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + }, + { + "platform": "mac", + "version": "13.2", + "arch": "x86", + "repo": "finch-core", + "desiredInstances": 1, + "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + }, + { + "platform": "windows", + "version": "2022", + "arch": "x86", + "repo": "finch", + "desiredInstances": 1, + "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + }, + { + "platform": "windows", + "version": "2022", + "arch": "x86", + "repo": "finch-core", + "desiredInstances": 1, + "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + } + ] + }, + "runnerProd": { + "macLicenseArn": "arn:aws:license-manager:us-west-2:090529234398:license-configuration:lic-c0c3e2458f6d2a45b0bcc8d66fbc072e", + "windowsLicenseArn": "arn:aws:license-manager:us-west-2:090529234398:license-configuration:lic-62c55a61d2d9ce6ef100c6ea267216e6", + "runnerTypes": [ + { + "platform": "mac", + "version": "13.2", + "arch": "arm", + "repo": "finch", + "desiredInstances": 2, + "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + }, + { + "platform": "mac", + "version": "13.2", + "arch": "x86", + "repo": "finch", + "desiredInstances": 2, + "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + }, + { + "platform": "mac", + "version": "14.1", + "arch": "arm", + "repo": "finch", + "desiredInstances": 2, + "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + }, + { + "platform": "mac", + "version": "14.1", + "arch": "x86", + "repo": "finch", + "desiredInstances": 2, + "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + }, + { + "platform": "mac", + "version": "13.2", + "arch": "arm", + "repo": "finch-core", + "desiredInstances": 1, + "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + }, + { + "platform": "mac", + "version": "13.2", + "arch": "x86", + "repo": "finch-core", + "desiredInstances": 1, + "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + }, + { + "platform": "mac", + "version": "14.1", + "arch": "arm", + "repo": "finch-core", + "desiredInstances": 1, + "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + }, + { + "platform": "mac", + "version": "14.1", + "arch": "x86", + "repo": "finch-core", + "desiredInstances": 1, + "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + }, + { + "platform": "windows", + "version": "2022", + "arch": "x86", + "repo": "finch", + "desiredInstances": 2, + "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + }, + { + "platform": "windows", + "version": "2022", + "arch": "x86", + "repo": "finch-core", + "desiredInstances": 1, + "availabilityZones": ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"] + } + ] + }, + "runnerRelease": { + "macLicenseArn": "arn:aws:license-manager:us-east-2:019528120233:license-configuration:lic-94c3e244cb74a70c90c82f432e9e0d91", + "windowsLicenseArn": "arn:aws:license-manager:us-east-2:019528120233:license-configuration:lic-2ec55a6280292474f1ea0d7ad6f64987", + "runnerTypes": [ + { + "platform": "mac", + "version": "13.2", + "arch": "arm", + "repo": "finch", + "desiredInstances": 1, + "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] + }, + { + "platform": "mac", + "version": "13.2", + "arch": "x86", + "repo": "finch", + "desiredInstances": 1, + "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] + }, + { + "platform": "mac", + "version": "14.1", + "arch": "arm", + "repo": "finch", + "desiredInstances": 1, + "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] + }, + { + "platform": "mac", + "version": "14.1", + "arch": "x86", + "repo": "finch", + "desiredInstances": 1, + "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] + }, + { + "platform": "mac", + "version": "11.7", + "arch": "arm", + "repo": "finch", + "desiredInstances": 1, + "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] + }, + { + "platform": "mac", + "version": "11.7", + "arch": "x86", + "repo": "finch", + "desiredInstances": 1, + "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] + }, + { + "platform": "mac", + "version": "13.2", + "arch": "arm", + "repo": "finch-core", + "desiredInstances": 1, + "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] + }, + { + "platform": "mac", + "version": "13.2", + "arch": "x86", + "repo": "finch-core", + "desiredInstances": 1, + "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] + }, + { + "platform": "mac", + "version": "11.7", + "arch": "arm", + "repo": "finch-core", + "desiredInstances": 1, + "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] + }, + { + "platform": "mac", + "version": "11.7", + "arch": "x86", + "repo": "finch-core", + "desiredInstances": 1, + "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] + }, + { + "platform": "windows", + "version": "2022", + "arch": "x86", + "repo": "finch", + "desiredInstances": 1, + "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] + }, + { + "platform": "windows", + "version": "2022", + "arch": "x86", + "repo": "finch-core", + "desiredInstances": 1, + "availabilityZones": ["us-east-2a", "us-east-2b", "us-east-2c"] + } + ] + } +} diff --git a/test/asg-runner-stack.test.ts b/test/asg-runner-stack.test.ts new file mode 100644 index 0000000..a60dc8b --- /dev/null +++ b/test/asg-runner-stack.test.ts @@ -0,0 +1,57 @@ +import * as cdk from 'aws-cdk-lib'; +import { Template } from 'aws-cdk-lib/assertions'; +import { ASGRunnerStack } from '../lib/asg-runner-stack'; +import { ENVIRONMENT_STAGE } from '../lib/finch-pipeline-app-stage'; +import { PlatformType, RunnerConfig, RunnerType } from '../config/runner-config'; + +const generateASGStackName = (runnerType: RunnerType) => + `ASG-${runnerType.platform}-${runnerType.repo}-${runnerType.version.split('.')[0]}-${runnerType.arch}Stack`; + +describe('ASGRunnerStack test', () => { + const app = new cdk.App(); + const runnerConfig = RunnerConfig.runnerProd; + const stacks: ASGRunnerStack[] = []; + runnerConfig.runnerTypes.forEach((runnerType) => { + const ASGStackName = generateASGStackName(runnerType); + const licenseArn = + runnerType.platform === PlatformType.WINDOWS ? runnerConfig.windowsLicenseArn : runnerConfig.macLicenseArn; + stacks.push( + new ASGRunnerStack(app, ASGStackName, { + env: { + account: '123456789012', + region: 'us-east-1' + }, + stage: ENVIRONMENT_STAGE.Prod, + licenseArn: licenseArn, + type: runnerType + }) + ); + }); + const templates = stacks.map((stack) => Template.fromStack(stack)); + + it('should have the correct number of resources', () => { + templates.forEach((template) => { + template.resourceCountIs('AWS::AutoScaling::AutoScalingGroup', 1); + template.resourceCountIs('AWS::EC2::LaunchTemplate', 1); + template.resourceCountIs('AWS::ResourceGroups::Group', 1); + template.resourceCountIs('AWS::EC2::SecurityGroup', 1); + template.resourceCountIs('AWS::IAM::Role', 1); + template.resourceCountIs('AWS::IAM::Policy', 1); + }); + }); + + it('should match the runner configuration', () => { + expect(stacks.length).toBe(runnerConfig.runnerTypes.length); + runnerConfig.runnerTypes.forEach((type) => { + const stack = stacks.find((stack) => stack.stackName === generateASGStackName(type)); + expect(stack).toBeDefined(); + const template = Template.fromStack(stack!); + template.hasResourceProperties('AWS::EC2::LaunchTemplate', { + LaunchTemplateData: { + InstanceType: + type.platform === PlatformType.WINDOWS ? 'm5zn.metal' : type.arch === 'arm' ? 'mac2.metal' : 'mac1.metal' + } + }); + }); + }); +});