@aws-cdk-testing/cli-integ 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/NOTICE +16 -0
- package/README.md +151 -0
- package/bin/apply-patches +19 -0
- package/bin/download-and-run-old-tests +52 -0
- package/bin/query-github +2 -0
- package/bin/query-github.d.ts +1 -0
- package/bin/query-github.js +55 -0
- package/bin/run-suite +2 -0
- package/bin/run-suite.d.ts +1 -0
- package/bin/run-suite.js +126 -0
- package/bin/stage-distribution +2 -0
- package/bin/stage-distribution.d.ts +1 -0
- package/bin/stage-distribution.js +209 -0
- package/bin/test-root +2 -0
- package/bin/test-root.d.ts +1 -0
- package/bin/test-root.js +6 -0
- package/entrypoints/test-cli-regression-against-current-code.sh +11 -0
- package/entrypoints/test-cli-regression-against-latest-release.sh +11 -0
- package/entrypoints/test-cli-regression.bash +83 -0
- package/entrypoints/test.sh +12 -0
- package/lib/aws.d.ts +55 -0
- package/lib/aws.js +243 -0
- package/lib/corking.d.ts +13 -0
- package/lib/corking.js +34 -0
- package/lib/files.d.ts +15 -0
- package/lib/files.js +80 -0
- package/lib/github.d.ts +4 -0
- package/lib/github.js +43 -0
- package/lib/index.d.ts +12 -0
- package/lib/index.js +25 -0
- package/lib/integ-test.d.ts +11 -0
- package/lib/integ-test.js +55 -0
- package/lib/lists.d.ts +1 -0
- package/lib/lists.js +12 -0
- package/lib/memoize.d.ts +6 -0
- package/lib/memoize.js +19 -0
- package/lib/npm.d.ts +4 -0
- package/lib/npm.js +15 -0
- package/lib/package-sources/release-source.d.ts +22 -0
- package/lib/package-sources/release-source.js +67 -0
- package/lib/package-sources/repo-source.d.ts +23 -0
- package/lib/package-sources/repo-source.js +92 -0
- package/lib/package-sources/repo-tools/npm +2 -0
- package/lib/package-sources/repo-tools/npm.d.ts +1 -0
- package/lib/package-sources/repo-tools/npm.js +42 -0
- package/lib/package-sources/source.d.ts +24 -0
- package/lib/package-sources/source.js +3 -0
- package/lib/package-sources/subprocess.d.ts +3 -0
- package/lib/package-sources/subprocess.js +18 -0
- package/lib/resource-pool.d.ts +54 -0
- package/lib/resource-pool.js +120 -0
- package/lib/resources.d.ts +1 -0
- package/lib/resources.js +6 -0
- package/lib/shell.d.ts +59 -0
- package/lib/shell.js +118 -0
- package/lib/staging/codeartifact.d.ts +44 -0
- package/lib/staging/codeartifact.js +258 -0
- package/lib/staging/maven.d.ts +5 -0
- package/lib/staging/maven.js +83 -0
- package/lib/staging/npm.d.ts +4 -0
- package/lib/staging/npm.js +56 -0
- package/lib/staging/nuget.d.ts +4 -0
- package/lib/staging/nuget.js +71 -0
- package/lib/staging/parallel-shell.d.ts +6 -0
- package/lib/staging/parallel-shell.js +46 -0
- package/lib/staging/pypi.d.ts +4 -0
- package/lib/staging/pypi.js +49 -0
- package/lib/staging/usage-dir.d.ts +31 -0
- package/lib/staging/usage-dir.js +87 -0
- package/lib/with-aws.d.ts +13 -0
- package/lib/with-aws.js +60 -0
- package/lib/with-cdk-app.d.ts +146 -0
- package/lib/with-cdk-app.js +398 -0
- package/lib/with-packages.d.ts +5 -0
- package/lib/with-packages.js +14 -0
- package/lib/with-sam.d.ts +33 -0
- package/lib/with-sam.js +240 -0
- package/lib/with-temporary-directory.d.ts +5 -0
- package/lib/with-temporary-directory.js +32 -0
- package/lib/xpmutex.d.ts +43 -0
- package/lib/xpmutex.js +207 -0
- package/package.json +73 -0
- package/resources/cdk-apps/app/app.js +463 -0
- package/resources/cdk-apps/app/cdk.json +7 -0
- package/resources/cdk-apps/app/docker/Dockerfile +2 -0
- package/resources/cdk-apps/app/docker/Dockerfile.Custom +2 -0
- package/resources/cdk-apps/app/lambda/index.js +4 -0
- package/resources/cdk-apps/app/lambda/response.json +3 -0
- package/resources/cdk-apps/app/nested-stack.js +49 -0
- package/resources/cdk-apps/cfn-include-app/.gitignore +1 -0
- package/resources/cdk-apps/cfn-include-app/cdk.json +4 -0
- package/resources/cdk-apps/cfn-include-app/cfn-include-app.js +21 -0
- package/resources/cdk-apps/cfn-include-app/example-template.json +13 -0
- package/resources/cdk-apps/sam_cdk_integ_app/bin/test-app.js +11 -0
- package/resources/cdk-apps/sam_cdk_integ_app/cdk.json +6 -0
- package/resources/cdk-apps/sam_cdk_integ_app/lib/nested-stack.js +19 -0
- package/resources/cdk-apps/sam_cdk_integ_app/lib/test-stack.js +134 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/.no-packagejson-validator +0 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/Dockerfile +9 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/app.js +22 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/package.json +18 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/go.mod +5 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/go.sum +17 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/main.go +17 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/.no-packagejson-validator +0 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/app.ts +16 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/package-lock.json +12 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/package.json +5 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/python/Function/app.py +15 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/python/Function/requirements.txt +1 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/python/Layer/layer_version_dependency.py +5 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/python/Layer/requirements.txt +1 -0
- package/resources/cdk-apps/sam_cdk_integ_app/src/rest-api-definition.yaml +12 -0
- package/resources/cli-regression-patches/v1.119.0/NOTES.md +5 -0
- package/resources/cli-regression-patches/v1.119.0/cli.integtest.js +659 -0
- package/resources/cli-regression-patches/v1.130.0/NOTES.md +12 -0
- package/resources/cli-regression-patches/v1.130.0/app/app.js +378 -0
- package/resources/cli-regression-patches/v1.130.0/bootstrapping.integtest.js +220 -0
- package/resources/cli-regression-patches/v1.44.0/NOTES.md +18 -0
- package/resources/cli-regression-patches/v1.44.0/bootstrapping.integtest.js +126 -0
- package/resources/cli-regression-patches/v1.44.0/test.sh +26 -0
- package/resources/cli-regression-patches/v1.61.1/NOTES.md +2 -0
- package/resources/cli-regression-patches/v1.61.1/skip-tests.txt +16 -0
- package/resources/cli-regression-patches/v1.62.0/NOTES.md +2 -0
- package/resources/cli-regression-patches/v1.62.0/aws-helpers.js +245 -0
- package/resources/cli-regression-patches/v1.63.0/NOTES.md +1 -0
- package/resources/cli-regression-patches/v1.63.0/skip-tests.txt +7 -0
- package/resources/cli-regression-patches/v1.64.0/NOTES.md +3 -0
- package/resources/cli-regression-patches/v1.64.0/cdk-helpers.js +325 -0
- package/resources/cli-regression-patches/v1.64.0/cli.integtest.js +599 -0
- package/resources/cli-regression-patches/v1.64.1/NOTES.md +3 -0
- package/resources/cli-regression-patches/v1.64.1/cdk-helpers.js +324 -0
- package/resources/cli-regression-patches/v1.64.1/cli.integtest.js +599 -0
- package/resources/cli-regression-patches/v1.67.0/NOTES.md +2 -0
- package/resources/cli-regression-patches/v1.67.0/cdk-helpers.js +331 -0
- package/resources/cloud-assemblies/0.36.0/InitStack.template.json +1 -0
- package/resources/cloud-assemblies/0.36.0/manifest.json +19 -0
- package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/InitStack.template.json +2 -0
- package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/manifest.json.js +37 -0
- package/resources/cloud-assemblies/1.10.0-request-azs/InitStack.template.json +2 -0
- package/resources/cloud-assemblies/1.10.0-request-azs/manifest.json.js +34 -0
- package/resources/integ.jest.config.js +25 -0
- package/skip-tests.txt +8 -0
- package/tests/cli-integ-tests/README.md +47 -0
- package/tests/cli-integ-tests/bootstrapping.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/bootstrapping.integtest.js +271 -0
- package/tests/cli-integ-tests/cli.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/cli.integtest.js +1029 -0
- package/tests/init-csharp/init-csharp.integtest.d.ts +1 -0
- package/tests/init-csharp/init-csharp.integtest.js +14 -0
- package/tests/init-fsharp/init-fsharp.integtest.d.ts +1 -0
- package/tests/init-fsharp/init-fsharp.integtest.js +14 -0
- package/tests/init-java/init-java.integtest.d.ts +1 -0
- package/tests/init-java/init-java.integtest.js +14 -0
- package/tests/init-javascript/init-javascript.integtest.d.ts +1 -0
- package/tests/init-javascript/init-javascript.integtest.js +15 -0
- package/tests/init-python/init-python.integtest.d.ts +1 -0
- package/tests/init-python/init-python.integtest.js +19 -0
- package/tests/init-typescript-app/init-typescript-app.integtest.d.ts +1 -0
- package/tests/init-typescript-app/init-typescript-app.integtest.js +49 -0
- package/tests/init-typescript-lib/init-typescript-lib.integtest.d.ts +1 -0
- package/tests/init-typescript-lib/init-typescript-lib.integtest.js +13 -0
- package/tests/uberpackage/uberpackage.integtest.d.ts +1 -0
- package/tests/uberpackage/uberpackage.integtest.js +11 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.uploadNpmPackages = exports.npmLogin = void 0;
|
|
4
|
+
/* eslint-disable no-console */
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const files_1 = require("../files");
|
|
7
|
+
const shell_1 = require("../shell");
|
|
8
|
+
const parallel_shell_1 = require("./parallel-shell");
|
|
9
|
+
async function npmLogin(login, usageDir) {
|
|
10
|
+
// Creating an ~/.npmrc that references an envvar is what you're supposed to do. (https://docs.npmjs.com/private-modules/ci-server-config)
|
|
11
|
+
await writeNpmLoginToken(usageDir, login.npmEndpoint, '${NPM_TOKEN}');
|
|
12
|
+
// Add variables to env file
|
|
13
|
+
await usageDir.addToEnv(npmEnv(usageDir, login));
|
|
14
|
+
}
|
|
15
|
+
exports.npmLogin = npmLogin;
|
|
16
|
+
function npmEnv(usageDir, login) {
|
|
17
|
+
return {
|
|
18
|
+
npm_config_userconfig: path.join(usageDir.directory, '.npmrc'),
|
|
19
|
+
npm_config_registry: login.npmEndpoint,
|
|
20
|
+
npm_config_always_auth: 'true',
|
|
21
|
+
NPM_TOKEN: login.authToken,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async function uploadNpmPackages(packages, login, usageDir) {
|
|
25
|
+
await parallel_shell_1.parallelShell(packages, async (pkg, output) => {
|
|
26
|
+
console.log(`⏳ ${pkg}`);
|
|
27
|
+
// path.resolve() is required -- if the filename ends up looking like `js/bla.tgz` then NPM thinks it's a short form GitHub name.
|
|
28
|
+
await shell_1.shell(['node', require.resolve('npm'), 'publish', path.resolve(pkg)], {
|
|
29
|
+
modEnv: npmEnv(usageDir, login),
|
|
30
|
+
show: 'error',
|
|
31
|
+
output,
|
|
32
|
+
});
|
|
33
|
+
console.log(`✅ ${pkg}`);
|
|
34
|
+
}, (pkg, output) => {
|
|
35
|
+
if (output.toString().includes('code EPUBLISHCONFLICT')) {
|
|
36
|
+
console.log(`❌ ${pkg}: already exists. Skipped.`);
|
|
37
|
+
return 'skip';
|
|
38
|
+
}
|
|
39
|
+
if (output.toString().includes('code EPRIVATE')) {
|
|
40
|
+
console.log(`❌ ${pkg}: is private. Skipped.`);
|
|
41
|
+
return 'skip';
|
|
42
|
+
}
|
|
43
|
+
return 'fail';
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
exports.uploadNpmPackages = uploadNpmPackages;
|
|
47
|
+
async function writeNpmLoginToken(usageDir, endpoint, token) {
|
|
48
|
+
const rcFile = path.join(usageDir.directory, '.npmrc');
|
|
49
|
+
const lines = await files_1.loadLines(rcFile);
|
|
50
|
+
const key = `${endpoint.replace(/^https:/, '')}:_authToken`;
|
|
51
|
+
files_1.updateIniKey(lines, key, token);
|
|
52
|
+
await files_1.writeLines(rcFile, lines);
|
|
53
|
+
return rcFile;
|
|
54
|
+
}
|
|
55
|
+
// Environment variable, .npmrc in same directory as package.json or in home dir
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibnBtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUErQjtBQUMvQiw2QkFBNkI7QUFDN0Isb0NBQStEO0FBQy9ELG9DQUFpQztBQUVqQyxxREFBaUQ7QUFHMUMsS0FBSyxVQUFVLFFBQVEsQ0FBQyxLQUF1QixFQUFFLFFBQWtCO0lBQ3hFLDBJQUEwSTtJQUMxSSxNQUFNLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBRXRFLDRCQUE0QjtJQUM1QixNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFORCw0QkFNQztBQUVELFNBQVMsTUFBTSxDQUFDLFFBQWtCLEVBQUUsS0FBdUI7SUFDekQsT0FBTztRQUNMLHFCQUFxQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUM7UUFDOUQsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLFdBQVc7UUFDdEMsc0JBQXNCLEVBQUUsTUFBTTtRQUM5QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7S0FDM0IsQ0FBQztBQUNKLENBQUM7QUFFTSxLQUFLLFVBQVUsaUJBQWlCLENBQUMsUUFBa0IsRUFBRSxLQUF1QixFQUFFLFFBQWtCO0lBQ3JHLE1BQU0sOEJBQWEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztRQUV4QixpSUFBaUk7UUFDakksTUFBTSxhQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQzFFLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQztZQUMvQixJQUFJLEVBQUUsT0FBTztZQUNiLE1BQU07U0FDUCxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMxQixDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDakIsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLEVBQUU7WUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsNEJBQTRCLENBQUMsQ0FBQztZQUNsRCxPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLHdCQUF3QixDQUFDLENBQUM7WUFDOUMsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQXZCRCw4Q0F1QkM7QUFFRCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsUUFBa0IsRUFBRSxRQUFnQixFQUFFLEtBQWE7SUFDbkYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sS0FBSyxHQUFHLE1BQU0saUJBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV0QyxNQUFNLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUM7SUFDNUQsb0JBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRWhDLE1BQU0sa0JBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEMsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELGdGQUFnRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyB1cGRhdGVJbmlLZXksIGxvYWRMaW5lcywgd3JpdGVMaW5lcyB9IGZyb20gJy4uL2ZpbGVzJztcbmltcG9ydCB7IHNoZWxsIH0gZnJvbSAnLi4vc2hlbGwnO1xuaW1wb3J0IHsgTG9naW5JbmZvcm1hdGlvbiB9IGZyb20gJy4vY29kZWFydGlmYWN0JztcbmltcG9ydCB7IHBhcmFsbGVsU2hlbGwgfSBmcm9tICcuL3BhcmFsbGVsLXNoZWxsJztcbmltcG9ydCB7IFVzYWdlRGlyIH0gZnJvbSAnLi91c2FnZS1kaXInO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbnBtTG9naW4obG9naW46IExvZ2luSW5mb3JtYXRpb24sIHVzYWdlRGlyOiBVc2FnZURpcikge1xuICAvLyBDcmVhdGluZyBhbiB+Ly5ucG1yYyB0aGF0IHJlZmVyZW5jZXMgYW4gZW52dmFyIGlzIHdoYXQgeW91J3JlIHN1cHBvc2VkIHRvIGRvLiAoaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9wcml2YXRlLW1vZHVsZXMvY2ktc2VydmVyLWNvbmZpZylcbiAgYXdhaXQgd3JpdGVOcG1Mb2dpblRva2VuKHVzYWdlRGlyLCBsb2dpbi5ucG1FbmRwb2ludCwgJyR7TlBNX1RPS0VOfScpO1xuXG4gIC8vIEFkZCB2YXJpYWJsZXMgdG8gZW52IGZpbGVcbiAgYXdhaXQgdXNhZ2VEaXIuYWRkVG9FbnYobnBtRW52KHVzYWdlRGlyLCBsb2dpbikpO1xufVxuXG5mdW5jdGlvbiBucG1FbnYodXNhZ2VEaXI6IFVzYWdlRGlyLCBsb2dpbjogTG9naW5JbmZvcm1hdGlvbikge1xuICByZXR1cm4ge1xuICAgIG5wbV9jb25maWdfdXNlcmNvbmZpZzogcGF0aC5qb2luKHVzYWdlRGlyLmRpcmVjdG9yeSwgJy5ucG1yYycpLFxuICAgIG5wbV9jb25maWdfcmVnaXN0cnk6IGxvZ2luLm5wbUVuZHBvaW50LFxuICAgIG5wbV9jb25maWdfYWx3YXlzX2F1dGg6ICd0cnVlJywgLy8gTmVjZXNzYXJ5IGZvciBOUE0gNiwgb3RoZXJ3aXNlIGl0IHdpbGwgc29tZXRpbWVzIG5vdCBwYXNzIHRoZSB0b2tlblxuICAgIE5QTV9UT0tFTjogbG9naW4uYXV0aFRva2VuLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBsb2FkTnBtUGFja2FnZXMocGFja2FnZXM6IHN0cmluZ1tdLCBsb2dpbjogTG9naW5JbmZvcm1hdGlvbiwgdXNhZ2VEaXI6IFVzYWdlRGlyKSB7XG4gIGF3YWl0IHBhcmFsbGVsU2hlbGwocGFja2FnZXMsIGFzeW5jIChwa2csIG91dHB1dCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGDij7MgJHtwa2d9YCk7XG5cbiAgICAvLyBwYXRoLnJlc29sdmUoKSBpcyByZXF1aXJlZCAtLSBpZiB0aGUgZmlsZW5hbWUgZW5kcyB1cCBsb29raW5nIGxpa2UgYGpzL2JsYS50Z3pgIHRoZW4gTlBNIHRoaW5rcyBpdCdzIGEgc2hvcnQgZm9ybSBHaXRIdWIgbmFtZS5cbiAgICBhd2FpdCBzaGVsbChbJ25vZGUnLCByZXF1aXJlLnJlc29sdmUoJ25wbScpLCAncHVibGlzaCcsIHBhdGgucmVzb2x2ZShwa2cpXSwge1xuICAgICAgbW9kRW52OiBucG1FbnYodXNhZ2VEaXIsIGxvZ2luKSxcbiAgICAgIHNob3c6ICdlcnJvcicsXG4gICAgICBvdXRwdXQsXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhg4pyFICR7cGtnfWApO1xuICB9LCAocGtnLCBvdXRwdXQpID0+IHtcbiAgICBpZiAob3V0cHV0LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ2NvZGUgRVBVQkxJU0hDT05GTElDVCcpKSB7XG4gICAgICBjb25zb2xlLmxvZyhg4p2MICR7cGtnfTogYWxyZWFkeSBleGlzdHMuIFNraXBwZWQuYCk7XG4gICAgICByZXR1cm4gJ3NraXAnO1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ2NvZGUgRVBSSVZBVEUnKSkge1xuICAgICAgY29uc29sZS5sb2coYOKdjCAke3BrZ306IGlzIHByaXZhdGUuIFNraXBwZWQuYCk7XG4gICAgICByZXR1cm4gJ3NraXAnO1xuICAgIH1cbiAgICByZXR1cm4gJ2ZhaWwnO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVOcG1Mb2dpblRva2VuKHVzYWdlRGlyOiBVc2FnZURpciwgZW5kcG9pbnQ6IHN0cmluZywgdG9rZW46IHN0cmluZykge1xuICBjb25zdCByY0ZpbGUgPSBwYXRoLmpvaW4odXNhZ2VEaXIuZGlyZWN0b3J5LCAnLm5wbXJjJyk7XG4gIGNvbnN0IGxpbmVzID0gYXdhaXQgbG9hZExpbmVzKHJjRmlsZSk7XG5cbiAgY29uc3Qga2V5ID0gYCR7ZW5kcG9pbnQucmVwbGFjZSgvXmh0dHBzOi8sICcnKX06X2F1dGhUb2tlbmA7XG4gIHVwZGF0ZUluaUtleShsaW5lcywga2V5LCB0b2tlbik7XG5cbiAgYXdhaXQgd3JpdGVMaW5lcyhyY0ZpbGUsIGxpbmVzKTtcbiAgcmV0dXJuIHJjRmlsZTtcbn1cblxuLy8gRW52aXJvbm1lbnQgdmFyaWFibGUsIC5ucG1yYyBpbiBzYW1lIGRpcmVjdG9yeSBhcyBwYWNrYWdlLmpzb24gb3IgaW4gaG9tZSBkaXIiXX0=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { LoginInformation } from './codeartifact';
|
|
2
|
+
import { UsageDir } from './usage-dir';
|
|
3
|
+
export declare function nugetLogin(login: LoginInformation, usageDir: UsageDir): Promise<void>;
|
|
4
|
+
export declare function uploadDotnetPackages(packages: string[], usageDir: UsageDir): Promise<void>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.uploadDotnetPackages = exports.nugetLogin = void 0;
|
|
4
|
+
/* eslint-disable no-console */
|
|
5
|
+
const files_1 = require("../files");
|
|
6
|
+
const shell_1 = require("../shell");
|
|
7
|
+
const parallel_shell_1 = require("./parallel-shell");
|
|
8
|
+
async function nugetLogin(login, usageDir) {
|
|
9
|
+
// NuGet.Config MUST live in the current directory or in the home directory, and there is no environment
|
|
10
|
+
// variable to configure its location.
|
|
11
|
+
await writeNuGetConfigFile(usageDir.cwdFile('NuGet.Config'), login);
|
|
12
|
+
}
|
|
13
|
+
exports.nugetLogin = nugetLogin;
|
|
14
|
+
async function uploadDotnetPackages(packages, usageDir) {
|
|
15
|
+
await usageDir.copyCwdFileHere('NuGet.Config');
|
|
16
|
+
await parallel_shell_1.parallelShell(packages, async (pkg, output) => {
|
|
17
|
+
console.log(`⏳ ${pkg}`);
|
|
18
|
+
await shell_1.shell(['dotnet', 'nuget', 'push',
|
|
19
|
+
pkg,
|
|
20
|
+
'--source', 'CodeArtifact',
|
|
21
|
+
'--no-symbols',
|
|
22
|
+
'--force-english-output',
|
|
23
|
+
'--disable-buffering',
|
|
24
|
+
'--timeout', '600',
|
|
25
|
+
'--skip-duplicate'], {
|
|
26
|
+
output,
|
|
27
|
+
});
|
|
28
|
+
console.log(`✅ ${pkg}`);
|
|
29
|
+
}, (pkg, output) => {
|
|
30
|
+
if (output.toString().includes('Conflict')) {
|
|
31
|
+
console.log(`❌ ${pkg}: already exists. Skipped.`);
|
|
32
|
+
return 'skip';
|
|
33
|
+
}
|
|
34
|
+
if (output.includes('System.Threading.AbandonedMutexException')) {
|
|
35
|
+
console.log(`♻️ ${pkg}: AbandonedMutexException. Probably a sign of throttling, retrying.`);
|
|
36
|
+
return 'retry';
|
|
37
|
+
}
|
|
38
|
+
if (output.includes('Too Many Requests')) {
|
|
39
|
+
console.log(`♻️ ${pkg}: Too many requests. Retrying.`);
|
|
40
|
+
return 'retry';
|
|
41
|
+
}
|
|
42
|
+
if (output.includes('System.IO.IOException: The system cannot open the device or file specified.')) {
|
|
43
|
+
console.log(`♻️ ${pkg}: Some error that we've seen before as a result of throttling. Retrying.`);
|
|
44
|
+
return 'retry';
|
|
45
|
+
}
|
|
46
|
+
return 'fail';
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
exports.uploadDotnetPackages = uploadDotnetPackages;
|
|
50
|
+
async function writeNuGetConfigFile(filename, login) {
|
|
51
|
+
// `dotnet nuget push` has an `--api-key` parameter, but CodeArtifact
|
|
52
|
+
// does not support that. We must authenticate with Basic auth.
|
|
53
|
+
await files_1.writeFile(filename, `<?xml version="1.0" encoding="utf-8"?>
|
|
54
|
+
<configuration>
|
|
55
|
+
<packageSources>
|
|
56
|
+
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
|
|
57
|
+
<add key="CodeArtifact" value="${login.nugetEndpoint}v3/index.json" />
|
|
58
|
+
</packageSources>
|
|
59
|
+
<activePackageSource>
|
|
60
|
+
<add key="CodeArtifact" value="${login.nugetEndpoint}v3/index.json" />
|
|
61
|
+
</activePackageSource>
|
|
62
|
+
<packageSourceCredentials>
|
|
63
|
+
<CodeArtifact>
|
|
64
|
+
<add key="Username" value="aws" />
|
|
65
|
+
<add key="ClearTextPassword" value="${login.authToken}" />
|
|
66
|
+
</CodeArtifact>
|
|
67
|
+
</packageSourceCredentials>
|
|
68
|
+
</configuration>`);
|
|
69
|
+
}
|
|
70
|
+
// NuGet.Config in current directory
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVnZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudWdldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBK0I7QUFDL0Isb0NBQXFDO0FBQ3JDLG9DQUFpQztBQUVqQyxxREFBaUQ7QUFHMUMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxLQUF1QixFQUFFLFFBQWtCO0lBQzFFLHdHQUF3RztJQUN4RyxzQ0FBc0M7SUFDdEMsTUFBTSxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFKRCxnQ0FJQztBQUVNLEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxRQUFrQixFQUFFLFFBQWtCO0lBQy9FLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUUvQyxNQUFNLDhCQUFhLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDbEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFeEIsTUFBTSxhQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU07WUFDcEMsR0FBRztZQUNILFVBQVUsRUFBRSxjQUFjO1lBQzFCLGNBQWM7WUFDZCx3QkFBd0I7WUFDeEIscUJBQXFCO1lBQ3JCLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLGtCQUFrQixDQUFDLEVBQUU7WUFDckIsTUFBTTtTQUNQLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLENBQUMsRUFDRCxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNkLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ2xELE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsMENBQTBDLENBQUMsRUFBRTtZQUMvRCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxxRUFBcUUsQ0FBQyxDQUFDO1lBQzVGLE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsZ0NBQWdDLENBQUMsQ0FBQztZQUN2RCxPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUNELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyw2RUFBNkUsQ0FBQyxFQUFFO1lBQ2xHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLDBFQUEwRSxDQUFDLENBQUM7WUFDakcsT0FBTyxPQUFPLENBQUM7U0FDaEI7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUF0Q0Qsb0RBc0NDO0FBRUQsS0FBSyxVQUFVLG9CQUFvQixDQUFDLFFBQWdCLEVBQUUsS0FBdUI7SUFDM0UscUVBQXFFO0lBQ3JFLCtEQUErRDtJQUMvRCxNQUFNLGlCQUFTLENBQUMsUUFBUSxFQUFFOzs7O3FDQUlTLEtBQUssQ0FBQyxhQUFhOzs7cUNBR25CLEtBQUssQ0FBQyxhQUFhOzs7Ozs4Q0FLVixLQUFLLENBQUMsU0FBUzs7O2lCQUc1QyxDQUFDLENBQUM7QUFDbkIsQ0FBQztBQUVELG9DQUFvQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCB7IHdyaXRlRmlsZSB9IGZyb20gJy4uL2ZpbGVzJztcbmltcG9ydCB7IHNoZWxsIH0gZnJvbSAnLi4vc2hlbGwnO1xuaW1wb3J0IHsgTG9naW5JbmZvcm1hdGlvbiB9IGZyb20gJy4vY29kZWFydGlmYWN0JztcbmltcG9ydCB7IHBhcmFsbGVsU2hlbGwgfSBmcm9tICcuL3BhcmFsbGVsLXNoZWxsJztcbmltcG9ydCB7IFVzYWdlRGlyIH0gZnJvbSAnLi91c2FnZS1kaXInO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbnVnZXRMb2dpbihsb2dpbjogTG9naW5JbmZvcm1hdGlvbiwgdXNhZ2VEaXI6IFVzYWdlRGlyKSB7XG4gIC8vIE51R2V0LkNvbmZpZyBNVVNUIGxpdmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9yIGluIHRoZSBob21lIGRpcmVjdG9yeSwgYW5kIHRoZXJlIGlzIG5vIGVudmlyb25tZW50XG4gIC8vIHZhcmlhYmxlIHRvIGNvbmZpZ3VyZSBpdHMgbG9jYXRpb24uXG4gIGF3YWl0IHdyaXRlTnVHZXRDb25maWdGaWxlKHVzYWdlRGlyLmN3ZEZpbGUoJ051R2V0LkNvbmZpZycpLCBsb2dpbik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGxvYWREb3RuZXRQYWNrYWdlcyhwYWNrYWdlczogc3RyaW5nW10sIHVzYWdlRGlyOiBVc2FnZURpcikge1xuICBhd2FpdCB1c2FnZURpci5jb3B5Q3dkRmlsZUhlcmUoJ051R2V0LkNvbmZpZycpO1xuXG4gIGF3YWl0IHBhcmFsbGVsU2hlbGwocGFja2FnZXMsIGFzeW5jIChwa2csIG91dHB1dCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGDij7MgJHtwa2d9YCk7XG5cbiAgICBhd2FpdCBzaGVsbChbJ2RvdG5ldCcsICdudWdldCcsICdwdXNoJyxcbiAgICAgIHBrZyxcbiAgICAgICctLXNvdXJjZScsICdDb2RlQXJ0aWZhY3QnLFxuICAgICAgJy0tbm8tc3ltYm9scycsXG4gICAgICAnLS1mb3JjZS1lbmdsaXNoLW91dHB1dCcsXG4gICAgICAnLS1kaXNhYmxlLWJ1ZmZlcmluZycsXG4gICAgICAnLS10aW1lb3V0JywgJzYwMCcsXG4gICAgICAnLS1za2lwLWR1cGxpY2F0ZSddLCB7XG4gICAgICBvdXRwdXQsXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhg4pyFICR7cGtnfWApO1xuICB9LFxuICAocGtnLCBvdXRwdXQpID0+IHtcbiAgICBpZiAob3V0cHV0LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0NvbmZsaWN0JykpIHtcbiAgICAgIGNvbnNvbGUubG9nKGDinYwgJHtwa2d9OiBhbHJlYWR5IGV4aXN0cy4gU2tpcHBlZC5gKTtcbiAgICAgIHJldHVybiAnc2tpcCc7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuaW5jbHVkZXMoJ1N5c3RlbS5UaHJlYWRpbmcuQWJhbmRvbmVkTXV0ZXhFeGNlcHRpb24nKSkge1xuICAgICAgY29uc29sZS5sb2coYOKZu++4jyAke3BrZ306IEFiYW5kb25lZE11dGV4RXhjZXB0aW9uLiBQcm9iYWJseSBhIHNpZ24gb2YgdGhyb3R0bGluZywgcmV0cnlpbmcuYCk7XG4gICAgICByZXR1cm4gJ3JldHJ5JztcbiAgICB9XG4gICAgaWYgKG91dHB1dC5pbmNsdWRlcygnVG9vIE1hbnkgUmVxdWVzdHMnKSkge1xuICAgICAgY29uc29sZS5sb2coYOKZu++4jyAke3BrZ306IFRvbyBtYW55IHJlcXVlc3RzLiBSZXRyeWluZy5gKTtcbiAgICAgIHJldHVybiAncmV0cnknO1xuICAgIH1cbiAgICBpZiAob3V0cHV0LmluY2x1ZGVzKCdTeXN0ZW0uSU8uSU9FeGNlcHRpb246IFRoZSBzeXN0ZW0gY2Fubm90IG9wZW4gdGhlIGRldmljZSBvciBmaWxlIHNwZWNpZmllZC4nKSkge1xuICAgICAgY29uc29sZS5sb2coYOKZu++4jyAke3BrZ306IFNvbWUgZXJyb3IgdGhhdCB3ZSd2ZSBzZWVuIGJlZm9yZSBhcyBhIHJlc3VsdCBvZiB0aHJvdHRsaW5nLiBSZXRyeWluZy5gKTtcbiAgICAgIHJldHVybiAncmV0cnknO1xuICAgIH1cbiAgICByZXR1cm4gJ2ZhaWwnO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVOdUdldENvbmZpZ0ZpbGUoZmlsZW5hbWU6IHN0cmluZywgbG9naW46IExvZ2luSW5mb3JtYXRpb24pIHtcbiAgLy8gYGRvdG5ldCBudWdldCBwdXNoYCBoYXMgYW4gYC0tYXBpLWtleWAgcGFyYW1ldGVyLCBidXQgQ29kZUFydGlmYWN0XG4gIC8vIGRvZXMgbm90IHN1cHBvcnQgdGhhdC4gV2UgbXVzdCBhdXRoZW50aWNhdGUgd2l0aCBCYXNpYyBhdXRoLlxuICBhd2FpdCB3cml0ZUZpbGUoZmlsZW5hbWUsIGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiPz5cbjxjb25maWd1cmF0aW9uPlxuICA8cGFja2FnZVNvdXJjZXM+XG4gICAgPGFkZCBrZXk9XCJudWdldC5vcmdcIiB2YWx1ZT1cImh0dHBzOi8vYXBpLm51Z2V0Lm9yZy92My9pbmRleC5qc29uXCIgcHJvdG9jb2xWZXJzaW9uPVwiM1wiIC8+XG4gICAgPGFkZCBrZXk9XCJDb2RlQXJ0aWZhY3RcIiB2YWx1ZT1cIiR7bG9naW4ubnVnZXRFbmRwb2ludH12My9pbmRleC5qc29uXCIgLz5cbiAgPC9wYWNrYWdlU291cmNlcz5cbiAgPGFjdGl2ZVBhY2thZ2VTb3VyY2U+XG4gICAgPGFkZCBrZXk9XCJDb2RlQXJ0aWZhY3RcIiB2YWx1ZT1cIiR7bG9naW4ubnVnZXRFbmRwb2ludH12My9pbmRleC5qc29uXCIgLz5cbiAgPC9hY3RpdmVQYWNrYWdlU291cmNlPlxuICA8cGFja2FnZVNvdXJjZUNyZWRlbnRpYWxzPlxuICAgIDxDb2RlQXJ0aWZhY3Q+XG4gICAgICAgIDxhZGQga2V5PVwiVXNlcm5hbWVcIiB2YWx1ZT1cImF3c1wiIC8+XG4gICAgICAgIDxhZGQga2V5PVwiQ2xlYXJUZXh0UGFzc3dvcmRcIiB2YWx1ZT1cIiR7bG9naW4uYXV0aFRva2VufVwiIC8+XG4gICAgICA8L0NvZGVBcnRpZmFjdD5cbiAgPC9wYWNrYWdlU291cmNlQ3JlZGVudGlhbHM+XG48L2NvbmZpZ3VyYXRpb24+YCk7XG59XG5cbi8vIE51R2V0LkNvbmZpZyBpbiBjdXJyZW50IGRpcmVjdG9yeSJdfQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
export declare type ErrorResponse = 'fail' | 'skip' | 'retry';
|
|
3
|
+
/**
|
|
4
|
+
* Run a function in parallel with cached output
|
|
5
|
+
*/
|
|
6
|
+
export declare function parallelShell<A>(inputs: A[], block: (x: A, output: NodeJS.WritableStream) => Promise<void>, swallowError?: (x: A, output: string) => ErrorResponse): Promise<void>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parallelShell = void 0;
|
|
4
|
+
const p_queue_1 = require("p-queue");
|
|
5
|
+
const aws_1 = require("../aws");
|
|
6
|
+
const corking_1 = require("../corking");
|
|
7
|
+
/**
|
|
8
|
+
* Run a function in parallel with cached output
|
|
9
|
+
*/
|
|
10
|
+
async function parallelShell(inputs, block, swallowError) {
|
|
11
|
+
// Limit to 10 for now, too many instances of Maven exhaust the CodeBuild instance memory
|
|
12
|
+
const q = new p_queue_1.default({ concurrency: Number(process.env.CONCURRENCY) || 10 });
|
|
13
|
+
await q.addAll(inputs.map(input => async () => {
|
|
14
|
+
let attempts = 10;
|
|
15
|
+
let sleepMs = 500;
|
|
16
|
+
while (true) {
|
|
17
|
+
const output = new corking_1.MemoryStream();
|
|
18
|
+
try {
|
|
19
|
+
await block(input, output);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
switch (swallowError?.(input, output.toString())) {
|
|
24
|
+
case 'skip':
|
|
25
|
+
return;
|
|
26
|
+
case 'retry':
|
|
27
|
+
if (--attempts > 0) {
|
|
28
|
+
await aws_1.sleep(Math.floor(Math.random() * sleepMs));
|
|
29
|
+
sleepMs *= 2;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
break;
|
|
33
|
+
case 'fail':
|
|
34
|
+
case undefined:
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
// eslint-disable-next-line no-console
|
|
38
|
+
console.error(output.toString());
|
|
39
|
+
throw e;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}));
|
|
43
|
+
await q.onEmpty();
|
|
44
|
+
}
|
|
45
|
+
exports.parallelShell = parallelShell;
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYWxsZWwtc2hlbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwYXJhbGxlbC1zaGVsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQ0FBNkI7QUFDN0IsZ0NBQStCO0FBQy9CLHdDQUEwQztBQUsxQzs7R0FFRztBQUNJLEtBQUssVUFBVSxhQUFhLENBQ2pDLE1BQVcsRUFDWCxLQUE2RCxFQUM3RCxZQUFzRDtJQUV0RCx5RkFBeUY7SUFDekYsTUFBTSxDQUFDLEdBQUcsSUFBSSxpQkFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0UsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUM1QyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxFQUFFO1lBQ1gsTUFBTSxNQUFNLEdBQUcsSUFBSSxzQkFBWSxFQUFFLENBQUM7WUFDbEMsSUFBSTtnQkFDRixNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzNCLE9BQU87YUFDUjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLFFBQVEsWUFBWSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFO29CQUNoRCxLQUFLLE1BQU07d0JBQ1QsT0FBTztvQkFFVCxLQUFLLE9BQU87d0JBQ1YsSUFBSSxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUU7NEJBQ2xCLE1BQU0sV0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7NEJBQ2pELE9BQU8sSUFBSSxDQUFDLENBQUM7NEJBQ2IsU0FBUzt5QkFDVjt3QkFDRCxNQUFNO29CQUVSLEtBQUssTUFBTSxDQUFDO29CQUNaLEtBQUssU0FBUzt3QkFDWixNQUFNO2lCQUNUO2dCQUVELHNDQUFzQztnQkFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDakMsTUFBTSxDQUFDLENBQUM7YUFDVDtTQUNGO0lBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVKLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3BCLENBQUM7QUF6Q0Qsc0NBeUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBRdWV1ZSBmcm9tICdwLXF1ZXVlJztcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi4vYXdzJztcbmltcG9ydCB7IE1lbW9yeVN0cmVhbSB9IGZyb20gJy4uL2NvcmtpbmcnO1xuXG5cbmV4cG9ydCB0eXBlIEVycm9yUmVzcG9uc2UgPSAnZmFpbCcgfCAnc2tpcCcgfCAncmV0cnknO1xuXG4vKipcbiAqIFJ1biBhIGZ1bmN0aW9uIGluIHBhcmFsbGVsIHdpdGggY2FjaGVkIG91dHB1dFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyYWxsZWxTaGVsbDxBPihcbiAgaW5wdXRzOiBBW10sXG4gIGJsb2NrOiAoeDogQSwgb3V0cHV0OiBOb2RlSlMuV3JpdGFibGVTdHJlYW0pID0+IFByb21pc2U8dm9pZD4sXG4gIHN3YWxsb3dFcnJvcj86ICh4OiBBLCBvdXRwdXQ6IHN0cmluZykgPT4gRXJyb3JSZXNwb25zZSxcbikge1xuICAvLyBMaW1pdCB0byAxMCBmb3Igbm93LCB0b28gbWFueSBpbnN0YW5jZXMgb2YgTWF2ZW4gZXhoYXVzdCB0aGUgQ29kZUJ1aWxkIGluc3RhbmNlIG1lbW9yeVxuICBjb25zdCBxID0gbmV3IFBRdWV1ZSh7IGNvbmN1cnJlbmN5OiBOdW1iZXIocHJvY2Vzcy5lbnYuQ09OQ1VSUkVOQ1kpIHx8IDEwIH0pO1xuICBhd2FpdCBxLmFkZEFsbChpbnB1dHMubWFwKGlucHV0ID0+IGFzeW5jICgpID0+IHtcbiAgICBsZXQgYXR0ZW1wdHMgPSAxMDtcbiAgICBsZXQgc2xlZXBNcyA9IDUwMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gbmV3IE1lbW9yeVN0cmVhbSgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYmxvY2soaW5wdXQsIG91dHB1dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc3dpdGNoIChzd2FsbG93RXJyb3I/LihpbnB1dCwgb3V0cHV0LnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgY2FzZSAnc2tpcCc6XG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICBjYXNlICdyZXRyeSc6XG4gICAgICAgICAgICBpZiAoLS1hdHRlbXB0cyA+IDApIHtcbiAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogc2xlZXBNcykpO1xuICAgICAgICAgICAgICBzbGVlcE1zICo9IDI7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdmYWlsJzpcbiAgICAgICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5lcnJvcihvdXRwdXQudG9TdHJpbmcoKSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9KSk7XG5cbiAgYXdhaXQgcS5vbkVtcHR5KCk7XG59Il19
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { LoginInformation } from './codeartifact';
|
|
2
|
+
import { UsageDir } from './usage-dir';
|
|
3
|
+
export declare function pypiLogin(login: LoginInformation, usageDir: UsageDir): Promise<void>;
|
|
4
|
+
export declare function uploadPythonPackages(packages: string[], login: LoginInformation): Promise<void>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.uploadPythonPackages = exports.pypiLogin = void 0;
|
|
4
|
+
/* eslint-disable no-console */
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const files_1 = require("../files");
|
|
7
|
+
const shell_1 = require("../shell");
|
|
8
|
+
const parallel_shell_1 = require("./parallel-shell");
|
|
9
|
+
async function pypiLogin(login, usageDir) {
|
|
10
|
+
// Write pip config file and set environment var
|
|
11
|
+
await files_1.writeFile(path.join(usageDir.directory, 'pip.conf'), [
|
|
12
|
+
'[global]',
|
|
13
|
+
`index-url = https://aws:${login.authToken}@${login.pypiEndpoint.replace(/^https:\/\//, '')}simple/`,
|
|
14
|
+
].join('\n'));
|
|
15
|
+
await usageDir.addToEnv({
|
|
16
|
+
PIP_CONFIG_FILE: `${usageDir.directory}/pip.conf`,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
exports.pypiLogin = pypiLogin;
|
|
20
|
+
async function uploadPythonPackages(packages, login) {
|
|
21
|
+
await shell_1.shell(['pip', 'install', 'twine'], { show: 'error' });
|
|
22
|
+
// Even though twine supports uploading all packages in one go, we have to upload them
|
|
23
|
+
// individually since CodeArtifact does not support Twine's `--skip-existing`. Fun beans.
|
|
24
|
+
await parallel_shell_1.parallelShell(packages, async (pkg, output) => {
|
|
25
|
+
console.log(`⏳ ${pkg}`);
|
|
26
|
+
await shell_1.shell(['twine', 'upload', '--verbose', pkg], {
|
|
27
|
+
modEnv: {
|
|
28
|
+
TWINE_USERNAME: 'aws',
|
|
29
|
+
TWINE_PASSWORD: login.authToken,
|
|
30
|
+
TWINE_REPOSITORY_URL: login.pypiEndpoint,
|
|
31
|
+
},
|
|
32
|
+
show: 'error',
|
|
33
|
+
output,
|
|
34
|
+
});
|
|
35
|
+
console.log(`✅ ${pkg}`);
|
|
36
|
+
}, (pkg, output) => {
|
|
37
|
+
if (output.toString().includes('This package is configured to block new versions') || output.toString().includes('409 Conflict')) {
|
|
38
|
+
console.log(`❌ ${pkg}: already exists. Skipped.`);
|
|
39
|
+
return 'skip';
|
|
40
|
+
}
|
|
41
|
+
if (output.includes('429 Too Many Requests ')) {
|
|
42
|
+
console.log(`♻️ ${pkg}: 429 Too Many Requests. Retrying.`);
|
|
43
|
+
return 'retry';
|
|
44
|
+
}
|
|
45
|
+
return 'fail';
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
exports.uploadPythonPackages = uploadPythonPackages;
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHlwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInB5cGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBQy9CLDZCQUE2QjtBQUM3QixvQ0FBcUM7QUFDckMsb0NBQWlDO0FBRWpDLHFEQUFpRDtBQUcxQyxLQUFLLFVBQVUsU0FBUyxDQUFDLEtBQXVCLEVBQUUsUUFBa0I7SUFDekUsZ0RBQWdEO0lBQ2hELE1BQU0saUJBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDekQsVUFBVTtRQUNWLDJCQUEyQixLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsU0FBUztLQUNyRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2QsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3RCLGVBQWUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxTQUFTLFdBQVc7S0FDbEQsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQVRELDhCQVNDO0FBRU0sS0FBSyxVQUFVLG9CQUFvQixDQUFDLFFBQWtCLEVBQUUsS0FBdUI7SUFDcEYsTUFBTSxhQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFNUQsc0ZBQXNGO0lBQ3RGLHlGQUF5RjtJQUN6RixNQUFNLDhCQUFhLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDbEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFeEIsTUFBTSxhQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNqRCxNQUFNLEVBQUU7Z0JBQ04sY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLGNBQWMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDL0Isb0JBQW9CLEVBQUUsS0FBSyxDQUFDLFlBQVk7YUFDekM7WUFDRCxJQUFJLEVBQUUsT0FBTztZQUNiLE1BQU07U0FDUCxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMxQixDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDakIsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLGtEQUFrRCxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNoSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ2xELE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsRUFBRTtZQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxvQ0FBb0MsQ0FBQyxDQUFDO1lBQzNELE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBOUJELG9EQThCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyB3cml0ZUZpbGUgfSBmcm9tICcuLi9maWxlcyc7XG5pbXBvcnQgeyBzaGVsbCB9IGZyb20gJy4uL3NoZWxsJztcbmltcG9ydCB7IExvZ2luSW5mb3JtYXRpb24gfSBmcm9tICcuL2NvZGVhcnRpZmFjdCc7XG5pbXBvcnQgeyBwYXJhbGxlbFNoZWxsIH0gZnJvbSAnLi9wYXJhbGxlbC1zaGVsbCc7XG5pbXBvcnQgeyBVc2FnZURpciB9IGZyb20gJy4vdXNhZ2UtZGlyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB5cGlMb2dpbihsb2dpbjogTG9naW5JbmZvcm1hdGlvbiwgdXNhZ2VEaXI6IFVzYWdlRGlyKSB7XG4gIC8vIFdyaXRlIHBpcCBjb25maWcgZmlsZSBhbmQgc2V0IGVudmlyb25tZW50IHZhclxuICBhd2FpdCB3cml0ZUZpbGUocGF0aC5qb2luKHVzYWdlRGlyLmRpcmVjdG9yeSwgJ3BpcC5jb25mJyksIFtcbiAgICAnW2dsb2JhbF0nLFxuICAgIGBpbmRleC11cmwgPSBodHRwczovL2F3czoke2xvZ2luLmF1dGhUb2tlbn1AJHtsb2dpbi5weXBpRW5kcG9pbnQucmVwbGFjZSgvXmh0dHBzOlxcL1xcLy8sICcnKX1zaW1wbGUvYCxcbiAgXS5qb2luKCdcXG4nKSk7XG4gIGF3YWl0IHVzYWdlRGlyLmFkZFRvRW52KHtcbiAgICBQSVBfQ09ORklHX0ZJTEU6IGAke3VzYWdlRGlyLmRpcmVjdG9yeX0vcGlwLmNvbmZgLFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwbG9hZFB5dGhvblBhY2thZ2VzKHBhY2thZ2VzOiBzdHJpbmdbXSwgbG9naW46IExvZ2luSW5mb3JtYXRpb24pIHtcbiAgYXdhaXQgc2hlbGwoWydwaXAnLCAnaW5zdGFsbCcsICd0d2luZSddLCB7IHNob3c6ICdlcnJvcicgfSk7XG5cbiAgLy8gRXZlbiB0aG91Z2ggdHdpbmUgc3VwcG9ydHMgdXBsb2FkaW5nIGFsbCBwYWNrYWdlcyBpbiBvbmUgZ28sIHdlIGhhdmUgdG8gdXBsb2FkIHRoZW1cbiAgLy8gaW5kaXZpZHVhbGx5IHNpbmNlIENvZGVBcnRpZmFjdCBkb2VzIG5vdCBzdXBwb3J0IFR3aW5lJ3MgYC0tc2tpcC1leGlzdGluZ2AuIEZ1biBiZWFucy5cbiAgYXdhaXQgcGFyYWxsZWxTaGVsbChwYWNrYWdlcywgYXN5bmMgKHBrZywgb3V0cHV0KSA9PiB7XG4gICAgY29uc29sZS5sb2coYOKPsyAke3BrZ31gKTtcblxuICAgIGF3YWl0IHNoZWxsKFsndHdpbmUnLCAndXBsb2FkJywgJy0tdmVyYm9zZScsIHBrZ10sIHtcbiAgICAgIG1vZEVudjoge1xuICAgICAgICBUV0lORV9VU0VSTkFNRTogJ2F3cycsXG4gICAgICAgIFRXSU5FX1BBU1NXT1JEOiBsb2dpbi5hdXRoVG9rZW4sXG4gICAgICAgIFRXSU5FX1JFUE9TSVRPUllfVVJMOiBsb2dpbi5weXBpRW5kcG9pbnQsXG4gICAgICB9LFxuICAgICAgc2hvdzogJ2Vycm9yJyxcbiAgICAgIG91dHB1dCxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKGDinIUgJHtwa2d9YCk7XG4gIH0sIChwa2csIG91dHB1dCkgPT4ge1xuICAgIGlmIChvdXRwdXQudG9TdHJpbmcoKS5pbmNsdWRlcygnVGhpcyBwYWNrYWdlIGlzIGNvbmZpZ3VyZWQgdG8gYmxvY2sgbmV3IHZlcnNpb25zJykgfHwgb3V0cHV0LnRvU3RyaW5nKCkuaW5jbHVkZXMoJzQwOSBDb25mbGljdCcpKSB7XG4gICAgICBjb25zb2xlLmxvZyhg4p2MICR7cGtnfTogYWxyZWFkeSBleGlzdHMuIFNraXBwZWQuYCk7XG4gICAgICByZXR1cm4gJ3NraXAnO1xuICAgIH1cbiAgICBpZiAob3V0cHV0LmluY2x1ZGVzKCc0MjkgVG9vIE1hbnkgUmVxdWVzdHMgJykpIHtcbiAgICAgIGNvbnNvbGUubG9nKGDimbvvuI8gJHtwa2d9OiA0MjkgVG9vIE1hbnkgUmVxdWVzdHMuIFJldHJ5aW5nLmApO1xuICAgICAgcmV0dXJuICdyZXRyeSc7XG4gICAgfVxuICAgIHJldHVybiAnZmFpbCc7XG4gIH0pO1xufSJdfQ==
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare const DEFAULT_USAGE_DIR: string;
|
|
2
|
+
/**
|
|
3
|
+
* The usage directory is where we write per-session config files to access the CodeArtifact repository.
|
|
4
|
+
*
|
|
5
|
+
* Some config files may be written in a system-global location, but they will not be active unless the
|
|
6
|
+
* contents of this directory have been sourced/copied into the current terminal.
|
|
7
|
+
*
|
|
8
|
+
* CONTRACT
|
|
9
|
+
*
|
|
10
|
+
* There are two special entries:
|
|
11
|
+
*
|
|
12
|
+
* - `env`, a file with `key=value` entries for environment variables to set.
|
|
13
|
+
* - `cwd/`, a directory with files that need to be copied into the current directory before each command.
|
|
14
|
+
*
|
|
15
|
+
* Other than these, code may write tempfiles to this directory if it wants, but there is no meaning
|
|
16
|
+
* implied for other files.
|
|
17
|
+
*/
|
|
18
|
+
export declare class UsageDir {
|
|
19
|
+
readonly directory: string;
|
|
20
|
+
static default(): UsageDir;
|
|
21
|
+
readonly envFile: string;
|
|
22
|
+
readonly cwdDir: string;
|
|
23
|
+
private constructor();
|
|
24
|
+
clean(): Promise<void>;
|
|
25
|
+
addToEnv(settings: Record<string, string>): Promise<void>;
|
|
26
|
+
currentEnv(): Promise<Record<string, string>>;
|
|
27
|
+
cwdFile(filename: string): string;
|
|
28
|
+
activateInCurrentProcess(): Promise<void>;
|
|
29
|
+
copyCwdFileHere(...filenames: string[]): Promise<void>;
|
|
30
|
+
advertise(): void;
|
|
31
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UsageDir = exports.DEFAULT_USAGE_DIR = void 0;
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const fs = require("fs-extra");
|
|
6
|
+
const files_1 = require("../files");
|
|
7
|
+
exports.DEFAULT_USAGE_DIR = path.join(files_1.homeDir(), '.codeartifact/usage');
|
|
8
|
+
/**
|
|
9
|
+
* The usage directory is where we write per-session config files to access the CodeArtifact repository.
|
|
10
|
+
*
|
|
11
|
+
* Some config files may be written in a system-global location, but they will not be active unless the
|
|
12
|
+
* contents of this directory have been sourced/copied into the current terminal.
|
|
13
|
+
*
|
|
14
|
+
* CONTRACT
|
|
15
|
+
*
|
|
16
|
+
* There are two special entries:
|
|
17
|
+
*
|
|
18
|
+
* - `env`, a file with `key=value` entries for environment variables to set.
|
|
19
|
+
* - `cwd/`, a directory with files that need to be copied into the current directory before each command.
|
|
20
|
+
*
|
|
21
|
+
* Other than these, code may write tempfiles to this directory if it wants, but there is no meaning
|
|
22
|
+
* implied for other files.
|
|
23
|
+
*/
|
|
24
|
+
class UsageDir {
|
|
25
|
+
constructor(directory) {
|
|
26
|
+
this.directory = directory;
|
|
27
|
+
this.envFile = path.join(this.directory, 'env');
|
|
28
|
+
this.cwdDir = path.join(this.directory, 'cwd');
|
|
29
|
+
}
|
|
30
|
+
static default() {
|
|
31
|
+
return new UsageDir(exports.DEFAULT_USAGE_DIR);
|
|
32
|
+
}
|
|
33
|
+
async clean() {
|
|
34
|
+
await fs.rm(this.directory, { recursive: true, force: true });
|
|
35
|
+
await fs.mkdirp(path.join(this.directory, 'cwd'));
|
|
36
|
+
await fs.writeFile(path.join(this.directory, 'env'), '', { encoding: 'utf-8' });
|
|
37
|
+
await this.addToEnv({
|
|
38
|
+
CWD_FILES_DIR: path.join(this.directory, 'cwd'),
|
|
39
|
+
});
|
|
40
|
+
// Write a bash helper to load these settings
|
|
41
|
+
await fs.writeFile(path.join(this.directory, 'activate.bash'), [
|
|
42
|
+
`while read -u10 line; do [[ -z $line ]] || export "$line"; done 10<${this.directory}/env`,
|
|
43
|
+
'cp -R $CWD_FILES_DIR/ .',
|
|
44
|
+
].join('\n'), { encoding: 'utf-8' });
|
|
45
|
+
}
|
|
46
|
+
async addToEnv(settings) {
|
|
47
|
+
const lines = await files_1.loadLines(this.envFile);
|
|
48
|
+
for (const [k, v] of Object.entries(settings)) {
|
|
49
|
+
files_1.updateIniKey(lines, k, v);
|
|
50
|
+
}
|
|
51
|
+
await files_1.writeLines(this.envFile, lines);
|
|
52
|
+
}
|
|
53
|
+
async currentEnv() {
|
|
54
|
+
const lines = await files_1.loadLines(this.envFile);
|
|
55
|
+
const splitter = /^([a-zA-Z0-9_-]+)\s*=\s*(.*)$/;
|
|
56
|
+
const ret = {};
|
|
57
|
+
for (const line of lines) {
|
|
58
|
+
const m = line.match(splitter);
|
|
59
|
+
if (m) {
|
|
60
|
+
ret[m[1]] = m[2];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return ret;
|
|
64
|
+
}
|
|
65
|
+
cwdFile(filename) {
|
|
66
|
+
return path.join(this.cwdDir, filename);
|
|
67
|
+
}
|
|
68
|
+
async activateInCurrentProcess() {
|
|
69
|
+
for (const [k, v] of Object.entries(await this.currentEnv())) {
|
|
70
|
+
process.env[k] = v;
|
|
71
|
+
}
|
|
72
|
+
await files_1.copyDirectoryContents(this.cwdDir, '.');
|
|
73
|
+
}
|
|
74
|
+
async copyCwdFileHere(...filenames) {
|
|
75
|
+
for (const file of filenames) {
|
|
76
|
+
await fs.copyFile(path.join(this.cwdDir, file), file);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
advertise() {
|
|
80
|
+
// eslint-disable-next-line no-console
|
|
81
|
+
console.log('To activate these settings in the current terminal:');
|
|
82
|
+
// eslint-disable-next-line no-console
|
|
83
|
+
console.log(` source ${this.directory}/activate.bash`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.UsageDir = UsageDir;
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNhZ2UtZGlyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidXNhZ2UtZGlyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0Isb0NBQStGO0FBRWxGLFFBQUEsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFPLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0FBRTdFOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQWEsUUFBUTtJQVFuQixZQUFvQyxTQUFpQjtRQUFqQixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ25ELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFWTSxNQUFNLENBQUMsT0FBTztRQUNuQixPQUFPLElBQUksUUFBUSxDQUFDLHlCQUFpQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQVVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5RCxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUVoRixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDbEIsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7U0FDaEQsQ0FBQyxDQUFDO1FBRUgsNkNBQTZDO1FBQzdDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLEVBQUU7WUFDN0Qsc0VBQXNFLElBQUksQ0FBQyxTQUFTLE1BQU07WUFDMUYseUJBQXlCO1NBQzFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBZ0M7UUFDcEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxpQkFBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM3QyxvQkFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDM0I7UUFDRCxNQUFNLGtCQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVU7UUFDckIsTUFBTSxLQUFLLEdBQUcsTUFBTSxpQkFBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU1QyxNQUFNLFFBQVEsR0FBRywrQkFBK0IsQ0FBQztRQUVqRCxNQUFNLEdBQUcsR0FBMkIsRUFBRSxDQUFDO1FBQ3ZDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1lBQ3hCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLEVBQUU7Z0JBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNsQjtTQUNGO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sT0FBTyxDQUFDLFFBQWdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTSxLQUFLLENBQUMsd0JBQXdCO1FBQ25DLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUU7WUFDNUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEI7UUFFRCxNQUFNLDZCQUFxQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxTQUFtQjtRQUNqRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFNBQVMsRUFBRTtZQUM1QixNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3ZEO0lBQ0gsQ0FBQztJQUVNLFNBQVM7UUFDZCxzQ0FBc0M7UUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ25FLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQztJQUM1RCxDQUFDO0NBQ0Y7QUE1RUQsNEJBNEVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGNvcHlEaXJlY3RvcnlDb250ZW50cywgaG9tZURpciwgbG9hZExpbmVzLCB1cGRhdGVJbmlLZXksIHdyaXRlTGluZXMgfSBmcm9tICcuLi9maWxlcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1VTQUdFX0RJUiA9IHBhdGguam9pbihob21lRGlyKCksICcuY29kZWFydGlmYWN0L3VzYWdlJyk7XG5cbi8qKlxuICogVGhlIHVzYWdlIGRpcmVjdG9yeSBpcyB3aGVyZSB3ZSB3cml0ZSBwZXItc2Vzc2lvbiBjb25maWcgZmlsZXMgdG8gYWNjZXNzIHRoZSBDb2RlQXJ0aWZhY3QgcmVwb3NpdG9yeS5cbiAqXG4gKiBTb21lIGNvbmZpZyBmaWxlcyBtYXkgYmUgd3JpdHRlbiBpbiBhIHN5c3RlbS1nbG9iYWwgbG9jYXRpb24sIGJ1dCB0aGV5IHdpbGwgbm90IGJlIGFjdGl2ZSB1bmxlc3MgdGhlXG4gKiBjb250ZW50cyBvZiB0aGlzIGRpcmVjdG9yeSBoYXZlIGJlZW4gc291cmNlZC9jb3BpZWQgaW50byB0aGUgY3VycmVudCB0ZXJtaW5hbC5cbiAqXG4gKiBDT05UUkFDVFxuICpcbiAqIFRoZXJlIGFyZSB0d28gc3BlY2lhbCBlbnRyaWVzOlxuICpcbiAqIC0gYGVudmAsIGEgZmlsZSB3aXRoIGBrZXk9dmFsdWVgIGVudHJpZXMgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byAgc2V0LlxuICogLSBgY3dkL2AsIGEgZGlyZWN0b3J5IHdpdGggZmlsZXMgdGhhdCBuZWVkIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBiZWZvcmUgZWFjaCBjb21tYW5kLlxuICpcbiAqIE90aGVyIHRoYW4gdGhlc2UsIGNvZGUgbWF5IHdyaXRlIHRlbXBmaWxlcyB0byB0aGlzIGRpcmVjdG9yeSBpZiBpdCB3YW50cywgYnV0IHRoZXJlIGlzIG5vIG1lYW5pbmdcbiAqIGltcGxpZWQgZm9yIG90aGVyIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgVXNhZ2VEaXIge1xuICBwdWJsaWMgc3RhdGljIGRlZmF1bHQoKSB7XG4gICAgcmV0dXJuIG5ldyBVc2FnZURpcihERUZBVUxUX1VTQUdFX0RJUik7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgZW52RmlsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY3dkRGlyOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZGlyZWN0b3J5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmVudkZpbGUgPSBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksICdlbnYnKTtcbiAgICB0aGlzLmN3ZERpciA9IHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgJ2N3ZCcpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNsZWFuKCkge1xuICAgIGF3YWl0IGZzLnJtKHRoaXMuZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMubWtkaXJwKHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgJ2N3ZCcpKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCAnZW52JyksICcnLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5hZGRUb0Vudih7XG4gICAgICBDV0RfRklMRVNfRElSOiBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksICdjd2QnKSxcbiAgICB9KTtcblxuICAgIC8vIFdyaXRlIGEgYmFzaCBoZWxwZXIgdG8gbG9hZCB0aGVzZSBzZXR0aW5nc1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksICdhY3RpdmF0ZS5iYXNoJyksIFtcbiAgICAgIGB3aGlsZSByZWFkIC11MTAgbGluZTsgZG8gW1sgLXogJGxpbmUgXV0gfHwgZXhwb3J0IFwiJGxpbmVcIjsgZG9uZSAxMDwke3RoaXMuZGlyZWN0b3J5fS9lbnZgLFxuICAgICAgJ2NwIC1SICRDV0RfRklMRVNfRElSLyAuJywgLy8gQ29weSBmaWxlcyBmcm9tIGRpcmVjdG9yeSBldmVuIGlmIGl0IGlzIGVtcHR5XG4gICAgXS5qb2luKCdcXG4nKSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGRUb0VudihzZXR0aW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgIGNvbnN0IGxpbmVzID0gYXdhaXQgbG9hZExpbmVzKHRoaXMuZW52RmlsZSk7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MpKSB7XG4gICAgICB1cGRhdGVJbmlLZXkobGluZXMsIGssIHYpO1xuICAgIH1cbiAgICBhd2FpdCB3cml0ZUxpbmVzKHRoaXMuZW52RmlsZSwgbGluZXMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGN1cnJlbnRFbnYoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgY29uc3QgbGluZXMgPSBhd2FpdCBsb2FkTGluZXModGhpcy5lbnZGaWxlKTtcblxuICAgIGNvbnN0IHNwbGl0dGVyID0gL14oW2EtekEtWjAtOV8tXSspXFxzKj1cXHMqKC4qKSQvO1xuXG4gICAgY29uc3QgcmV0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCBtID0gbGluZS5tYXRjaChzcGxpdHRlcik7XG4gICAgICBpZiAobSkge1xuICAgICAgICByZXRbbVsxXV0gPSBtWzJdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIGN3ZEZpbGUoZmlsZW5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5jd2REaXIsIGZpbGVuYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhY3RpdmF0ZUluQ3VycmVudFByb2Nlc3MoKSB7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYXdhaXQgdGhpcy5jdXJyZW50RW52KCkpKSB7XG4gICAgICBwcm9jZXNzLmVudltrXSA9IHY7XG4gICAgfVxuXG4gICAgYXdhaXQgY29weURpcmVjdG9yeUNvbnRlbnRzKHRoaXMuY3dkRGlyLCAnLicpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNvcHlDd2RGaWxlSGVyZSguLi5maWxlbmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVuYW1lcykge1xuICAgICAgYXdhaXQgZnMuY29weUZpbGUocGF0aC5qb2luKHRoaXMuY3dkRGlyLCBmaWxlKSwgZmlsZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkdmVydGlzZSgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKCdUbyBhY3RpdmF0ZSB0aGVzZSBzZXR0aW5ncyBpbiB0aGUgY3VycmVudCB0ZXJtaW5hbDonKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKGAgICAgc291cmNlICR7dGhpcy5kaXJlY3Rvcnl9L2FjdGl2YXRlLmJhc2hgKTtcbiAgfVxufSJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AwsClients } from './aws';
|
|
2
|
+
import { TestContext } from './integ-test';
|
|
3
|
+
import { ResourcePool } from './resource-pool';
|
|
4
|
+
export declare type AwsContext = {
|
|
5
|
+
readonly aws: AwsClients;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Higher order function to execute a block with an AWS client setup
|
|
9
|
+
*
|
|
10
|
+
* Allocate the next region from the REGION pool and dispose it afterwards.
|
|
11
|
+
*/
|
|
12
|
+
export declare function withAws<A extends TestContext>(block: (context: A & AwsContext) => Promise<void>): (context: A) => Promise<void>;
|
|
13
|
+
export declare function regionPool(): ResourcePool;
|
package/lib/with-aws.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.regionPool = exports.withAws = void 0;
|
|
4
|
+
const aws_1 = require("./aws");
|
|
5
|
+
const resource_pool_1 = require("./resource-pool");
|
|
6
|
+
/**
|
|
7
|
+
* Higher order function to execute a block with an AWS client setup
|
|
8
|
+
*
|
|
9
|
+
* Allocate the next region from the REGION pool and dispose it afterwards.
|
|
10
|
+
*/
|
|
11
|
+
function withAws(block) {
|
|
12
|
+
return (context) => regionPool().using(async (region) => {
|
|
13
|
+
const aws = await aws_1.AwsClients.forRegion(region, context.output);
|
|
14
|
+
await sanityCheck(aws);
|
|
15
|
+
return block({ ...context, aws });
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
exports.withAws = withAws;
|
|
19
|
+
let _regionPool;
|
|
20
|
+
function regionPool() {
|
|
21
|
+
if (_regionPool !== undefined) {
|
|
22
|
+
return _regionPool;
|
|
23
|
+
}
|
|
24
|
+
const REGIONS = process.env.AWS_REGIONS
|
|
25
|
+
? process.env.AWS_REGIONS.split(',')
|
|
26
|
+
: [process.env.AWS_REGION ?? process.env.AWS_DEFAULT_REGION ?? 'us-east-1'];
|
|
27
|
+
// eslint-disable-next-line no-console
|
|
28
|
+
console.log(`Using regions: ${REGIONS}\n`);
|
|
29
|
+
_regionPool = resource_pool_1.ResourcePool.withResources('aws_regions', REGIONS);
|
|
30
|
+
return _regionPool;
|
|
31
|
+
}
|
|
32
|
+
exports.regionPool = regionPool;
|
|
33
|
+
/**
|
|
34
|
+
* Perform a one-time quick sanity check that the AWS clients have properly configured credentials
|
|
35
|
+
*
|
|
36
|
+
* If we don't do this, calls are going to fail and they'll be retried and everything will take
|
|
37
|
+
* forever before the user notices a simple misconfiguration.
|
|
38
|
+
*
|
|
39
|
+
* We can't check for the presence of environment variables since credentials could come from
|
|
40
|
+
* anywhere, so do simple account retrieval.
|
|
41
|
+
*
|
|
42
|
+
* Only do it once per process.
|
|
43
|
+
*/
|
|
44
|
+
async function sanityCheck(aws) {
|
|
45
|
+
if (sanityChecked === undefined) {
|
|
46
|
+
try {
|
|
47
|
+
await aws.account();
|
|
48
|
+
sanityChecked = true;
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
sanityChecked = false;
|
|
52
|
+
throw new Error(`AWS credentials probably not configured, got error: ${e.message}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (!sanityChecked) {
|
|
56
|
+
throw new Error('AWS credentials probably not configured, see previous error');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
let sanityChecked;
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1hd3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3aXRoLWF3cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBbUM7QUFFbkMsbURBQStDO0FBSS9DOzs7O0dBSUc7QUFDSCxTQUFnQixPQUFPLENBQXdCLEtBQWlEO0lBQzlGLE9BQU8sQ0FBQyxPQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDekQsTUFBTSxHQUFHLEdBQUcsTUFBTSxnQkFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXZCLE9BQU8sS0FBSyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFQRCwwQkFPQztBQUVELElBQUksV0FBcUMsQ0FBQztBQUMxQyxTQUFnQixVQUFVO0lBQ3hCLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtRQUM3QixPQUFPLFdBQVcsQ0FBQztLQUNwQjtJQUVELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVztRQUNyQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixJQUFJLFdBQVcsQ0FBQyxDQUFDO0lBRTlFLHNDQUFzQztJQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixPQUFPLElBQUksQ0FBQyxDQUFDO0lBRTNDLFdBQVcsR0FBRyw0QkFBWSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakUsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQWRELGdDQWNDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILEtBQUssVUFBVSxXQUFXLENBQUMsR0FBZTtJQUN4QyxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7UUFDL0IsSUFBSTtZQUNGLE1BQU0sR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDdEI7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDckY7S0FDRjtJQUNELElBQUksQ0FBQyxhQUFhLEVBQUU7UUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0tBQ2hGO0FBQ0gsQ0FBQztBQUNELElBQUksYUFBa0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF3c0NsaWVudHMgfSBmcm9tICcuL2F3cyc7XG5pbXBvcnQgeyBUZXN0Q29udGV4dCB9IGZyb20gJy4vaW50ZWctdGVzdCc7XG5pbXBvcnQgeyBSZXNvdXJjZVBvb2wgfSBmcm9tICcuL3Jlc291cmNlLXBvb2wnO1xuXG5leHBvcnQgdHlwZSBBd3NDb250ZXh0ID0geyByZWFkb25seSBhd3M6IEF3c0NsaWVudHMgfTtcblxuLyoqXG4gKiBIaWdoZXIgb3JkZXIgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhIGJsb2NrIHdpdGggYW4gQVdTIGNsaWVudCBzZXR1cFxuICpcbiAqIEFsbG9jYXRlIHRoZSBuZXh0IHJlZ2lvbiBmcm9tIHRoZSBSRUdJT04gcG9vbCBhbmQgZGlzcG9zZSBpdCBhZnRlcndhcmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aEF3czxBIGV4dGVuZHMgVGVzdENvbnRleHQ+KGJsb2NrOiAoY29udGV4dDogQSAmIEF3c0NvbnRleHQpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgcmV0dXJuIChjb250ZXh0OiBBKSA9PiByZWdpb25Qb29sKCkudXNpbmcoYXN5bmMgKHJlZ2lvbikgPT4ge1xuICAgIGNvbnN0IGF3cyA9IGF3YWl0IEF3c0NsaWVudHMuZm9yUmVnaW9uKHJlZ2lvbiwgY29udGV4dC5vdXRwdXQpO1xuICAgIGF3YWl0IHNhbml0eUNoZWNrKGF3cyk7XG5cbiAgICByZXR1cm4gYmxvY2soeyAuLi5jb250ZXh0LCBhd3MgfSk7XG4gIH0pO1xufVxuXG5sZXQgX3JlZ2lvblBvb2w6IHVuZGVmaW5lZCB8IFJlc291cmNlUG9vbDtcbmV4cG9ydCBmdW5jdGlvbiByZWdpb25Qb29sKCk6IFJlc291cmNlUG9vbCB7XG4gIGlmIChfcmVnaW9uUG9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIF9yZWdpb25Qb29sO1xuICB9XG5cbiAgY29uc3QgUkVHSU9OUyA9IHByb2Nlc3MuZW52LkFXU19SRUdJT05TXG4gICAgPyBwcm9jZXNzLmVudi5BV1NfUkVHSU9OUy5zcGxpdCgnLCcpXG4gICAgOiBbcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiA/PyBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9SRUdJT04gPz8gJ3VzLWVhc3QtMSddO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUubG9nKGBVc2luZyByZWdpb25zOiAke1JFR0lPTlN9XFxuYCk7XG5cbiAgX3JlZ2lvblBvb2wgPSBSZXNvdXJjZVBvb2wud2l0aFJlc291cmNlcygnYXdzX3JlZ2lvbnMnLCBSRUdJT05TKTtcbiAgcmV0dXJuIF9yZWdpb25Qb29sO1xufVxuXG4vKipcbiAqIFBlcmZvcm0gYSBvbmUtdGltZSBxdWljayBzYW5pdHkgY2hlY2sgdGhhdCB0aGUgQVdTIGNsaWVudHMgaGF2ZSBwcm9wZXJseSBjb25maWd1cmVkIGNyZWRlbnRpYWxzXG4gKlxuICogSWYgd2UgZG9uJ3QgZG8gdGhpcywgY2FsbHMgYXJlIGdvaW5nIHRvIGZhaWwgYW5kIHRoZXknbGwgYmUgcmV0cmllZCBhbmQgZXZlcnl0aGluZyB3aWxsIHRha2VcbiAqIGZvcmV2ZXIgYmVmb3JlIHRoZSB1c2VyIG5vdGljZXMgYSBzaW1wbGUgbWlzY29uZmlndXJhdGlvbi5cbiAqXG4gKiBXZSBjYW4ndCBjaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyBzaW5jZSBjcmVkZW50aWFscyBjb3VsZCBjb21lIGZyb21cbiAqIGFueXdoZXJlLCBzbyBkbyBzaW1wbGUgYWNjb3VudCByZXRyaWV2YWwuXG4gKlxuICogT25seSBkbyBpdCBvbmNlIHBlciBwcm9jZXNzLlxuICovXG5hc3luYyBmdW5jdGlvbiBzYW5pdHlDaGVjayhhd3M6IEF3c0NsaWVudHMpIHtcbiAgaWYgKHNhbml0eUNoZWNrZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhd3MuYWNjb3VudCgpO1xuICAgICAgc2FuaXR5Q2hlY2tlZCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2FuaXR5Q2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBV1MgY3JlZGVudGlhbHMgcHJvYmFibHkgbm90IGNvbmZpZ3VyZWQsIGdvdCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIGlmICghc2FuaXR5Q2hlY2tlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQVdTIGNyZWRlbnRpYWxzIHByb2JhYmx5IG5vdCBjb25maWd1cmVkLCBzZWUgcHJldmlvdXMgZXJyb3InKTtcbiAgfVxufVxubGV0IHNhbml0eUNoZWNrZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7Il19
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { AwsClients } from './aws';
|
|
3
|
+
import { TestContext } from './integ-test';
|
|
4
|
+
import { IPackageSource } from './package-sources/source';
|
|
5
|
+
import { ShellOptions, ShellHelper } from './shell';
|
|
6
|
+
import { AwsContext } from './with-aws';
|
|
7
|
+
/**
|
|
8
|
+
* Higher order function to execute a block with a CDK app fixture
|
|
9
|
+
*
|
|
10
|
+
* Requires an AWS client to be passed in.
|
|
11
|
+
*
|
|
12
|
+
* For backwards compatibility with existing tests (so we don't have to change
|
|
13
|
+
* too much) the inner block is expected to take a `TestFixture` object.
|
|
14
|
+
*/
|
|
15
|
+
export declare function withCdkApp<A extends TestContext & AwsContext>(block: (context: TestFixture) => Promise<void>): (context: A) => Promise<void>;
|
|
16
|
+
export declare function withMonolithicCfnIncludeCdkApp<A extends TestContext>(block: (context: TestFixture) => Promise<void>): (context: A) => Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Default test fixture for most (all?) integ tests
|
|
19
|
+
*
|
|
20
|
+
* It's a composition of withAws/withCdkApp, expecting the test block to take a `TestFixture`
|
|
21
|
+
* object.
|
|
22
|
+
*
|
|
23
|
+
* We could have put `withAws(withCdkApp(fixture => { /... actual test here.../ }))` in every
|
|
24
|
+
* test declaration but centralizing it is going to make it convenient to modify in the future.
|
|
25
|
+
*/
|
|
26
|
+
export declare function withDefaultFixture(block: (context: TestFixture) => Promise<void>): (context: TestContext) => Promise<void>;
|
|
27
|
+
export interface CdkCliOptions extends ShellOptions {
|
|
28
|
+
options?: string[];
|
|
29
|
+
neverRequireApproval?: boolean;
|
|
30
|
+
verbose?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Prepare a target dir byreplicating a source directory
|
|
34
|
+
*/
|
|
35
|
+
export declare function cloneDirectory(source: string, target: string, output?: NodeJS.WritableStream): Promise<void>;
|
|
36
|
+
interface CommonCdkBootstrapCommandOptions {
|
|
37
|
+
readonly toolkitStackName: string;
|
|
38
|
+
/**
|
|
39
|
+
* @default false
|
|
40
|
+
*/
|
|
41
|
+
readonly verbose?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* @default - auto-generated CloudFormation name
|
|
44
|
+
*/
|
|
45
|
+
readonly bootstrapBucketName?: string;
|
|
46
|
+
readonly cliOptions?: CdkCliOptions;
|
|
47
|
+
/**
|
|
48
|
+
* @default - none
|
|
49
|
+
*/
|
|
50
|
+
readonly tags?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface CdkLegacyBootstrapCommandOptions extends CommonCdkBootstrapCommandOptions {
|
|
53
|
+
/**
|
|
54
|
+
* @default false
|
|
55
|
+
*/
|
|
56
|
+
readonly noExecute?: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* @default true
|
|
59
|
+
*/
|
|
60
|
+
readonly publicAccessBlockConfiguration?: boolean;
|
|
61
|
+
}
|
|
62
|
+
export interface CdkModernBootstrapCommandOptions extends CommonCdkBootstrapCommandOptions {
|
|
63
|
+
/**
|
|
64
|
+
* @default false
|
|
65
|
+
*/
|
|
66
|
+
readonly force?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* @default - none
|
|
69
|
+
*/
|
|
70
|
+
readonly cfnExecutionPolicy?: string;
|
|
71
|
+
/**
|
|
72
|
+
* @default false
|
|
73
|
+
*/
|
|
74
|
+
readonly showTemplate?: boolean;
|
|
75
|
+
readonly template?: string;
|
|
76
|
+
/**
|
|
77
|
+
* @default false
|
|
78
|
+
*/
|
|
79
|
+
readonly terminationProtection?: boolean;
|
|
80
|
+
/**
|
|
81
|
+
* @default undefined
|
|
82
|
+
*/
|
|
83
|
+
readonly examplePermissionsBoundary?: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* @default undefined
|
|
86
|
+
*/
|
|
87
|
+
readonly customPermissionsBoundary?: string;
|
|
88
|
+
}
|
|
89
|
+
export declare class TestFixture extends ShellHelper {
|
|
90
|
+
readonly integTestDir: string;
|
|
91
|
+
readonly stackNamePrefix: string;
|
|
92
|
+
readonly output: NodeJS.WritableStream;
|
|
93
|
+
readonly aws: AwsClients;
|
|
94
|
+
readonly randomString: string;
|
|
95
|
+
readonly qualifier: string;
|
|
96
|
+
private readonly bucketsToDelete;
|
|
97
|
+
readonly packages: IPackageSource;
|
|
98
|
+
constructor(integTestDir: string, stackNamePrefix: string, output: NodeJS.WritableStream, aws: AwsClients, randomString: string);
|
|
99
|
+
log(s: string): void;
|
|
100
|
+
cdkDeploy(stackNames: string | string[], options?: CdkCliOptions): Promise<string>;
|
|
101
|
+
cdkSynth(options?: CdkCliOptions): Promise<string>;
|
|
102
|
+
cdkDestroy(stackNames: string | string[], options?: CdkCliOptions): Promise<string>;
|
|
103
|
+
cdkBootstrapLegacy(options: CdkLegacyBootstrapCommandOptions): Promise<string>;
|
|
104
|
+
cdkBootstrapModern(options: CdkModernBootstrapCommandOptions): Promise<string>;
|
|
105
|
+
cdk(args: string[], options?: CdkCliOptions): Promise<string>;
|
|
106
|
+
template(stackName: string): any;
|
|
107
|
+
get bootstrapStackName(): string;
|
|
108
|
+
fullStackName(stackName: string): string;
|
|
109
|
+
fullStackName(stackNames: string[]): string[];
|
|
110
|
+
/**
|
|
111
|
+
* Append this to the list of buckets to potentially delete
|
|
112
|
+
*
|
|
113
|
+
* At the end of a test, we clean up buckets that may not have gotten destroyed
|
|
114
|
+
* (for whatever reason).
|
|
115
|
+
*/
|
|
116
|
+
rememberToDeleteBucket(bucketName: string): void;
|
|
117
|
+
/**
|
|
118
|
+
* Cleanup leftover stacks and buckets
|
|
119
|
+
*/
|
|
120
|
+
dispose(success: boolean): Promise<void>;
|
|
121
|
+
/**
|
|
122
|
+
* Return the stacks starting with our testing prefix that should be deleted
|
|
123
|
+
*/
|
|
124
|
+
private deleteableStacks;
|
|
125
|
+
private sortBootstrapStacksToTheEnd;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Install the given NPM packages, identified by their names and versions
|
|
129
|
+
*
|
|
130
|
+
* Works by writing the packages to a `package.json` file, and
|
|
131
|
+
* then running NPM7's "install" on it. The use of NPM7 will automatically
|
|
132
|
+
* install required peerDependencies.
|
|
133
|
+
*
|
|
134
|
+
* If we're running in REPO mode and we find the package in the set of local
|
|
135
|
+
* packages in the repository, we'll write the directory name to `package.json`
|
|
136
|
+
* so that NPM will create a symlink (this allows running tests against
|
|
137
|
+
* built-but-unpackaged modules, and saves dev cycle time).
|
|
138
|
+
*
|
|
139
|
+
* Be aware you MUST install all the packages you directly depend upon! In the case
|
|
140
|
+
* of a repo/symlinking install, transitive dependencies WILL NOT be installed in the
|
|
141
|
+
* current directory's `node_modules` directory, because they will already have been
|
|
142
|
+
* symlinked from the TARGET directory's `node_modules` directory (which is sufficient
|
|
143
|
+
* for Node's dependency lookup mechanism).
|
|
144
|
+
*/
|
|
145
|
+
export declare function installNpmPackages(fixture: TestFixture, packages: Record<string, string>): Promise<void>;
|
|
146
|
+
export {};
|