├── .gitignore ├── .npmignore ├── .prettierignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── access-token-admin-org.png ├── access-token-repo.png ├── bin └── github-actions-runner.ts ├── cdk.context.json ├── cdk.json ├── docs └── price-comparision.md ├── fargate-task-logs-in-aws-console.png ├── image ├── .dockerignore ├── Dockerfile └── entrypoint.sh ├── lib └── github-actions-runner-stack.ts ├── package-lock.json ├── package.json ├── self-hosted-runner-in-actions-settings.png └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | *.js 2 | !jest.config.js 3 | *.d.ts 4 | node_modules 5 | 6 | # CDK asset staging directory 7 | .cdk.staging 8 | cdk.out 9 | 10 | # Parcel build directories 11 | .cache 12 | .build 13 | 14 | .DS_Store -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.ts 2 | !*.d.ts 3 | 4 | # CDK asset staging directory 5 | .cdk.staging 6 | cdk.out 7 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | CHANGELOG.md 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this project will be documented in this file. 3 | 4 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 5 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 6 | 7 | ## [Unreleased] 8 | 9 | ### Added 10 | - Support for [Organization level self-hosted runners](https://github.blog/changelog/2020-04-22-github-actions-organization-level-self-hosted-runners/) 11 | 12 | ### Changed 13 | - Parameter `GITHUB_REPOSITORY_URL` renamed to `GITHUB_ACTIONS_RUNNER_CONTEXT` 14 | 15 | ### Added 16 | - Initial version of GitHub Actions Runner on AWS Fargate 17 | 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Niko Virtala 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GitHub Actions runner on AWS Fargate 2 | 3 | This repository contains an example how to run self-hosted GitHub Actions runners on AWS Fargate! 4 | 5 | ## Construct 6 | 7 | The solution presented in this repository is available as a Construct library in [NPM](https://www.npmjs.com/package/@cloudgardener/cdk-aws-fargate-github-actions-runner) and [GitHub](https://github.com/cloudgardener/cdk-aws-fargate-github-actions-runner). 8 | 9 | You can import it to your project by: 10 | 11 | ```ts 12 | import { GithubActionsRunner } from "@cloudgardener/cdk-aws-fargate-github-actions-runner"; 13 | ``` 14 | 15 | ## Docker image 16 | 17 | Docker image is based on [`ubuntu:20.04`](https://hub.docker.com/_/ubuntu) / `focal`. I may consider moving back to `ubuntu:rolling` once https://github.com/actions/runner/issues/1584 is resolved. 18 | 19 | On top the base image I have installed GitHub Actions Runner based on [About self-hosted runners](https://help.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners) in GitHub documentation. 20 | 21 | ## Deployment 22 | 23 | The application is deployed to AWS using [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html). 24 | 25 | - Store two parameters `GITHUB_ACCESS_TOKEN` and `GITHUB_ACTIONS_RUNNER_CONTEXT` in to SSM Parameter Store. 26 | - For repository level runner set `GITHUB_ACTIONS_RUNNER_CONTEXT` value to `https://github.com//` 27 | - For organization level runner set `GITHUB_ACTIONS_RUNNER_CONTEXT` value to `https://github.com/` 28 | - Run `cdk synth --profile ` 29 | - Run `cdk deploy --profile ` 30 | - Wait a little while ... 31 | 32 | Now you should be able find your self-hosted runner from repository setting in GitHub: 33 | 34 | ![](./self-hosted-runner-in-actions-settings.png "Self-hosted runner in GitHub Actions Settings") 35 | 36 | We can see also from the Fargate Task Logs that the runner is successfully registered: 37 | 38 | ![](./fargate-task-logs-in-aws-console.png "Fargate Task Logs in AWS Console") 39 | 40 | ## Personal Access Token Scopes 41 | 42 | Registering self-hosted runner to repository level requires admin access to the repository, and `repo` scope for the access token. 43 | 44 | ![](./access-token-repo.png "Settings >>> Developer settings >>> Personal access tokens") 45 | 46 | Registering self-hosted runner to Organization level requires admin access to the organization, and `admin:org` scope for the access token. 47 | 48 | ![](./access-token-admin-org.png "Settings >>> Developer settings >>> Personal access tokens") 49 | 50 | ## Price Comparision 51 | 52 | You can read about the comparisions I made from [Price Comparision](docs/price-comparision.md) document. 53 | 54 | ## Useful commands 55 | 56 | - `npm run build` compile typescript to js 57 | - `npm run watch` watch for changes and compile 58 | - `npm run test` perform the jest unit tests 59 | - `cdk deploy` deploy this stack to your default AWS account/region 60 | - `cdk diff` compare deployed stack with current state 61 | - `cdk synth` emits the synthesized CloudFormation template 62 | -------------------------------------------------------------------------------- /access-token-admin-org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikovirtala/cdk-github-actions-runner/a10f6f6e37cae06b8c2e77d6d17da53dfd72f4f4/access-token-admin-org.png -------------------------------------------------------------------------------- /access-token-repo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikovirtala/cdk-github-actions-runner/a10f6f6e37cae06b8c2e77d6d17da53dfd72f4f4/access-token-repo.png -------------------------------------------------------------------------------- /bin/github-actions-runner.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import "source-map-support/register"; 3 | import * as cdk from "aws-cdk-lib"; 4 | import { GithubActionsRunnerStack } from "../lib/github-actions-runner-stack"; 5 | 6 | const app = new cdk.App(); 7 | new GithubActionsRunnerStack(app, "GithubActionsRunnerStack", { 8 | env: { 9 | account: process.env.CDK_DEFAULT_ACCOUNT, 10 | region: process.env.CDK_DEFAULT_REGION, 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /cdk.context.json: -------------------------------------------------------------------------------- 1 | { 2 | "aws-cdk:enableDiffNoFail": "true", 3 | "availability-zones:account=827333031966:region=eu-west-1": [ 4 | "eu-west-1a", 5 | "eu-west-1b", 6 | "eu-west-1c" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /cdk.json: -------------------------------------------------------------------------------- 1 | { 2 | "app": "npx ts-node bin/github-actions-runner.ts" 3 | } 4 | -------------------------------------------------------------------------------- /docs/price-comparision.md: -------------------------------------------------------------------------------- 1 | ## Price Comparison 2 | 3 | [GitHub](https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners) hosted runners are running on Standard_DS2_v2 virtual machines in Microsoft Azure. Each virtual machine has 2 vCPUs and 7 GB of RAM. The per-hour rate for hosted Linux runner is `$0.48` (`$0.008 / minute`). 4 | 5 | [AWS Fargate pricing](https://aws.amazon.com/fargate/pricing/) has two dimensions; vCPU and memory. The per-hour rate for similarly sized Tasks (2 vCPUs and 7 GB of RAM) is `$0.112075` on on-demand capacity and `$0.0336225` on spot capacity. 6 | 7 | | Hosting | Price / hour | 8 | | ------------------------------------ | ------------ | 9 | | GitHub hosted | `$0,48` | 10 | | AWS Fargate, On-demand (`eu-west-1`) | `$0.112075` | 11 | | AWS Fargate, Spot (`eu-west-1`) | `$0.0336225` | 12 | 13 | However, the price comparison is not quite as straightforward. Each GitHub account receives a certain amount of free minutes. 14 | 15 | | Product | Free minutes / month | 16 | | ----------- | ------------------------- | 17 | | GitHub Free | 2000 min. (33,33 hours) | 18 | | GitHub Pro | 3000 min. (50 hours) | 19 | | GitHub Team | 10000 min. (166,67 hours) | 20 | | GitHub Team | 50000 min. (833,33 hours) | 21 | 22 | But if we e.g. double the hours used per month we'll start to find some differences: 23 | 24 | | Product | Paid hours / month | GitHub hosted | Fargate, On-demand | Fargate, Spot | 25 | | ----------- | ------------------ | ------------- | ------------------ | ------------- | 26 | | GitHub Free | 33,33 hours | `$16.00` | `$3.74` | `$1.12` | 27 | | GitHub Pro | 50 hours | `$24.00` | `$5.60` | `$1.68` | 28 | | GitHub Team | 166,67 hours | `$80.00` | `$18.68` | `$5.60` | 29 | | GitHub Team | 833,33 hours | `$400.00` | `$93.40` | `$28.02` | 30 | 31 | Also, taking account of the fact that GitHub also provides one size of hosted-runner, this is starting to look very interesting to me! 32 | 33 | Unfortunately AWS CDK does not support ECS Capacity Providers, and thus Fargate Spot capacity yet. :/ 34 | -------------------------------------------------------------------------------- /fargate-task-logs-in-aws-console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikovirtala/cdk-github-actions-runner/a10f6f6e37cae06b8c2e77d6d17da53dfd72f4f4/fargate-task-logs-in-aws-console.png -------------------------------------------------------------------------------- /image/.dockerignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikovirtala/cdk-github-actions-runner/a10f6f6e37cae06b8c2e77d6d17da53dfd72f4f4/image/.dockerignore -------------------------------------------------------------------------------- /image/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:20.04 2 | 3 | RUN apt-get update && apt-get install -y \ 4 | curl \ 5 | jq \ 6 | && rm -rf /var/lib/apt/lists/* 7 | 8 | RUN addgroup runner && \ 9 | adduser \ 10 | --system \ 11 | --disabled-password \ 12 | --home /home/runner \ 13 | --ingroup runner \ 14 | runner 15 | 16 | WORKDIR /home/runner 17 | 18 | RUN GITHUB_RUNNER_VERSION=${GITHUB_RUNNER_VERSION:-$(curl -s https://api.github.com/repos/actions/runner/releases/latest | jq -r .tag_name | sed 's/v//g')} \ 19 | && curl -sSLO https://github.com/actions/runner/releases/download/v${GITHUB_RUNNER_VERSION}/actions-runner-linux-x64-${GITHUB_RUNNER_VERSION}.tar.gz \ 20 | && tar -zxvf actions-runner-linux-x64-${GITHUB_RUNNER_VERSION}.tar.gz \ 21 | && rm -f actions-runner-linux-x64-${GITHUB_RUNNER_VERSION}.tar.gz \ 22 | && ./bin/installdependencies.sh \ 23 | && chown -R runner:runner /home/runner 24 | 25 | COPY entrypoint.sh entrypoint.sh 26 | 27 | USER runner 28 | 29 | ENTRYPOINT ["./entrypoint.sh"] -------------------------------------------------------------------------------- /image/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | RUNNER_NAME=${RUNNER_NAME:-default} 4 | RUNNER_WORKDIR=${RUNNER_WORKDIR:-_work} 5 | 6 | if [[ -z "${GITHUB_ACCESS_TOKEN}" || -z "${GITHUB_ACTIONS_RUNNER_CONTEXT}" ]]; then 7 | echo 'One of the mandatory parameters is missing. Quit!' 8 | exit 1 9 | else 10 | AUTH_HEADER="Authorization: token ${GITHUB_ACCESS_TOKEN}" 11 | USERNAME=$(cut -d/ -f4 <<< ${GITHUB_ACTIONS_RUNNER_CONTEXT}) 12 | REPOSITORY=$(cut -d/ -f5 <<< ${GITHUB_ACTIONS_RUNNER_CONTEXT}) 13 | 14 | if [[ -z "${REPOSITORY}" ]]; then 15 | TOKEN_REGISTRATION_URL="https://api.github.com/orgs/${USERNAME}/actions/runners/registration-token" 16 | else 17 | TOKEN_REGISTRATION_URL="https://api.github.com/repos/${USERNAME}/${REPOSITORY}/actions/runners/registration-token" 18 | fi 19 | 20 | RUNNER_TOKEN="$(curl -XPOST -fsSL \ 21 | -H "Accept: application/vnd.github.v3+json" \ 22 | -H "${AUTH_HEADER}" \ 23 | "${TOKEN_REGISTRATION_URL}" \ 24 | | jq -r '.token')" 25 | fi 26 | 27 | ./config.sh --url "${GITHUB_ACTIONS_RUNNER_CONTEXT}" --token "${RUNNER_TOKEN}" --name "${RUNNER_NAME}" --work "${RUNNER_WORKDIR}" 28 | ./run.sh 29 | -------------------------------------------------------------------------------- /lib/github-actions-runner-stack.ts: -------------------------------------------------------------------------------- 1 | import * as cdk from "aws-cdk-lib"; 2 | import * as ec2 from "aws-cdk-lib/aws-ec2"; 3 | import * as ecs from "aws-cdk-lib/aws-ecs"; 4 | import * as ssm from "aws-cdk-lib/aws-ssm"; 5 | import { Construct } from "constructs"; 6 | import path = require("path"); 7 | import { FargatePlatformVersion } from "aws-cdk-lib/aws-ecs"; 8 | 9 | export class GithubActionsRunnerStack extends cdk.Stack { 10 | constructor(scope: Construct, id: string, props?: cdk.StackProps) { 11 | super(scope, id, props); 12 | 13 | const vpc = new ec2.Vpc(this, "GitHubActionsRunnerVpc", { 14 | maxAzs: 1, // Default is all AZs in region 15 | }); 16 | 17 | const cluster = new ecs.Cluster(this, "GitHubActionsRunnerCluster", { 18 | vpc: vpc, 19 | }); 20 | 21 | const taskDefinition = new ecs.FargateTaskDefinition( 22 | this, 23 | "GitHubActionsRunnerTaskDefinition" 24 | ); 25 | 26 | taskDefinition.addContainer("GitHubActionsRunnerContainer", { 27 | image: ecs.ContainerImage.fromAsset(path.resolve(__dirname, "../image")), 28 | logging: ecs.LogDrivers.awsLogs({ streamPrefix: "GitHubActionsRunner" }), 29 | secrets: { 30 | GITHUB_ACCESS_TOKEN: ecs.Secret.fromSsmParameter( 31 | ssm.StringParameter.fromSecureStringParameterAttributes( 32 | this, 33 | "GitHubAccessToken", 34 | { 35 | parameterName: "GITHUB_ACCESS_TOKEN", 36 | version: 0, 37 | } 38 | ) 39 | ), 40 | GITHUB_ACTIONS_RUNNER_CONTEXT: ecs.Secret.fromSsmParameter( 41 | ssm.StringParameter.fromSecureStringParameterAttributes( 42 | this, 43 | "GitHubActionsRunnerContext", 44 | { 45 | parameterName: "GITHUB_ACTIONS_RUNNER_CONTEXT", 46 | version: 0, 47 | } 48 | ) 49 | ), 50 | }, 51 | }); 52 | 53 | new ecs.FargateService(this, "GitHubActionsRunnerService", { 54 | cluster, 55 | taskDefinition, 56 | platformVersion: FargatePlatformVersion.VERSION1_4, 57 | }); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "github-actions-runner", 3 | "version": "0.2.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "github-actions-runner", 9 | "version": "0.2.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "aws-cdk-lib": "^2.28.0", 13 | "constructs": "^10.1.41", 14 | "source-map-support": "^0.5.21" 15 | }, 16 | "bin": { 17 | "github-actions-runner": "bin/github-actions-runner.js" 18 | }, 19 | "devDependencies": { 20 | "@types/node": "17.0.43", 21 | "aws-cdk": "^2.28.0", 22 | "ts-node": "^10.8.1", 23 | "typescript": "^4.7.3" 24 | } 25 | }, 26 | "node_modules/@cspotcode/source-map-support": { 27 | "version": "0.8.1", 28 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 29 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 30 | "dev": true, 31 | "dependencies": { 32 | "@jridgewell/trace-mapping": "0.3.9" 33 | }, 34 | "engines": { 35 | "node": ">=12" 36 | } 37 | }, 38 | "node_modules/@jridgewell/resolve-uri": { 39 | "version": "3.0.7", 40 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", 41 | "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", 42 | "dev": true, 43 | "engines": { 44 | "node": ">=6.0.0" 45 | } 46 | }, 47 | "node_modules/@jridgewell/sourcemap-codec": { 48 | "version": "1.4.13", 49 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", 50 | "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", 51 | "dev": true 52 | }, 53 | "node_modules/@jridgewell/trace-mapping": { 54 | "version": "0.3.9", 55 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 56 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 57 | "dev": true, 58 | "dependencies": { 59 | "@jridgewell/resolve-uri": "^3.0.3", 60 | "@jridgewell/sourcemap-codec": "^1.4.10" 61 | } 62 | }, 63 | "node_modules/@tsconfig/node10": { 64 | "version": "1.0.8", 65 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", 66 | "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", 67 | "dev": true 68 | }, 69 | "node_modules/@tsconfig/node12": { 70 | "version": "1.0.9", 71 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", 72 | "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", 73 | "dev": true 74 | }, 75 | "node_modules/@tsconfig/node14": { 76 | "version": "1.0.1", 77 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", 78 | "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", 79 | "dev": true 80 | }, 81 | "node_modules/@tsconfig/node16": { 82 | "version": "1.0.2", 83 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", 84 | "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", 85 | "dev": true 86 | }, 87 | "node_modules/@types/node": { 88 | "version": "17.0.43", 89 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.43.tgz", 90 | "integrity": "sha512-jnUpgw8fL9kP2iszfIDyBQtw5Mf4/XSqy0Loc1J9pI14ejL83XcCEvSf50Gs/4ET0I9VCCDoOfufQysj0S66xA==", 91 | "dev": true 92 | }, 93 | "node_modules/acorn": { 94 | "version": "8.5.0", 95 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", 96 | "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", 97 | "dev": true, 98 | "bin": { 99 | "acorn": "bin/acorn" 100 | }, 101 | "engines": { 102 | "node": ">=0.4.0" 103 | } 104 | }, 105 | "node_modules/acorn-walk": { 106 | "version": "8.2.0", 107 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 108 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 109 | "dev": true, 110 | "engines": { 111 | "node": ">=0.4.0" 112 | } 113 | }, 114 | "node_modules/arg": { 115 | "version": "4.1.3", 116 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 117 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 118 | "dev": true 119 | }, 120 | "node_modules/aws-cdk": { 121 | "version": "2.28.0", 122 | "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.28.0.tgz", 123 | "integrity": "sha512-d8DyDBnSSLLU39XPH4I4pRF1dX5yGFYJhOR8fFBtoPbpSiE0gJgSMX4RIcNUm2V1ZKVUM8dSc/iWkf+i7+mysg==", 124 | "dev": true, 125 | "bin": { 126 | "cdk": "bin/cdk" 127 | }, 128 | "engines": { 129 | "node": ">= 14.15.0" 130 | }, 131 | "optionalDependencies": { 132 | "fsevents": "2.3.2" 133 | } 134 | }, 135 | "node_modules/aws-cdk-lib": { 136 | "version": "2.28.0", 137 | "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.28.0.tgz", 138 | "integrity": "sha512-ZAhIQ+mX2JYx8st6enan8qBzts7o+PXFJxLABIUYZSSus/ScWx9POLIVsV28LXorM4Y2su23VfWM7iVmCNxYAQ==", 139 | "bundleDependencies": [ 140 | "@balena/dockerignore", 141 | "case", 142 | "fs-extra", 143 | "ignore", 144 | "jsonschema", 145 | "minimatch", 146 | "punycode", 147 | "semver", 148 | "yaml" 149 | ], 150 | "dependencies": { 151 | "@balena/dockerignore": "^1.0.2", 152 | "case": "1.6.3", 153 | "fs-extra": "^9.1.0", 154 | "ignore": "^5.2.0", 155 | "jsonschema": "^1.4.1", 156 | "minimatch": "^3.1.2", 157 | "punycode": "^2.1.1", 158 | "semver": "^7.3.7", 159 | "yaml": "1.10.2" 160 | }, 161 | "engines": { 162 | "node": ">= 14.15.0" 163 | }, 164 | "peerDependencies": { 165 | "constructs": "^10.0.0" 166 | } 167 | }, 168 | "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { 169 | "version": "1.0.2", 170 | "inBundle": true, 171 | "license": "Apache-2.0" 172 | }, 173 | "node_modules/aws-cdk-lib/node_modules/at-least-node": { 174 | "version": "1.0.0", 175 | "inBundle": true, 176 | "license": "ISC", 177 | "engines": { 178 | "node": ">= 4.0.0" 179 | } 180 | }, 181 | "node_modules/aws-cdk-lib/node_modules/balanced-match": { 182 | "version": "1.0.2", 183 | "inBundle": true, 184 | "license": "MIT" 185 | }, 186 | "node_modules/aws-cdk-lib/node_modules/brace-expansion": { 187 | "version": "1.1.11", 188 | "inBundle": true, 189 | "license": "MIT", 190 | "dependencies": { 191 | "balanced-match": "^1.0.0", 192 | "concat-map": "0.0.1" 193 | } 194 | }, 195 | "node_modules/aws-cdk-lib/node_modules/case": { 196 | "version": "1.6.3", 197 | "inBundle": true, 198 | "license": "(MIT OR GPL-3.0-or-later)", 199 | "engines": { 200 | "node": ">= 0.8.0" 201 | } 202 | }, 203 | "node_modules/aws-cdk-lib/node_modules/concat-map": { 204 | "version": "0.0.1", 205 | "inBundle": true, 206 | "license": "MIT" 207 | }, 208 | "node_modules/aws-cdk-lib/node_modules/fs-extra": { 209 | "version": "9.1.0", 210 | "inBundle": true, 211 | "license": "MIT", 212 | "dependencies": { 213 | "at-least-node": "^1.0.0", 214 | "graceful-fs": "^4.2.0", 215 | "jsonfile": "^6.0.1", 216 | "universalify": "^2.0.0" 217 | }, 218 | "engines": { 219 | "node": ">=10" 220 | } 221 | }, 222 | "node_modules/aws-cdk-lib/node_modules/graceful-fs": { 223 | "version": "4.2.10", 224 | "inBundle": true, 225 | "license": "ISC" 226 | }, 227 | "node_modules/aws-cdk-lib/node_modules/ignore": { 228 | "version": "5.2.0", 229 | "inBundle": true, 230 | "license": "MIT", 231 | "engines": { 232 | "node": ">= 4" 233 | } 234 | }, 235 | "node_modules/aws-cdk-lib/node_modules/jsonfile": { 236 | "version": "6.1.0", 237 | "inBundle": true, 238 | "license": "MIT", 239 | "dependencies": { 240 | "universalify": "^2.0.0" 241 | }, 242 | "optionalDependencies": { 243 | "graceful-fs": "^4.1.6" 244 | } 245 | }, 246 | "node_modules/aws-cdk-lib/node_modules/jsonschema": { 247 | "version": "1.4.1", 248 | "inBundle": true, 249 | "license": "MIT", 250 | "engines": { 251 | "node": "*" 252 | } 253 | }, 254 | "node_modules/aws-cdk-lib/node_modules/lru-cache": { 255 | "version": "6.0.0", 256 | "inBundle": true, 257 | "license": "ISC", 258 | "dependencies": { 259 | "yallist": "^4.0.0" 260 | }, 261 | "engines": { 262 | "node": ">=10" 263 | } 264 | }, 265 | "node_modules/aws-cdk-lib/node_modules/minimatch": { 266 | "version": "3.1.2", 267 | "inBundle": true, 268 | "license": "ISC", 269 | "dependencies": { 270 | "brace-expansion": "^1.1.7" 271 | }, 272 | "engines": { 273 | "node": "*" 274 | } 275 | }, 276 | "node_modules/aws-cdk-lib/node_modules/punycode": { 277 | "version": "2.1.1", 278 | "inBundle": true, 279 | "license": "MIT", 280 | "engines": { 281 | "node": ">=6" 282 | } 283 | }, 284 | "node_modules/aws-cdk-lib/node_modules/semver": { 285 | "version": "7.3.7", 286 | "inBundle": true, 287 | "license": "ISC", 288 | "dependencies": { 289 | "lru-cache": "^6.0.0" 290 | }, 291 | "bin": { 292 | "semver": "bin/semver.js" 293 | }, 294 | "engines": { 295 | "node": ">=10" 296 | } 297 | }, 298 | "node_modules/aws-cdk-lib/node_modules/universalify": { 299 | "version": "2.0.0", 300 | "inBundle": true, 301 | "license": "MIT", 302 | "engines": { 303 | "node": ">= 10.0.0" 304 | } 305 | }, 306 | "node_modules/aws-cdk-lib/node_modules/yallist": { 307 | "version": "4.0.0", 308 | "inBundle": true, 309 | "license": "ISC" 310 | }, 311 | "node_modules/aws-cdk-lib/node_modules/yaml": { 312 | "version": "1.10.2", 313 | "inBundle": true, 314 | "license": "ISC", 315 | "engines": { 316 | "node": ">= 6" 317 | } 318 | }, 319 | "node_modules/buffer-from": { 320 | "version": "1.1.1", 321 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 322 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 323 | }, 324 | "node_modules/constructs": { 325 | "version": "10.1.41", 326 | "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.41.tgz", 327 | "integrity": "sha512-9fvkjvMHHLYgUpB/zFCpaUysokdTM7hwIvkfBJwXJsxl4Hwwt9z0otHM/hotkqEteR3LdYmmVpJCze+V4MvGhQ==", 328 | "engines": { 329 | "node": ">= 14.17.0" 330 | } 331 | }, 332 | "node_modules/create-require": { 333 | "version": "1.1.1", 334 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 335 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 336 | "dev": true 337 | }, 338 | "node_modules/fsevents": { 339 | "version": "2.3.2", 340 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 341 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 342 | "dev": true, 343 | "hasInstallScript": true, 344 | "optional": true, 345 | "os": [ 346 | "darwin" 347 | ], 348 | "engines": { 349 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 350 | } 351 | }, 352 | "node_modules/make-error": { 353 | "version": "1.3.6", 354 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 355 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 356 | "dev": true 357 | }, 358 | "node_modules/source-map": { 359 | "version": "0.6.1", 360 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 361 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 362 | "engines": { 363 | "node": ">=0.10.0" 364 | } 365 | }, 366 | "node_modules/source-map-support": { 367 | "version": "0.5.21", 368 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 369 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 370 | "dependencies": { 371 | "buffer-from": "^1.0.0", 372 | "source-map": "^0.6.0" 373 | } 374 | }, 375 | "node_modules/ts-node": { 376 | "version": "10.8.1", 377 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.1.tgz", 378 | "integrity": "sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==", 379 | "dev": true, 380 | "dependencies": { 381 | "@cspotcode/source-map-support": "^0.8.0", 382 | "@tsconfig/node10": "^1.0.7", 383 | "@tsconfig/node12": "^1.0.7", 384 | "@tsconfig/node14": "^1.0.0", 385 | "@tsconfig/node16": "^1.0.2", 386 | "acorn": "^8.4.1", 387 | "acorn-walk": "^8.1.1", 388 | "arg": "^4.1.0", 389 | "create-require": "^1.1.0", 390 | "diff": "^4.0.1", 391 | "make-error": "^1.1.1", 392 | "v8-compile-cache-lib": "^3.0.1", 393 | "yn": "3.1.1" 394 | }, 395 | "bin": { 396 | "ts-node": "dist/bin.js", 397 | "ts-node-cwd": "dist/bin-cwd.js", 398 | "ts-node-esm": "dist/bin-esm.js", 399 | "ts-node-script": "dist/bin-script.js", 400 | "ts-node-transpile-only": "dist/bin-transpile.js", 401 | "ts-script": "dist/bin-script-deprecated.js" 402 | }, 403 | "peerDependencies": { 404 | "@swc/core": ">=1.2.50", 405 | "@swc/wasm": ">=1.2.50", 406 | "@types/node": "*", 407 | "typescript": ">=2.7" 408 | }, 409 | "peerDependenciesMeta": { 410 | "@swc/core": { 411 | "optional": true 412 | }, 413 | "@swc/wasm": { 414 | "optional": true 415 | } 416 | } 417 | }, 418 | "node_modules/ts-node/node_modules/diff": { 419 | "version": "4.0.2", 420 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 421 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 422 | "dev": true, 423 | "engines": { 424 | "node": ">=0.3.1" 425 | } 426 | }, 427 | "node_modules/typescript": { 428 | "version": "4.7.3", 429 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz", 430 | "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", 431 | "dev": true, 432 | "bin": { 433 | "tsc": "bin/tsc", 434 | "tsserver": "bin/tsserver" 435 | }, 436 | "engines": { 437 | "node": ">=4.2.0" 438 | } 439 | }, 440 | "node_modules/v8-compile-cache-lib": { 441 | "version": "3.0.1", 442 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 443 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 444 | "dev": true 445 | }, 446 | "node_modules/yn": { 447 | "version": "3.1.1", 448 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 449 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 450 | "dev": true, 451 | "engines": { 452 | "node": ">=6" 453 | } 454 | } 455 | }, 456 | "dependencies": { 457 | "@cspotcode/source-map-support": { 458 | "version": "0.8.1", 459 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 460 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 461 | "dev": true, 462 | "requires": { 463 | "@jridgewell/trace-mapping": "0.3.9" 464 | } 465 | }, 466 | "@jridgewell/resolve-uri": { 467 | "version": "3.0.7", 468 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", 469 | "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", 470 | "dev": true 471 | }, 472 | "@jridgewell/sourcemap-codec": { 473 | "version": "1.4.13", 474 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", 475 | "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", 476 | "dev": true 477 | }, 478 | "@jridgewell/trace-mapping": { 479 | "version": "0.3.9", 480 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 481 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 482 | "dev": true, 483 | "requires": { 484 | "@jridgewell/resolve-uri": "^3.0.3", 485 | "@jridgewell/sourcemap-codec": "^1.4.10" 486 | } 487 | }, 488 | "@tsconfig/node10": { 489 | "version": "1.0.8", 490 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", 491 | "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", 492 | "dev": true 493 | }, 494 | "@tsconfig/node12": { 495 | "version": "1.0.9", 496 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", 497 | "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", 498 | "dev": true 499 | }, 500 | "@tsconfig/node14": { 501 | "version": "1.0.1", 502 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", 503 | "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", 504 | "dev": true 505 | }, 506 | "@tsconfig/node16": { 507 | "version": "1.0.2", 508 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", 509 | "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", 510 | "dev": true 511 | }, 512 | "@types/node": { 513 | "version": "17.0.43", 514 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.43.tgz", 515 | "integrity": "sha512-jnUpgw8fL9kP2iszfIDyBQtw5Mf4/XSqy0Loc1J9pI14ejL83XcCEvSf50Gs/4ET0I9VCCDoOfufQysj0S66xA==", 516 | "dev": true 517 | }, 518 | "acorn": { 519 | "version": "8.5.0", 520 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", 521 | "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", 522 | "dev": true 523 | }, 524 | "acorn-walk": { 525 | "version": "8.2.0", 526 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 527 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 528 | "dev": true 529 | }, 530 | "arg": { 531 | "version": "4.1.3", 532 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 533 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 534 | "dev": true 535 | }, 536 | "aws-cdk": { 537 | "version": "2.28.0", 538 | "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.28.0.tgz", 539 | "integrity": "sha512-d8DyDBnSSLLU39XPH4I4pRF1dX5yGFYJhOR8fFBtoPbpSiE0gJgSMX4RIcNUm2V1ZKVUM8dSc/iWkf+i7+mysg==", 540 | "dev": true, 541 | "requires": { 542 | "fsevents": "2.3.2" 543 | } 544 | }, 545 | "aws-cdk-lib": { 546 | "version": "2.28.0", 547 | "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.28.0.tgz", 548 | "integrity": "sha512-ZAhIQ+mX2JYx8st6enan8qBzts7o+PXFJxLABIUYZSSus/ScWx9POLIVsV28LXorM4Y2su23VfWM7iVmCNxYAQ==", 549 | "requires": { 550 | "@balena/dockerignore": "^1.0.2", 551 | "case": "1.6.3", 552 | "fs-extra": "^9.1.0", 553 | "ignore": "^5.2.0", 554 | "jsonschema": "^1.4.1", 555 | "minimatch": "^3.1.2", 556 | "punycode": "^2.1.1", 557 | "semver": "^7.3.7", 558 | "yaml": "1.10.2" 559 | }, 560 | "dependencies": { 561 | "@balena/dockerignore": { 562 | "version": "1.0.2", 563 | "bundled": true 564 | }, 565 | "at-least-node": { 566 | "version": "1.0.0", 567 | "bundled": true 568 | }, 569 | "balanced-match": { 570 | "version": "1.0.2", 571 | "bundled": true 572 | }, 573 | "brace-expansion": { 574 | "version": "1.1.11", 575 | "bundled": true, 576 | "requires": { 577 | "balanced-match": "^1.0.0", 578 | "concat-map": "0.0.1" 579 | } 580 | }, 581 | "case": { 582 | "version": "1.6.3", 583 | "bundled": true 584 | }, 585 | "concat-map": { 586 | "version": "0.0.1", 587 | "bundled": true 588 | }, 589 | "fs-extra": { 590 | "version": "9.1.0", 591 | "bundled": true, 592 | "requires": { 593 | "at-least-node": "^1.0.0", 594 | "graceful-fs": "^4.2.0", 595 | "jsonfile": "^6.0.1", 596 | "universalify": "^2.0.0" 597 | } 598 | }, 599 | "graceful-fs": { 600 | "version": "4.2.10", 601 | "bundled": true 602 | }, 603 | "ignore": { 604 | "version": "5.2.0", 605 | "bundled": true 606 | }, 607 | "jsonfile": { 608 | "version": "6.1.0", 609 | "bundled": true, 610 | "requires": { 611 | "graceful-fs": "^4.1.6", 612 | "universalify": "^2.0.0" 613 | } 614 | }, 615 | "jsonschema": { 616 | "version": "1.4.1", 617 | "bundled": true 618 | }, 619 | "lru-cache": { 620 | "version": "6.0.0", 621 | "bundled": true, 622 | "requires": { 623 | "yallist": "^4.0.0" 624 | } 625 | }, 626 | "minimatch": { 627 | "version": "3.1.2", 628 | "bundled": true, 629 | "requires": { 630 | "brace-expansion": "^1.1.7" 631 | } 632 | }, 633 | "punycode": { 634 | "version": "2.1.1", 635 | "bundled": true 636 | }, 637 | "semver": { 638 | "version": "7.3.7", 639 | "bundled": true, 640 | "requires": { 641 | "lru-cache": "^6.0.0" 642 | } 643 | }, 644 | "universalify": { 645 | "version": "2.0.0", 646 | "bundled": true 647 | }, 648 | "yallist": { 649 | "version": "4.0.0", 650 | "bundled": true 651 | }, 652 | "yaml": { 653 | "version": "1.10.2", 654 | "bundled": true 655 | } 656 | } 657 | }, 658 | "buffer-from": { 659 | "version": "1.1.1", 660 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 661 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 662 | }, 663 | "constructs": { 664 | "version": "10.1.41", 665 | "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.41.tgz", 666 | "integrity": "sha512-9fvkjvMHHLYgUpB/zFCpaUysokdTM7hwIvkfBJwXJsxl4Hwwt9z0otHM/hotkqEteR3LdYmmVpJCze+V4MvGhQ==" 667 | }, 668 | "create-require": { 669 | "version": "1.1.1", 670 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 671 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 672 | "dev": true 673 | }, 674 | "fsevents": { 675 | "version": "2.3.2", 676 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 677 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 678 | "dev": true, 679 | "optional": true 680 | }, 681 | "make-error": { 682 | "version": "1.3.6", 683 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 684 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 685 | "dev": true 686 | }, 687 | "source-map": { 688 | "version": "0.6.1", 689 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 690 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 691 | }, 692 | "source-map-support": { 693 | "version": "0.5.21", 694 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 695 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 696 | "requires": { 697 | "buffer-from": "^1.0.0", 698 | "source-map": "^0.6.0" 699 | } 700 | }, 701 | "ts-node": { 702 | "version": "10.8.1", 703 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.1.tgz", 704 | "integrity": "sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==", 705 | "dev": true, 706 | "requires": { 707 | "@cspotcode/source-map-support": "^0.8.0", 708 | "@tsconfig/node10": "^1.0.7", 709 | "@tsconfig/node12": "^1.0.7", 710 | "@tsconfig/node14": "^1.0.0", 711 | "@tsconfig/node16": "^1.0.2", 712 | "acorn": "^8.4.1", 713 | "acorn-walk": "^8.1.1", 714 | "arg": "^4.1.0", 715 | "create-require": "^1.1.0", 716 | "diff": "^4.0.1", 717 | "make-error": "^1.1.1", 718 | "v8-compile-cache-lib": "^3.0.1", 719 | "yn": "3.1.1" 720 | }, 721 | "dependencies": { 722 | "diff": { 723 | "version": "4.0.2", 724 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 725 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 726 | "dev": true 727 | } 728 | } 729 | }, 730 | "typescript": { 731 | "version": "4.7.3", 732 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz", 733 | "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", 734 | "dev": true 735 | }, 736 | "v8-compile-cache-lib": { 737 | "version": "3.0.1", 738 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 739 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 740 | "dev": true 741 | }, 742 | "yn": { 743 | "version": "3.1.1", 744 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 745 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 746 | "dev": true 747 | } 748 | } 749 | } 750 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "github-actions-runner", 3 | "version": "0.2.0", 4 | "repository": { 5 | "type": "git", 6 | "url": "https://github.com/nikovirtala/cdk-github-actions-runner.git" 7 | }, 8 | "license": "MIT", 9 | "author": { 10 | "name": "Niko Virtala", 11 | "email": "niko.virtala@hey.com", 12 | "organization": false 13 | }, 14 | "bin": { 15 | "github-actions-runner": "bin/github-actions-runner.js" 16 | }, 17 | "scripts": { 18 | "build": "tsc", 19 | "watch": "tsc -w", 20 | "cdk": "cdk" 21 | }, 22 | "devDependencies": { 23 | "@types/node": "17.0.43", 24 | "aws-cdk": "^2.28.0", 25 | "ts-node": "^10.8.1", 26 | "typescript": "^4.7.3" 27 | }, 28 | "dependencies": { 29 | "aws-cdk-lib": "^2.28.0", 30 | "constructs": "^10.1.41", 31 | "source-map-support": "^0.5.21" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /self-hosted-runner-in-actions-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nikovirtala/cdk-github-actions-runner/a10f6f6e37cae06b8c2e77d6d17da53dfd72f4f4/self-hosted-runner-in-actions-settings.png -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target":"ES2018", 4 | "module": "commonjs", 5 | "lib": ["es2018"], 6 | "declaration": true, 7 | "strict": true, 8 | "noImplicitAny": true, 9 | "strictNullChecks": true, 10 | "noImplicitThis": true, 11 | "alwaysStrict": true, 12 | "noUnusedLocals": false, 13 | "noUnusedParameters": false, 14 | "noImplicitReturns": true, 15 | "noFallthroughCasesInSwitch": false, 16 | "inlineSourceMap": true, 17 | "inlineSources": true, 18 | "experimentalDecorators": true, 19 | "strictPropertyInitialization":false, 20 | "typeRoots": ["./node_modules/@types"] 21 | }, 22 | "exclude": ["cdk.out"] 23 | } 24 | --------------------------------------------------------------------------------