@jcoreio/aws-ecr-utils 2.1.1 → 2.2.1
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/ECRDeployer.d.mts +46 -0
- package/ECRDeployer.d.mts.map +1 -0
- package/ECRDeployer.d.ts +46 -0
- package/ECRDeployer.d.ts.map +1 -0
- package/ECRDeployer.js +515 -0
- package/ECRDeployer.js.map +1 -0
- package/ECRDeployer.mjs +173 -0
- package/ECRDeployer.mjs.map +1 -0
- package/index.d.mts +1 -0
- package/index.d.mts.map +1 -1
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/index.js +7 -0
- package/index.js.map +1 -1
- package/index.mjs +1 -0
- package/index.mjs.map +1 -1
- package/once.d.mts +2 -0
- package/once.d.mts.map +1 -0
- package/once.d.ts +2 -0
- package/once.d.ts.map +1 -0
- package/once.js +14 -0
- package/once.js.map +1 -0
- package/once.mjs +8 -0
- package/once.mjs.map +1 -0
- package/package.json +2 -1
- package/src/ECRDeployer.ts +235 -0
- package/src/index.ts +1 -0
- package/src/once.ts +7 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ECRClientConfig } from '@aws-sdk/client-ecr';
|
|
2
|
+
export interface ECRDeployerOptions {
|
|
3
|
+
awsConfig?: ECRClientConfig;
|
|
4
|
+
/**
|
|
5
|
+
* {@link ECRDeployer#release} will only add a version tag if the current git branch
|
|
6
|
+
* is one of these branches (defaults to `['master', 'main', 'release']`)
|
|
7
|
+
*/
|
|
8
|
+
releaseBranches?: string[];
|
|
9
|
+
/**
|
|
10
|
+
* The name of the ECR repository
|
|
11
|
+
*/
|
|
12
|
+
repositoryName: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Class that implements our conventional process for deploying docker images to ECR.
|
|
16
|
+
*
|
|
17
|
+
* The CI build step should build the docker image (you may want to use {@link getNpmToken}
|
|
18
|
+
* to pass an `NPM_TOKEN` build arg) and then call {@link push} to push the image to
|
|
19
|
+
* ECR tagged with the git commit hash.
|
|
20
|
+
*
|
|
21
|
+
* The CI release step should call {@link release} to add tags for the git branch and
|
|
22
|
+
* the `version` in your `package.json`.
|
|
23
|
+
*
|
|
24
|
+
* You may use the `OVERRIDE_ECR_BRANCH_TAG` and `OVERRIDE_ECR_VERSION_TAG` environment
|
|
25
|
+
* variables to force specific tags for the branch and version.
|
|
26
|
+
*/
|
|
27
|
+
export declare class ECRDeployer {
|
|
28
|
+
options: ECRDeployerOptions;
|
|
29
|
+
constructor(options: ECRDeployerOptions);
|
|
30
|
+
getBranch(): Promise<string>;
|
|
31
|
+
getCommitHash(): Promise<string>;
|
|
32
|
+
private getAWSAccountId;
|
|
33
|
+
private getRegion;
|
|
34
|
+
private getECRHost;
|
|
35
|
+
private getProjectPackageJson;
|
|
36
|
+
getDockerTags(): Promise<{
|
|
37
|
+
latest: string;
|
|
38
|
+
branch: string;
|
|
39
|
+
commitHash: string;
|
|
40
|
+
version?: string;
|
|
41
|
+
}>;
|
|
42
|
+
push(): Promise<void>;
|
|
43
|
+
release(): Promise<void>;
|
|
44
|
+
getNpmToken(env?: NodeJS.ProcessEnv): Promise<string>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=ECRDeployer.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ECRDeployer.d.mts","names":["ECRClientConfig","ECRDeployerOptions","awsConfig","releaseBranches","repositoryName","ECRDeployer","options","getBranch","Promise","getCommitHash","getAWSAccountId","getRegion","getECRHost","getProjectPackageJson","getDockerTags","latest","branch","commitHash","version","push","release","getNpmToken","env","NodeJS","ProcessEnv"],"sources":["src/ECRDeployer.ts"],"sourcesContent":[null],"mappings":"AAAA,SAGEA,eAAe,QAEV,qBAAqB;AAS5B,OAAM,UAAWC,kBAAkB;EACjCC,SAAS,CAAC,EAAEF,eAAe;EAC3B;;;;EAIAG,eAAe,CAAC,EAAE,MAAM,EAAE;EAC1B;;;EAGAC,cAAc,EAAE,MAAM;;AAGxB;;;;;;;;;;;;;AAaA,qBAAaC,WAAW;EACtBC,OAAO,EAAEL,kBAAkB;cAEfK,OAAO,EAAEL,kBAAkB;EAIjCM,SAASA,CAAA,GAAAC,OAAA;EAWTC,aAAaA,CAAA,GAAAD,OAAA;EAMnB,QAAQE,eAAe;UAOTC,SAAS;UAYTC,UAAU;UAIVC,qBAAqB;EAoB7BC,aAAaA,CAAA,GAAIN,OAAO,CAAC;IAC7BO,MAAM,EAAE,MAAM;IACdC,MAAM,EAAE,MAAM;IACdC,UAAU,EAAE,MAAM;IAClBC,OAAO,CAAC,EAAE,MAAM;GACjB,CAAC;EA+BIC,IAAIA,CAAA,GAAAX,OAAA;EAuBJY,OAAOA,CAAA,GAAAZ,OAAA;EAuDPa,WAAWA,CAACC,GAAiB,CAAd,EAAAC,MAAA,CAAAC,UAAc,GAAAhB,OAAA","ignoreList":[]}
|
package/ECRDeployer.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ECRClientConfig } from '@aws-sdk/client-ecr';
|
|
2
|
+
export interface ECRDeployerOptions {
|
|
3
|
+
awsConfig?: ECRClientConfig;
|
|
4
|
+
/**
|
|
5
|
+
* {@link ECRDeployer#release} will only add a version tag if the current git branch
|
|
6
|
+
* is one of these branches (defaults to `['master', 'main', 'release']`)
|
|
7
|
+
*/
|
|
8
|
+
releaseBranches?: string[];
|
|
9
|
+
/**
|
|
10
|
+
* The name of the ECR repository
|
|
11
|
+
*/
|
|
12
|
+
repositoryName: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Class that implements our conventional process for deploying docker images to ECR.
|
|
16
|
+
*
|
|
17
|
+
* The CI build step should build the docker image (you may want to use {@link getNpmToken}
|
|
18
|
+
* to pass an `NPM_TOKEN` build arg) and then call {@link push} to push the image to
|
|
19
|
+
* ECR tagged with the git commit hash.
|
|
20
|
+
*
|
|
21
|
+
* The CI release step should call {@link release} to add tags for the git branch and
|
|
22
|
+
* the `version` in your `package.json`.
|
|
23
|
+
*
|
|
24
|
+
* You may use the `OVERRIDE_ECR_BRANCH_TAG` and `OVERRIDE_ECR_VERSION_TAG` environment
|
|
25
|
+
* variables to force specific tags for the branch and version.
|
|
26
|
+
*/
|
|
27
|
+
export declare class ECRDeployer {
|
|
28
|
+
options: ECRDeployerOptions;
|
|
29
|
+
constructor(options: ECRDeployerOptions);
|
|
30
|
+
getBranch(): Promise<string>;
|
|
31
|
+
getCommitHash(): Promise<string>;
|
|
32
|
+
private getAWSAccountId;
|
|
33
|
+
private getRegion;
|
|
34
|
+
private getECRHost;
|
|
35
|
+
private getProjectPackageJson;
|
|
36
|
+
getDockerTags(): Promise<{
|
|
37
|
+
latest: string;
|
|
38
|
+
branch: string;
|
|
39
|
+
commitHash: string;
|
|
40
|
+
version?: string;
|
|
41
|
+
}>;
|
|
42
|
+
push(): Promise<void>;
|
|
43
|
+
release(): Promise<void>;
|
|
44
|
+
getNpmToken(env?: NodeJS.ProcessEnv): Promise<string>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=ECRDeployer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ECRDeployer.d.ts","names":["ECRClientConfig","ECRDeployerOptions","awsConfig","releaseBranches","repositoryName","ECRDeployer","options","getBranch","Promise","getCommitHash","getAWSAccountId","getRegion","getECRHost","getProjectPackageJson","getDockerTags","latest","branch","commitHash","version","push","release","getNpmToken","env","NodeJS","ProcessEnv"],"sources":["src/ECRDeployer.ts"],"sourcesContent":[null],"mappings":"AAAA,SAGEA,eAAe,QAEV,qBAAqB;AAS5B,OAAM,UAAWC,kBAAkB;EACjCC,SAAS,CAAC,EAAEF,eAAe;EAC3B;;;;EAIAG,eAAe,CAAC,EAAE,MAAM,EAAE;EAC1B;;;EAGAC,cAAc,EAAE,MAAM;;AAGxB;;;;;;;;;;;;;AAaA,qBAAaC,WAAW;EACtBC,OAAO,EAAEL,kBAAkB;cAEfK,OAAO,EAAEL,kBAAkB;EAIjCM,SAASA,CAAA,GAAAC,OAAA;EAWTC,aAAaA,CAAA,GAAAD,OAAA;EAMnB,QAAQE,eAAe;UAOTC,SAAS;UAYTC,UAAU;UAIVC,qBAAqB;EAoB7BC,aAAaA,CAAA,GAAIN,OAAO,CAAC;IAC7BO,MAAM,EAAE,MAAM;IACdC,MAAM,EAAE,MAAM;IACdC,UAAU,EAAE,MAAM;IAClBC,OAAO,CAAC,EAAE,MAAM;GACjB,CAAC;EA+BIC,IAAIA,CAAA,GAAAX,OAAA;EAuBJY,OAAOA,CAAA,GAAAZ,OAAA;EAuDPa,WAAWA,CAACC,GAAiB,CAAd,EAAAC,MAAA,CAAAC,UAAc,GAAAhB,OAAA","ignoreList":[]}
|
package/ECRDeployer.js
ADDED
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.ECRDeployer = void 0;
|
|
8
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
10
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
11
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
12
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
13
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
14
|
+
var _clientEcr = require("@aws-sdk/client-ecr");
|
|
15
|
+
var _promisifyChildProcess = require("promisify-child-process");
|
|
16
|
+
var _promises = _interopRequireDefault(require("fs/promises"));
|
|
17
|
+
var _path = _interopRequireDefault(require("path"));
|
|
18
|
+
var _clientSts = require("@aws-sdk/client-sts");
|
|
19
|
+
var _once = require("./once.js");
|
|
20
|
+
var _loginToECR = _interopRequireDefault(require("./loginToECR.js"));
|
|
21
|
+
var _os = _interopRequireDefault(require("os"));
|
|
22
|
+
/**
|
|
23
|
+
* Class that implements our conventional process for deploying docker images to ECR.
|
|
24
|
+
*
|
|
25
|
+
* The CI build step should build the docker image (you may want to use {@link getNpmToken}
|
|
26
|
+
* to pass an `NPM_TOKEN` build arg) and then call {@link push} to push the image to
|
|
27
|
+
* ECR tagged with the git commit hash.
|
|
28
|
+
*
|
|
29
|
+
* The CI release step should call {@link release} to add tags for the git branch and
|
|
30
|
+
* the `version` in your `package.json`.
|
|
31
|
+
*
|
|
32
|
+
* You may use the `OVERRIDE_ECR_BRANCH_TAG` and `OVERRIDE_ECR_VERSION_TAG` environment
|
|
33
|
+
* variables to force specific tags for the branch and version.
|
|
34
|
+
*/
|
|
35
|
+
var ECRDeployer = exports.ECRDeployer = /*#__PURE__*/function () {
|
|
36
|
+
function ECRDeployer(options) {
|
|
37
|
+
var _this = this;
|
|
38
|
+
(0, _classCallCheck2["default"])(this, ECRDeployer);
|
|
39
|
+
(0, _defineProperty2["default"])(this, "options", void 0);
|
|
40
|
+
(0, _defineProperty2["default"])(this, "getAWSAccountId", (0, _once.once)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
41
|
+
var sts, _yield$sts$send, Account;
|
|
42
|
+
return _regenerator["default"].wrap(function (_context) {
|
|
43
|
+
while (1) switch (_context.prev = _context.next) {
|
|
44
|
+
case 0:
|
|
45
|
+
sts = new _clientSts.STSClient(_this.options.awsConfig || {});
|
|
46
|
+
_context.next = 1;
|
|
47
|
+
return sts.send(new _clientSts.GetCallerIdentityCommand());
|
|
48
|
+
case 1:
|
|
49
|
+
_yield$sts$send = _context.sent;
|
|
50
|
+
Account = _yield$sts$send.Account;
|
|
51
|
+
if (Account) {
|
|
52
|
+
_context.next = 2;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
throw new Error("failed to get AWS account id");
|
|
56
|
+
case 2:
|
|
57
|
+
return _context.abrupt("return", Account);
|
|
58
|
+
case 3:
|
|
59
|
+
case "end":
|
|
60
|
+
return _context.stop();
|
|
61
|
+
}
|
|
62
|
+
}, _callee);
|
|
63
|
+
}))));
|
|
64
|
+
this.options = options;
|
|
65
|
+
}
|
|
66
|
+
return (0, _createClass2["default"])(ECRDeployer, [{
|
|
67
|
+
key: "getBranch",
|
|
68
|
+
value: function () {
|
|
69
|
+
var _getBranch = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
70
|
+
var _t;
|
|
71
|
+
return _regenerator["default"].wrap(function (_context2) {
|
|
72
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
73
|
+
case 0:
|
|
74
|
+
_t = process.env.OVERRIDE_ECR_BRANCH_TAG;
|
|
75
|
+
if (_t) {
|
|
76
|
+
_context2.next = 2;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
_context2.next = 1;
|
|
80
|
+
return (0, _promisifyChildProcess.spawn)('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
|
|
81
|
+
encoding: 'utf8'
|
|
82
|
+
});
|
|
83
|
+
case 1:
|
|
84
|
+
_t = _context2.sent.stdout.trim();
|
|
85
|
+
case 2:
|
|
86
|
+
return _context2.abrupt("return", _t);
|
|
87
|
+
case 3:
|
|
88
|
+
case "end":
|
|
89
|
+
return _context2.stop();
|
|
90
|
+
}
|
|
91
|
+
}, _callee2);
|
|
92
|
+
}));
|
|
93
|
+
function getBranch() {
|
|
94
|
+
return _getBranch.apply(this, arguments);
|
|
95
|
+
}
|
|
96
|
+
return getBranch;
|
|
97
|
+
}()
|
|
98
|
+
}, {
|
|
99
|
+
key: "getCommitHash",
|
|
100
|
+
value: function () {
|
|
101
|
+
var _getCommitHash = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
102
|
+
return _regenerator["default"].wrap(function (_context3) {
|
|
103
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
104
|
+
case 0:
|
|
105
|
+
_context3.next = 1;
|
|
106
|
+
return (0, _promisifyChildProcess.spawn)('git', ['rev-parse', 'HEAD'], {
|
|
107
|
+
encoding: 'utf8'
|
|
108
|
+
});
|
|
109
|
+
case 1:
|
|
110
|
+
return _context3.abrupt("return", _context3.sent.stdout.trim());
|
|
111
|
+
case 2:
|
|
112
|
+
case "end":
|
|
113
|
+
return _context3.stop();
|
|
114
|
+
}
|
|
115
|
+
}, _callee3);
|
|
116
|
+
}));
|
|
117
|
+
function getCommitHash() {
|
|
118
|
+
return _getCommitHash.apply(this, arguments);
|
|
119
|
+
}
|
|
120
|
+
return getCommitHash;
|
|
121
|
+
}()
|
|
122
|
+
}, {
|
|
123
|
+
key: "getRegion",
|
|
124
|
+
value: function () {
|
|
125
|
+
var _getRegion = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
|
|
126
|
+
var ecr, region;
|
|
127
|
+
return _regenerator["default"].wrap(function (_context4) {
|
|
128
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
129
|
+
case 0:
|
|
130
|
+
ecr = new _clientEcr.ECRClient(this.options.awsConfig || {});
|
|
131
|
+
_context4.next = 1;
|
|
132
|
+
return ecr.config.region();
|
|
133
|
+
case 1:
|
|
134
|
+
region = _context4.sent;
|
|
135
|
+
if (region) {
|
|
136
|
+
_context4.next = 2;
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
throw new Error("Couldn't get AWS region. Provide the AWS region by either:\n- Setting the AWS_REGION environment variable\n- Putting the region in your ~/.aws/config and setting AWS_SDK_LOAD_CONFIG=true\n");
|
|
140
|
+
case 2:
|
|
141
|
+
return _context4.abrupt("return", region);
|
|
142
|
+
case 3:
|
|
143
|
+
case "end":
|
|
144
|
+
return _context4.stop();
|
|
145
|
+
}
|
|
146
|
+
}, _callee4, this);
|
|
147
|
+
}));
|
|
148
|
+
function getRegion() {
|
|
149
|
+
return _getRegion.apply(this, arguments);
|
|
150
|
+
}
|
|
151
|
+
return getRegion;
|
|
152
|
+
}()
|
|
153
|
+
}, {
|
|
154
|
+
key: "getECRHost",
|
|
155
|
+
value: function () {
|
|
156
|
+
var _getECRHost = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
|
|
157
|
+
var _t2, _t3;
|
|
158
|
+
return _regenerator["default"].wrap(function (_context5) {
|
|
159
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
160
|
+
case 0:
|
|
161
|
+
_t3 = "";
|
|
162
|
+
_context5.next = 1;
|
|
163
|
+
return this.getAWSAccountId();
|
|
164
|
+
case 1:
|
|
165
|
+
_t2 = _t3.concat.call(_t3, _context5.sent, ".dkr.ecr.");
|
|
166
|
+
_context5.next = 2;
|
|
167
|
+
return this.getRegion();
|
|
168
|
+
case 2:
|
|
169
|
+
return _context5.abrupt("return", _t2.concat.call(_t2, _context5.sent, ".amazonaws.com"));
|
|
170
|
+
case 3:
|
|
171
|
+
case "end":
|
|
172
|
+
return _context5.stop();
|
|
173
|
+
}
|
|
174
|
+
}, _callee5, this);
|
|
175
|
+
}));
|
|
176
|
+
function getECRHost() {
|
|
177
|
+
return _getECRHost.apply(this, arguments);
|
|
178
|
+
}
|
|
179
|
+
return getECRHost;
|
|
180
|
+
}()
|
|
181
|
+
}, {
|
|
182
|
+
key: "getProjectPackageJson",
|
|
183
|
+
value: function () {
|
|
184
|
+
var _getProjectPackageJson = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
|
|
185
|
+
var _yield$import, findUp, file, _t6, _t7, _t8;
|
|
186
|
+
return _regenerator["default"].wrap(function (_context7) {
|
|
187
|
+
while (1) switch (_context7.prev = _context7.next) {
|
|
188
|
+
case 0:
|
|
189
|
+
_context7.next = 1;
|
|
190
|
+
return import('find-up');
|
|
191
|
+
case 1:
|
|
192
|
+
_yield$import = _context7.sent;
|
|
193
|
+
findUp = _yield$import.findUp;
|
|
194
|
+
_context7.next = 2;
|
|
195
|
+
return findUp(/*#__PURE__*/function () {
|
|
196
|
+
var _ref2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6(dir) {
|
|
197
|
+
var _t4, _t5;
|
|
198
|
+
return _regenerator["default"].wrap(function (_context6) {
|
|
199
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
200
|
+
case 0:
|
|
201
|
+
_t4 = !/\/node_modules\//.test(_path["default"].posix.normalize(dir));
|
|
202
|
+
if (!_t4) {
|
|
203
|
+
_context6.next = 2;
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
_context6.next = 1;
|
|
207
|
+
return _promises["default"].stat(_path["default"].join(dir, 'package.json')).then(function (s) {
|
|
208
|
+
return s.isFile();
|
|
209
|
+
}, function () {
|
|
210
|
+
return false;
|
|
211
|
+
});
|
|
212
|
+
case 1:
|
|
213
|
+
_t4 = _context6.sent;
|
|
214
|
+
case 2:
|
|
215
|
+
if (!_t4) {
|
|
216
|
+
_context6.next = 3;
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
_t5 = _path["default"].join(dir, 'package.json');
|
|
220
|
+
_context6.next = 4;
|
|
221
|
+
break;
|
|
222
|
+
case 3:
|
|
223
|
+
_t5 = undefined;
|
|
224
|
+
case 4:
|
|
225
|
+
return _context6.abrupt("return", _t5);
|
|
226
|
+
case 5:
|
|
227
|
+
case "end":
|
|
228
|
+
return _context6.stop();
|
|
229
|
+
}
|
|
230
|
+
}, _callee6);
|
|
231
|
+
}));
|
|
232
|
+
return function (_x) {
|
|
233
|
+
return _ref2.apply(this, arguments);
|
|
234
|
+
};
|
|
235
|
+
}());
|
|
236
|
+
case 2:
|
|
237
|
+
file = _context7.sent;
|
|
238
|
+
if (file) {
|
|
239
|
+
_context7.next = 3;
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
throw new Error("failed to find enclosing project package.json");
|
|
243
|
+
case 3:
|
|
244
|
+
_t6 = file;
|
|
245
|
+
_t7 = JSON;
|
|
246
|
+
_context7.next = 4;
|
|
247
|
+
return _promises["default"].readFile(file, 'utf8');
|
|
248
|
+
case 4:
|
|
249
|
+
_t8 = _t7.parse.call(_t7, _context7.sent);
|
|
250
|
+
return _context7.abrupt("return", {
|
|
251
|
+
file: _t6,
|
|
252
|
+
contents: _t8
|
|
253
|
+
});
|
|
254
|
+
case 5:
|
|
255
|
+
case "end":
|
|
256
|
+
return _context7.stop();
|
|
257
|
+
}
|
|
258
|
+
}, _callee7);
|
|
259
|
+
}));
|
|
260
|
+
function getProjectPackageJson() {
|
|
261
|
+
return _getProjectPackageJson.apply(this, arguments);
|
|
262
|
+
}
|
|
263
|
+
return getProjectPackageJson;
|
|
264
|
+
}()
|
|
265
|
+
}, {
|
|
266
|
+
key: "getDockerTags",
|
|
267
|
+
value: function () {
|
|
268
|
+
var _getDockerTags = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
|
|
269
|
+
var _yield$Promise$all, _yield$Promise$all2, commitHash, branch, packageJson, base, result, _this$options$release, releaseBranches, version;
|
|
270
|
+
return _regenerator["default"].wrap(function (_context8) {
|
|
271
|
+
while (1) switch (_context8.prev = _context8.next) {
|
|
272
|
+
case 0:
|
|
273
|
+
_context8.next = 1;
|
|
274
|
+
return Promise.all([this.getCommitHash(), this.getBranch(), this.getProjectPackageJson()]);
|
|
275
|
+
case 1:
|
|
276
|
+
_yield$Promise$all = _context8.sent;
|
|
277
|
+
_yield$Promise$all2 = (0, _slicedToArray2["default"])(_yield$Promise$all, 3);
|
|
278
|
+
commitHash = _yield$Promise$all2[0];
|
|
279
|
+
branch = _yield$Promise$all2[1];
|
|
280
|
+
packageJson = _yield$Promise$all2[2];
|
|
281
|
+
base = this.options.repositoryName;
|
|
282
|
+
result = {
|
|
283
|
+
latest: base,
|
|
284
|
+
branch: "".concat(base, ":").concat(branch),
|
|
285
|
+
commitHash: "".concat(base, ":").concat(commitHash)
|
|
286
|
+
};
|
|
287
|
+
_this$options$release = this.options.releaseBranches, releaseBranches = _this$options$release === void 0 ? ['master', 'main', 'release'] : _this$options$release;
|
|
288
|
+
if (!releaseBranches.includes(branch)) {
|
|
289
|
+
_context8.next = 3;
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
version = process.env.OVERRIDE_ECR_VERSION_TAG || packageJson.contents.version;
|
|
293
|
+
if (!(typeof version !== 'string')) {
|
|
294
|
+
_context8.next = 2;
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
throw new Error("failed to get version from ".concat(_path["default"].relative(process.cwd(), packageJson.file)));
|
|
298
|
+
case 2:
|
|
299
|
+
result.version = "".concat(base, ":").concat(version);
|
|
300
|
+
case 3:
|
|
301
|
+
return _context8.abrupt("return", result);
|
|
302
|
+
case 4:
|
|
303
|
+
case "end":
|
|
304
|
+
return _context8.stop();
|
|
305
|
+
}
|
|
306
|
+
}, _callee8, this);
|
|
307
|
+
}));
|
|
308
|
+
function getDockerTags() {
|
|
309
|
+
return _getDockerTags.apply(this, arguments);
|
|
310
|
+
}
|
|
311
|
+
return getDockerTags;
|
|
312
|
+
}()
|
|
313
|
+
}, {
|
|
314
|
+
key: "push",
|
|
315
|
+
value: function () {
|
|
316
|
+
var _push = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
|
|
317
|
+
var awsConfig, _yield$Promise$all3, _yield$Promise$all4, ecrHost, commitHash, _t9;
|
|
318
|
+
return _regenerator["default"].wrap(function (_context9) {
|
|
319
|
+
while (1) switch (_context9.prev = _context9.next) {
|
|
320
|
+
case 0:
|
|
321
|
+
awsConfig = this.options.awsConfig;
|
|
322
|
+
_context9.next = 1;
|
|
323
|
+
return Promise.all([this.getECRHost(), this.getDockerTags(), (0, _loginToECR["default"])({
|
|
324
|
+
awsConfig: awsConfig
|
|
325
|
+
})]);
|
|
326
|
+
case 1:
|
|
327
|
+
_yield$Promise$all3 = _context9.sent;
|
|
328
|
+
_yield$Promise$all4 = (0, _slicedToArray2["default"])(_yield$Promise$all3, 2);
|
|
329
|
+
ecrHost = _yield$Promise$all4[0];
|
|
330
|
+
commitHash = _yield$Promise$all4[1].commitHash;
|
|
331
|
+
_context9.prev = 2;
|
|
332
|
+
_context9.next = 3;
|
|
333
|
+
return (0, _promisifyChildProcess.spawn)('docker', ['tag', commitHash, "".concat(ecrHost, "/").concat(commitHash)], {
|
|
334
|
+
stdio: 'inherit'
|
|
335
|
+
});
|
|
336
|
+
case 3:
|
|
337
|
+
_context9.next = 5;
|
|
338
|
+
break;
|
|
339
|
+
case 4:
|
|
340
|
+
_context9.prev = 4;
|
|
341
|
+
_t9 = _context9["catch"](2);
|
|
342
|
+
_context9.next = 5;
|
|
343
|
+
return (0, _promisifyChildProcess.spawn)('docker', ['tag', '-f', commitHash, "".concat(ecrHost, "/").concat(commitHash)], {
|
|
344
|
+
stdio: 'inherit'
|
|
345
|
+
});
|
|
346
|
+
case 5:
|
|
347
|
+
_context9.next = 6;
|
|
348
|
+
return (0, _promisifyChildProcess.spawn)('docker', ['push', "".concat(ecrHost, "/").concat(commitHash)], {
|
|
349
|
+
stdio: 'inherit'
|
|
350
|
+
});
|
|
351
|
+
case 6:
|
|
352
|
+
case "end":
|
|
353
|
+
return _context9.stop();
|
|
354
|
+
}
|
|
355
|
+
}, _callee9, this, [[2, 4]]);
|
|
356
|
+
}));
|
|
357
|
+
function push() {
|
|
358
|
+
return _push.apply(this, arguments);
|
|
359
|
+
}
|
|
360
|
+
return push;
|
|
361
|
+
}()
|
|
362
|
+
}, {
|
|
363
|
+
key: "release",
|
|
364
|
+
value: function () {
|
|
365
|
+
var _release = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee0() {
|
|
366
|
+
var _yield$Promise$all5, _yield$Promise$all6, commitHash, ecrHost, tags, ecr, repositoryName, _yield$ecr$send, _yield$ecr$send$image, _yield$ecr$send$image2, _yield$ecr$send$image3, image, imageManifest, _i, _arr, _tags$key, key, tag, _t0;
|
|
367
|
+
return _regenerator["default"].wrap(function (_context0) {
|
|
368
|
+
while (1) switch (_context0.prev = _context0.next) {
|
|
369
|
+
case 0:
|
|
370
|
+
_context0.next = 1;
|
|
371
|
+
return Promise.all([this.getCommitHash(), this.getECRHost(), this.getDockerTags()]);
|
|
372
|
+
case 1:
|
|
373
|
+
_yield$Promise$all5 = _context0.sent;
|
|
374
|
+
_yield$Promise$all6 = (0, _slicedToArray2["default"])(_yield$Promise$all5, 3);
|
|
375
|
+
commitHash = _yield$Promise$all6[0];
|
|
376
|
+
ecrHost = _yield$Promise$all6[1];
|
|
377
|
+
tags = _yield$Promise$all6[2];
|
|
378
|
+
ecr = new _clientEcr.ECRClient();
|
|
379
|
+
repositoryName = this.options.repositoryName;
|
|
380
|
+
_context0.next = 2;
|
|
381
|
+
return ecr.send(new _clientEcr.BatchGetImageCommand({
|
|
382
|
+
repositoryName: repositoryName,
|
|
383
|
+
imageIds: [{
|
|
384
|
+
imageTag: commitHash
|
|
385
|
+
}]
|
|
386
|
+
}));
|
|
387
|
+
case 2:
|
|
388
|
+
_yield$ecr$send = _context0.sent;
|
|
389
|
+
_yield$ecr$send$image = _yield$ecr$send.images;
|
|
390
|
+
_yield$ecr$send$image2 = _yield$ecr$send$image === void 0 ? [] : _yield$ecr$send$image;
|
|
391
|
+
_yield$ecr$send$image3 = (0, _slicedToArray2["default"])(_yield$ecr$send$image2, 1);
|
|
392
|
+
image = _yield$ecr$send$image3[0];
|
|
393
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
394
|
+
imageManifest = image === null || image === void 0 ? void 0 : image.imageManifest;
|
|
395
|
+
if (imageManifest) {
|
|
396
|
+
_context0.next = 3;
|
|
397
|
+
break;
|
|
398
|
+
}
|
|
399
|
+
throw new Error("failed to get image manifest for ".concat(repositoryName, ":").concat(commitHash));
|
|
400
|
+
case 3:
|
|
401
|
+
if (!imageManifest) {
|
|
402
|
+
_context0.next = 11;
|
|
403
|
+
break;
|
|
404
|
+
}
|
|
405
|
+
_i = 0, _arr = Object.keys(tags);
|
|
406
|
+
case 4:
|
|
407
|
+
if (!(_i < _arr.length)) {
|
|
408
|
+
_context0.next = 11;
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
key = _arr[_i];
|
|
412
|
+
if (!(key === 'latest' || key === 'commitHash')) {
|
|
413
|
+
_context0.next = 5;
|
|
414
|
+
break;
|
|
415
|
+
}
|
|
416
|
+
return _context0.abrupt("continue", 10);
|
|
417
|
+
case 5:
|
|
418
|
+
tag = (_tags$key = tags[key]) === null || _tags$key === void 0 ? void 0 : _tags$key.replace(/^[^:]+:?/, '');
|
|
419
|
+
if (tag) {
|
|
420
|
+
_context0.next = 6;
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
return _context0.abrupt("continue", 10);
|
|
424
|
+
case 6:
|
|
425
|
+
// eslint-disable-next-line no-console
|
|
426
|
+
console.error("Adding tag ".concat(ecrHost, "/").concat(tags[key]));
|
|
427
|
+
_context0.prev = 7;
|
|
428
|
+
_context0.next = 8;
|
|
429
|
+
return ecr.send(new _clientEcr.PutImageCommand({
|
|
430
|
+
repositoryName: repositoryName,
|
|
431
|
+
imageManifest: imageManifest,
|
|
432
|
+
imageTag: tag.substring(tag.indexOf(':') + 1)
|
|
433
|
+
}));
|
|
434
|
+
case 8:
|
|
435
|
+
_context0.next = 10;
|
|
436
|
+
break;
|
|
437
|
+
case 9:
|
|
438
|
+
_context0.prev = 9;
|
|
439
|
+
_t0 = _context0["catch"](7);
|
|
440
|
+
if (!(_t0 instanceof Object && 'code' in _t0 && _t0.code !== 'ImageAlreadyExistsException')) {
|
|
441
|
+
_context0.next = 10;
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
throw _t0;
|
|
445
|
+
case 10:
|
|
446
|
+
_i++;
|
|
447
|
+
_context0.next = 4;
|
|
448
|
+
break;
|
|
449
|
+
case 11:
|
|
450
|
+
case "end":
|
|
451
|
+
return _context0.stop();
|
|
452
|
+
}
|
|
453
|
+
}, _callee0, this, [[7, 9]]);
|
|
454
|
+
}));
|
|
455
|
+
function release() {
|
|
456
|
+
return _release.apply(this, arguments);
|
|
457
|
+
}
|
|
458
|
+
return release;
|
|
459
|
+
}()
|
|
460
|
+
}, {
|
|
461
|
+
key: "getNpmToken",
|
|
462
|
+
value: function () {
|
|
463
|
+
var _getNpmToken = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee1() {
|
|
464
|
+
var env,
|
|
465
|
+
NPM_TOKEN,
|
|
466
|
+
homedir,
|
|
467
|
+
npmrc,
|
|
468
|
+
match,
|
|
469
|
+
_args1 = arguments,
|
|
470
|
+
_t1;
|
|
471
|
+
return _regenerator["default"].wrap(function (_context1) {
|
|
472
|
+
while (1) switch (_context1.prev = _context1.next) {
|
|
473
|
+
case 0:
|
|
474
|
+
env = _args1.length > 0 && _args1[0] !== undefined ? _args1[0] : process.env;
|
|
475
|
+
NPM_TOKEN = env.NPM_TOKEN;
|
|
476
|
+
if (!NPM_TOKEN) {
|
|
477
|
+
_context1.next = 1;
|
|
478
|
+
break;
|
|
479
|
+
}
|
|
480
|
+
return _context1.abrupt("return", NPM_TOKEN);
|
|
481
|
+
case 1:
|
|
482
|
+
_context1.prev = 1;
|
|
483
|
+
homedir = _os["default"].homedir();
|
|
484
|
+
_context1.next = 2;
|
|
485
|
+
return _promises["default"].readFile("".concat(homedir, "/.npmrc"), 'utf8');
|
|
486
|
+
case 2:
|
|
487
|
+
npmrc = _context1.sent;
|
|
488
|
+
match = /registry\.npmjs\.org\/:_authToken=(.+)/.exec(npmrc);
|
|
489
|
+
if (!match) {
|
|
490
|
+
_context1.next = 3;
|
|
491
|
+
break;
|
|
492
|
+
}
|
|
493
|
+
return _context1.abrupt("return", match[1]);
|
|
494
|
+
case 3:
|
|
495
|
+
_context1.next = 5;
|
|
496
|
+
break;
|
|
497
|
+
case 4:
|
|
498
|
+
_context1.prev = 4;
|
|
499
|
+
_t1 = _context1["catch"](1);
|
|
500
|
+
case 5:
|
|
501
|
+
throw new Error('Missing process.env.NPM_TOKEN or entry in ~/.npmrc');
|
|
502
|
+
case 6:
|
|
503
|
+
case "end":
|
|
504
|
+
return _context1.stop();
|
|
505
|
+
}
|
|
506
|
+
}, _callee1, null, [[1, 4]]);
|
|
507
|
+
}));
|
|
508
|
+
function getNpmToken() {
|
|
509
|
+
return _getNpmToken.apply(this, arguments);
|
|
510
|
+
}
|
|
511
|
+
return getNpmToken;
|
|
512
|
+
}()
|
|
513
|
+
}]);
|
|
514
|
+
}();
|
|
515
|
+
//# sourceMappingURL=ECRDeployer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ECRDeployer.js","names":["_clientEcr","require","_promisifyChildProcess","_promises","_interopRequireDefault","_path","_clientSts","_once","_loginToECR","_os","ECRDeployer","exports","options","_this","_classCallCheck2","_defineProperty2","once","_asyncToGenerator2","_regenerator","mark","_callee","sts","_yield$sts$send","Account","wrap","_context","prev","next","STSClient","awsConfig","send","GetCallerIdentityCommand","sent","Error","abrupt","stop","_createClass2","key","value","_getBranch","_callee2","_t","_context2","process","env","OVERRIDE_ECR_BRANCH_TAG","spawn","encoding","stdout","trim","getBranch","apply","arguments","_getCommitHash","_callee3","_context3","getCommitHash","_getRegion","_callee4","ecr","region","_context4","ECRClient","config","getRegion","_getECRHost","_callee5","_t2","_t3","_context5","getAWSAccountId","concat","call","getECRHost","_getProjectPackageJson","_callee7","_yield$import","findUp","file","_t6","_t7","_t8","_context7","_ref2","_callee6","dir","_t4","_t5","_context6","test","path","posix","normalize","fs","stat","join","then","s","isFile","undefined","_x","JSON","readFile","parse","contents","getProjectPackageJson","_getDockerTags","_callee8","_yield$Promise$all","_yield$Promise$all2","commitHash","branch","packageJson","base","result","_this$options$release","releaseBranches","version","_context8","Promise","all","_slicedToArray2","repositoryName","latest","includes","OVERRIDE_ECR_VERSION_TAG","relative","cwd","getDockerTags","_push","_callee9","_yield$Promise$all3","_yield$Promise$all4","ecrHost","_t9","_context9","loginToECR","stdio","push","_release","_callee0","_yield$Promise$all5","_yield$Promise$all6","tags","_yield$ecr$send","_yield$ecr$send$image","_yield$ecr$send$image2","_yield$ecr$send$image3","image","imageManifest","_i","_arr","_tags$key","tag","_t0","_context0","BatchGetImageCommand","imageIds","imageTag","images","Object","keys","length","replace","console","error","PutImageCommand","substring","indexOf","code","release","_getNpmToken","_callee1","NPM_TOKEN","homedir","npmrc","match","_args1","_t1","_context1","os","exec","getNpmToken"],"sources":["src/ECRDeployer.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/ECRDeployer.mjs
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { BatchGetImageCommand, ECRClient, PutImageCommand } from '@aws-sdk/client-ecr';
|
|
2
|
+
import { spawn } from 'promisify-child-process';
|
|
3
|
+
import fs from 'fs/promises';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { GetCallerIdentityCommand, STSClient } from '@aws-sdk/client-sts';
|
|
6
|
+
import { once } from "./once.mjs";
|
|
7
|
+
import loginToECR from "./loginToECR.mjs";
|
|
8
|
+
import os from 'os';
|
|
9
|
+
/**
|
|
10
|
+
* Class that implements our conventional process for deploying docker images to ECR.
|
|
11
|
+
*
|
|
12
|
+
* The CI build step should build the docker image (you may want to use {@link getNpmToken}
|
|
13
|
+
* to pass an `NPM_TOKEN` build arg) and then call {@link push} to push the image to
|
|
14
|
+
* ECR tagged with the git commit hash.
|
|
15
|
+
*
|
|
16
|
+
* The CI release step should call {@link release} to add tags for the git branch and
|
|
17
|
+
* the `version` in your `package.json`.
|
|
18
|
+
*
|
|
19
|
+
* You may use the `OVERRIDE_ECR_BRANCH_TAG` and `OVERRIDE_ECR_VERSION_TAG` environment
|
|
20
|
+
* variables to force specific tags for the branch and version.
|
|
21
|
+
*/
|
|
22
|
+
export class ECRDeployer {
|
|
23
|
+
options;
|
|
24
|
+
constructor(options) {
|
|
25
|
+
this.options = options;
|
|
26
|
+
}
|
|
27
|
+
async getBranch() {
|
|
28
|
+
return process.env.OVERRIDE_ECR_BRANCH_TAG || (await spawn('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
|
|
29
|
+
encoding: 'utf8'
|
|
30
|
+
})).stdout.trim();
|
|
31
|
+
}
|
|
32
|
+
async getCommitHash() {
|
|
33
|
+
return (await spawn('git', ['rev-parse', 'HEAD'], {
|
|
34
|
+
encoding: 'utf8'
|
|
35
|
+
})).stdout.trim();
|
|
36
|
+
}
|
|
37
|
+
getAWSAccountId = once(async () => {
|
|
38
|
+
const sts = new STSClient(this.options.awsConfig || {});
|
|
39
|
+
const {
|
|
40
|
+
Account
|
|
41
|
+
} = await sts.send(new GetCallerIdentityCommand());
|
|
42
|
+
if (!Account) throw new Error(`failed to get AWS account id`);
|
|
43
|
+
return Account;
|
|
44
|
+
});
|
|
45
|
+
async getRegion() {
|
|
46
|
+
const ecr = new ECRClient(this.options.awsConfig || {});
|
|
47
|
+
const region = await ecr.config.region();
|
|
48
|
+
if (!region) {
|
|
49
|
+
throw new Error(`Couldn't get AWS region. Provide the AWS region by either:
|
|
50
|
+
- Setting the AWS_REGION environment variable
|
|
51
|
+
- Putting the region in your ~/.aws/config and setting AWS_SDK_LOAD_CONFIG=true
|
|
52
|
+
`);
|
|
53
|
+
}
|
|
54
|
+
return region;
|
|
55
|
+
}
|
|
56
|
+
async getECRHost() {
|
|
57
|
+
return `${await this.getAWSAccountId()}.dkr.ecr.${await this.getRegion()}.amazonaws.com`;
|
|
58
|
+
}
|
|
59
|
+
async getProjectPackageJson() {
|
|
60
|
+
const {
|
|
61
|
+
findUp
|
|
62
|
+
} = await import('find-up');
|
|
63
|
+
const file = await findUp(async dir => !/\/node_modules\//.test(path.posix.normalize(dir)) && (await fs.stat(path.join(dir, 'package.json')).then(s => s.isFile(), () => false)) ? path.join(dir, 'package.json') : undefined);
|
|
64
|
+
if (!file) {
|
|
65
|
+
throw new Error(`failed to find enclosing project package.json`);
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
file,
|
|
69
|
+
contents: JSON.parse(await fs.readFile(file, 'utf8'))
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
async getDockerTags() {
|
|
73
|
+
const [commitHash, branch, packageJson] = await Promise.all([this.getCommitHash(), this.getBranch(), this.getProjectPackageJson()]);
|
|
74
|
+
const base = this.options.repositoryName;
|
|
75
|
+
const result = {
|
|
76
|
+
latest: base,
|
|
77
|
+
branch: `${base}:${branch}`,
|
|
78
|
+
commitHash: `${base}:${commitHash}`
|
|
79
|
+
};
|
|
80
|
+
const {
|
|
81
|
+
releaseBranches = ['master', 'main', 'release']
|
|
82
|
+
} = this.options;
|
|
83
|
+
if (releaseBranches.includes(branch)) {
|
|
84
|
+
const version = process.env.OVERRIDE_ECR_VERSION_TAG || packageJson.contents.version;
|
|
85
|
+
if (typeof version !== 'string') {
|
|
86
|
+
throw new Error(`failed to get version from ${path.relative(process.cwd(), packageJson.file)}`);
|
|
87
|
+
}
|
|
88
|
+
result.version = `${base}:${version}`;
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
async push() {
|
|
93
|
+
const {
|
|
94
|
+
awsConfig
|
|
95
|
+
} = this.options;
|
|
96
|
+
const [ecrHost, {
|
|
97
|
+
commitHash
|
|
98
|
+
}] = await Promise.all([this.getECRHost(), this.getDockerTags(), loginToECR({
|
|
99
|
+
awsConfig
|
|
100
|
+
})]);
|
|
101
|
+
try {
|
|
102
|
+
await spawn('docker', ['tag', commitHash, `${ecrHost}/${commitHash}`], {
|
|
103
|
+
stdio: 'inherit'
|
|
104
|
+
});
|
|
105
|
+
} catch {
|
|
106
|
+
await spawn('docker', ['tag', '-f', commitHash, `${ecrHost}/${commitHash}`], {
|
|
107
|
+
stdio: 'inherit'
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
await spawn('docker', ['push', `${ecrHost}/${commitHash}`], {
|
|
111
|
+
stdio: 'inherit'
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async release() {
|
|
115
|
+
const [commitHash, ecrHost, tags] = await Promise.all([this.getCommitHash(), this.getECRHost(), this.getDockerTags()]);
|
|
116
|
+
const ecr = new ECRClient();
|
|
117
|
+
const {
|
|
118
|
+
repositoryName
|
|
119
|
+
} = this.options;
|
|
120
|
+
const {
|
|
121
|
+
images: [image] = []
|
|
122
|
+
} = await ecr.send(new BatchGetImageCommand({
|
|
123
|
+
repositoryName,
|
|
124
|
+
imageIds: [{
|
|
125
|
+
imageTag: commitHash
|
|
126
|
+
}]
|
|
127
|
+
}));
|
|
128
|
+
|
|
129
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
130
|
+
const imageManifest = image === null || image === void 0 ? void 0 : image.imageManifest;
|
|
131
|
+
if (!imageManifest) {
|
|
132
|
+
throw new Error(`failed to get image manifest for ${repositoryName}:${commitHash}`);
|
|
133
|
+
}
|
|
134
|
+
if (imageManifest) {
|
|
135
|
+
// add other tags to ECR
|
|
136
|
+
for (const key of Object.keys(tags)) {
|
|
137
|
+
var _tags$key;
|
|
138
|
+
if (key === 'latest' || key === 'commitHash') continue;
|
|
139
|
+
const tag = (_tags$key = tags[key]) === null || _tags$key === void 0 ? void 0 : _tags$key.replace(/^[^:]+:?/, '');
|
|
140
|
+
if (!tag) continue;
|
|
141
|
+
// eslint-disable-next-line no-console
|
|
142
|
+
console.error(`Adding tag ${ecrHost}/${tags[key]}`);
|
|
143
|
+
try {
|
|
144
|
+
await ecr.send(new PutImageCommand({
|
|
145
|
+
repositoryName,
|
|
146
|
+
imageManifest,
|
|
147
|
+
imageTag: tag.substring(tag.indexOf(':') + 1)
|
|
148
|
+
}));
|
|
149
|
+
} catch (error) {
|
|
150
|
+
if (error instanceof Object && 'code' in error && error.code !== 'ImageAlreadyExistsException') {
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async getNpmToken(env = process.env) {
|
|
158
|
+
const {
|
|
159
|
+
NPM_TOKEN
|
|
160
|
+
} = env;
|
|
161
|
+
if (NPM_TOKEN) return NPM_TOKEN;
|
|
162
|
+
try {
|
|
163
|
+
const homedir = os.homedir();
|
|
164
|
+
const npmrc = await fs.readFile(`${homedir}/.npmrc`, 'utf8');
|
|
165
|
+
const match = /registry\.npmjs\.org\/:_authToken=(.+)/.exec(npmrc);
|
|
166
|
+
if (match) return match[1];
|
|
167
|
+
} catch {
|
|
168
|
+
// ignore
|
|
169
|
+
}
|
|
170
|
+
throw new Error('Missing process.env.NPM_TOKEN or entry in ~/.npmrc');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=ECRDeployer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ECRDeployer.mjs","names":["BatchGetImageCommand","ECRClient","PutImageCommand","spawn","fs","path","GetCallerIdentityCommand","STSClient","once","loginToECR","os","ECRDeployer","options","constructor","getBranch","process","env","OVERRIDE_ECR_BRANCH_TAG","encoding","stdout","trim","getCommitHash","getAWSAccountId","sts","awsConfig","Account","send","Error","getRegion","ecr","region","config","getECRHost","getProjectPackageJson","findUp","file","dir","test","posix","normalize","stat","join","then","s","isFile","undefined","contents","JSON","parse","readFile","getDockerTags","commitHash","branch","packageJson","Promise","all","base","repositoryName","result","latest","releaseBranches","includes","version","OVERRIDE_ECR_VERSION_TAG","relative","cwd","push","ecrHost","stdio","release","tags","images","image","imageIds","imageTag","imageManifest","key","Object","keys","_tags$key","tag","replace","console","error","substring","indexOf","code","getNpmToken","NPM_TOKEN","homedir","npmrc","match","exec"],"sources":["src/ECRDeployer.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/index.d.mts
CHANGED
|
@@ -9,4 +9,5 @@ export { default as checkECRRepositoryPolicy } from "./checkECRRepositoryPolicy.
|
|
|
9
9
|
export { default as checkECRImageAccess } from "./checkECRImageAccess.mjs";
|
|
10
10
|
export { default as formatECRRepositoryHostname } from "./formatECRRepositoryHostname.mjs";
|
|
11
11
|
export { default as formatECRImageUri } from "./formatECRImageUri.mjs";
|
|
12
|
+
export { ECRDeployer, type ECRDeployerOptions } from "./ECRDeployer.mjs";
|
|
12
13
|
//# sourceMappingURL=index.d.mts.map
|
package/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":["default","copyECRImage","ecrImageExists","loginToECR","tagECRImage","parseECRImageUri","parseECRRepositoryHostname","upsertECRRepository","checkECRRepositoryPolicy","checkECRImageAccess","formatECRRepositoryHostname","formatECRImageUri"],"sources":["src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,OAAO,IAAIC,YAAY;AAChC,SAASD,OAAO,IAAIE,cAAc;AAClC,SAASF,OAAO,IAAIG,UAAU;AAC9B,SAASH,OAAO,IAAII,WAAW;AAC/B,SAASJ,OAAO,IAAIK,gBAAgB;AACpC,SAASL,OAAO,IAAIM,0BAA0B;AAC9C,SAASN,OAAO,IAAIO,mBAAmB;AACvC,SAASP,OAAO,IAAIQ,wBAAwB;AAC5C,SAASR,OAAO,IAAIS,mBAAmB;AACvC,SAAST,OAAO,IAAIU,2BAA2B;AAC/C,SAASV,OAAO,IAAIW,iBAAiB","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":["default","copyECRImage","ecrImageExists","loginToECR","tagECRImage","parseECRImageUri","parseECRRepositoryHostname","upsertECRRepository","checkECRRepositoryPolicy","checkECRImageAccess","formatECRRepositoryHostname","formatECRImageUri","ECRDeployer","ECRDeployerOptions"],"sources":["src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,OAAO,IAAIC,YAAY;AAChC,SAASD,OAAO,IAAIE,cAAc;AAClC,SAASF,OAAO,IAAIG,UAAU;AAC9B,SAASH,OAAO,IAAII,WAAW;AAC/B,SAASJ,OAAO,IAAIK,gBAAgB;AACpC,SAASL,OAAO,IAAIM,0BAA0B;AAC9C,SAASN,OAAO,IAAIO,mBAAmB;AACvC,SAASP,OAAO,IAAIQ,wBAAwB;AAC5C,SAASR,OAAO,IAAIS,mBAAmB;AACvC,SAAST,OAAO,IAAIU,2BAA2B;AAC/C,SAASV,OAAO,IAAIW,iBAAiB;AACrC,SAASC,WAAW,EAAE,KAAKC,kBAAkB","ignoreList":[]}
|
package/index.d.ts
CHANGED
|
@@ -9,4 +9,5 @@ export { default as checkECRRepositoryPolicy } from "./checkECRRepositoryPolicy.
|
|
|
9
9
|
export { default as checkECRImageAccess } from "./checkECRImageAccess.js";
|
|
10
10
|
export { default as formatECRRepositoryHostname } from "./formatECRRepositoryHostname.js";
|
|
11
11
|
export { default as formatECRImageUri } from "./formatECRImageUri.js";
|
|
12
|
+
export { ECRDeployer, type ECRDeployerOptions } from "./ECRDeployer.js";
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
package/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["default","copyECRImage","ecrImageExists","loginToECR","tagECRImage","parseECRImageUri","parseECRRepositoryHostname","upsertECRRepository","checkECRRepositoryPolicy","checkECRImageAccess","formatECRRepositoryHostname","formatECRImageUri"],"sources":["src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,OAAO,IAAIC,YAAY;AAChC,SAASD,OAAO,IAAIE,cAAc;AAClC,SAASF,OAAO,IAAIG,UAAU;AAC9B,SAASH,OAAO,IAAII,WAAW;AAC/B,SAASJ,OAAO,IAAIK,gBAAgB;AACpC,SAASL,OAAO,IAAIM,0BAA0B;AAC9C,SAASN,OAAO,IAAIO,mBAAmB;AACvC,SAASP,OAAO,IAAIQ,wBAAwB;AAC5C,SAASR,OAAO,IAAIS,mBAAmB;AACvC,SAAST,OAAO,IAAIU,2BAA2B;AAC/C,SAASV,OAAO,IAAIW,iBAAiB","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["default","copyECRImage","ecrImageExists","loginToECR","tagECRImage","parseECRImageUri","parseECRRepositoryHostname","upsertECRRepository","checkECRRepositoryPolicy","checkECRImageAccess","formatECRRepositoryHostname","formatECRImageUri","ECRDeployer","ECRDeployerOptions"],"sources":["src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,OAAO,IAAIC,YAAY;AAChC,SAASD,OAAO,IAAIE,cAAc;AAClC,SAASF,OAAO,IAAIG,UAAU;AAC9B,SAASH,OAAO,IAAII,WAAW;AAC/B,SAASJ,OAAO,IAAIK,gBAAgB;AACpC,SAASL,OAAO,IAAIM,0BAA0B;AAC9C,SAASN,OAAO,IAAIO,mBAAmB;AACvC,SAASP,OAAO,IAAIQ,wBAAwB;AAC5C,SAASR,OAAO,IAAIS,mBAAmB;AACvC,SAAST,OAAO,IAAIU,2BAA2B;AAC/C,SAASV,OAAO,IAAIW,iBAAiB;AACrC,SAASC,WAAW,EAAE,KAAKC,kBAAkB","ignoreList":[]}
|
package/index.js
CHANGED
|
@@ -4,6 +4,12 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
+
Object.defineProperty(exports, "ECRDeployer", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function get() {
|
|
10
|
+
return _ECRDeployer.ECRDeployer;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
7
13
|
Object.defineProperty(exports, "checkECRImageAccess", {
|
|
8
14
|
enumerable: true,
|
|
9
15
|
get: function get() {
|
|
@@ -81,4 +87,5 @@ var _checkECRRepositoryPolicy = _interopRequireDefault(require("./checkECRReposi
|
|
|
81
87
|
var _checkECRImageAccess = _interopRequireDefault(require("./checkECRImageAccess.js"));
|
|
82
88
|
var _formatECRRepositoryHostname = _interopRequireDefault(require("./formatECRRepositoryHostname.js"));
|
|
83
89
|
var _formatECRImageUri = _interopRequireDefault(require("./formatECRImageUri.js"));
|
|
90
|
+
var _ECRDeployer = require("./ECRDeployer.js");
|
|
84
91
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_copyECRImage","_interopRequireDefault","require","_ecrImageExists","_loginToECR","_tagECRImage","_parseECRImageUri","_parseECRRepositoryHostname","_upsertECRRepository","_checkECRRepositoryPolicy","_checkECRImageAccess","_formatECRRepositoryHostname","_formatECRImageUri"],"sources":["src/index.ts"],"sourcesContent":[null],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":["_copyECRImage","_interopRequireDefault","require","_ecrImageExists","_loginToECR","_tagECRImage","_parseECRImageUri","_parseECRRepositoryHostname","_upsertECRRepository","_checkECRRepositoryPolicy","_checkECRImageAccess","_formatECRRepositoryHostname","_formatECRImageUri","_ECRDeployer"],"sources":["src/index.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,WAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,YAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,iBAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,2BAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,oBAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,yBAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,oBAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,4BAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,kBAAA,GAAAX,sBAAA,CAAAC,OAAA;AACA,IAAAW,YAAA,GAAAX,OAAA","ignoreList":[]}
|
package/index.mjs
CHANGED
|
@@ -9,4 +9,5 @@ export { default as checkECRRepositoryPolicy } from "./checkECRRepositoryPolicy.
|
|
|
9
9
|
export { default as checkECRImageAccess } from "./checkECRImageAccess.mjs";
|
|
10
10
|
export { default as formatECRRepositoryHostname } from "./formatECRRepositoryHostname.mjs";
|
|
11
11
|
export { default as formatECRImageUri } from "./formatECRImageUri.mjs";
|
|
12
|
+
export { ECRDeployer } from "./ECRDeployer.mjs";
|
|
12
13
|
//# sourceMappingURL=index.mjs.map
|
package/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["default","copyECRImage","ecrImageExists","loginToECR","tagECRImage","parseECRImageUri","parseECRRepositoryHostname","upsertECRRepository","checkECRRepositoryPolicy","checkECRImageAccess","formatECRRepositoryHostname","formatECRImageUri"],"sources":["src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,OAAO,IAAIC,YAAY;AAChC,SAASD,OAAO,IAAIE,cAAc;AAClC,SAASF,OAAO,IAAIG,UAAU;AAC9B,SAASH,OAAO,IAAII,WAAW;AAC/B,SAASJ,OAAO,IAAIK,gBAAgB;AACpC,SAASL,OAAO,IAAIM,0BAA0B;AAC9C,SAASN,OAAO,IAAIO,mBAAmB;AACvC,SAASP,OAAO,IAAIQ,wBAAwB;AAC5C,SAASR,OAAO,IAAIS,mBAAmB;AACvC,SAAST,OAAO,IAAIU,2BAA2B;AAC/C,SAASV,OAAO,IAAIW,iBAAiB","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["default","copyECRImage","ecrImageExists","loginToECR","tagECRImage","parseECRImageUri","parseECRRepositoryHostname","upsertECRRepository","checkECRRepositoryPolicy","checkECRImageAccess","formatECRRepositoryHostname","formatECRImageUri","ECRDeployer"],"sources":["src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,OAAO,IAAIC,YAAY;AAChC,SAASD,OAAO,IAAIE,cAAc;AAClC,SAASF,OAAO,IAAIG,UAAU;AAC9B,SAASH,OAAO,IAAII,WAAW;AAC/B,SAASJ,OAAO,IAAIK,gBAAgB;AACpC,SAASL,OAAO,IAAIM,0BAA0B;AAC9C,SAASN,OAAO,IAAIO,mBAAmB;AACvC,SAASP,OAAO,IAAIQ,wBAAwB;AAC5C,SAASR,OAAO,IAAIS,mBAAmB;AACvC,SAAST,OAAO,IAAIU,2BAA2B;AAC/C,SAASV,OAAO,IAAIW,iBAAiB;AACrC,SAASC,WAAW","ignoreList":[]}
|
package/once.d.mts
ADDED
package/once.d.mts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"once.d.mts","names":["once","fn","args","Args","Ret"],"sources":["src/once.ts"],"sourcesContent":[null],"mappings":"AAAA,wBAAgBA,IAAI,CAAC,aAAa,OAAO,EAAE,EAAE,GAAG,CAAAA,CAAEC,EAAE,EAAE,CAAC,GAAGC,IAAI,EAAEC,IAAI,KAAKC,GAAG,IAElE,GAAGF,IAAA,EAAMC,IAAI,KAAAC,GAAA","ignoreList":[]}
|
package/once.d.ts
ADDED
package/once.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"once.d.ts","names":["once","fn","args","Args","Ret"],"sources":["src/once.ts"],"sourcesContent":[null],"mappings":"AAAA,wBAAgBA,IAAI,CAAC,aAAa,OAAO,EAAE,EAAE,GAAG,CAAAA,CAAEC,EAAE,EAAE,CAAC,GAAGC,IAAI,EAAEC,IAAI,KAAKC,GAAG,IAElE,GAAGF,IAAA,EAAMC,IAAI,KAAAC,GAAA","ignoreList":[]}
|
package/once.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.once = once;
|
|
7
|
+
function once(fn) {
|
|
8
|
+
var result;
|
|
9
|
+
return function () {
|
|
10
|
+
if (!result) result = [fn.apply(void 0, arguments)];
|
|
11
|
+
return result[0];
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=once.js.map
|
package/once.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"once.js","names":["once","fn","result","apply","arguments"],"sources":["src/once.ts"],"sourcesContent":[null],"mappings":";;;;;;AAAO,SAASA,IAAIA,CAA8BC,EAA0B,EAAE;EAC5E,IAAIC,MAAyB;EAC7B,OAAO,YAAmB;IACxB,IAAI,CAACA,MAAM,EAAEA,MAAM,GAAG,CAACD,EAAE,CAAAE,KAAA,SAAAC,SAAQ,CAAC,CAAC;IACnC,OAAOF,MAAM,CAAC,CAAC,CAAC;EAClB,CAAC;AACH","ignoreList":[]}
|
package/once.mjs
ADDED
package/once.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"once.mjs","names":["once","fn","result","args"],"sources":["src/once.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,SAASA,IAAIA,CAA8BC,EAA0B,EAAE;EAC5E,IAAIC,MAAyB;EAC7B,OAAO,CAAC,GAAGC,IAAU,KAAK;IACxB,IAAI,CAACD,MAAM,EAAEA,MAAM,GAAG,CAACD,EAAE,CAAC,GAAGE,IAAI,CAAC,CAAC;IACnC,OAAOD,MAAM,CAAC,CAAC,CAAC;EAClB,CAAC;AACH","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jcoreio/aws-ecr-utils",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.1",
|
|
4
4
|
"description": "utilities for working with AWS Elastic Container Registry",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"repository": {
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"@aws-sdk/client-sts": "^3.577.0",
|
|
24
24
|
"@babel/runtime": "^7.26.0",
|
|
25
25
|
"base64-js": "^1.5.1",
|
|
26
|
+
"find-up": "^8.0.0",
|
|
26
27
|
"inquirer": "^8.2.6",
|
|
27
28
|
"log4jcore": "^4.8.0",
|
|
28
29
|
"promisify-child-process": "^5.0.0",
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BatchGetImageCommand,
|
|
3
|
+
ECRClient,
|
|
4
|
+
ECRClientConfig,
|
|
5
|
+
PutImageCommand,
|
|
6
|
+
} from '@aws-sdk/client-ecr'
|
|
7
|
+
import { spawn } from 'promisify-child-process'
|
|
8
|
+
import fs from 'fs/promises'
|
|
9
|
+
import path from 'path'
|
|
10
|
+
import { GetCallerIdentityCommand, STSClient } from '@aws-sdk/client-sts'
|
|
11
|
+
import { once } from './once.ts'
|
|
12
|
+
import loginToECR from './loginToECR.ts'
|
|
13
|
+
import os from 'os'
|
|
14
|
+
|
|
15
|
+
export interface ECRDeployerOptions {
|
|
16
|
+
awsConfig?: ECRClientConfig
|
|
17
|
+
/**
|
|
18
|
+
* {@link ECRDeployer#release} will only add a version tag if the current git branch
|
|
19
|
+
* is one of these branches (defaults to `['master', 'main', 'release']`)
|
|
20
|
+
*/
|
|
21
|
+
releaseBranches?: string[]
|
|
22
|
+
/**
|
|
23
|
+
* The name of the ECR repository
|
|
24
|
+
*/
|
|
25
|
+
repositoryName: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Class that implements our conventional process for deploying docker images to ECR.
|
|
30
|
+
*
|
|
31
|
+
* The CI build step should build the docker image (you may want to use {@link getNpmToken}
|
|
32
|
+
* to pass an `NPM_TOKEN` build arg) and then call {@link push} to push the image to
|
|
33
|
+
* ECR tagged with the git commit hash.
|
|
34
|
+
*
|
|
35
|
+
* The CI release step should call {@link release} to add tags for the git branch and
|
|
36
|
+
* the `version` in your `package.json`.
|
|
37
|
+
*
|
|
38
|
+
* You may use the `OVERRIDE_ECR_BRANCH_TAG` and `OVERRIDE_ECR_VERSION_TAG` environment
|
|
39
|
+
* variables to force specific tags for the branch and version.
|
|
40
|
+
*/
|
|
41
|
+
export class ECRDeployer {
|
|
42
|
+
options: ECRDeployerOptions
|
|
43
|
+
|
|
44
|
+
constructor(options: ECRDeployerOptions) {
|
|
45
|
+
this.options = options
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async getBranch() {
|
|
49
|
+
return (
|
|
50
|
+
process.env.OVERRIDE_ECR_BRANCH_TAG ||
|
|
51
|
+
(
|
|
52
|
+
await spawn('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
|
|
53
|
+
encoding: 'utf8',
|
|
54
|
+
})
|
|
55
|
+
).stdout.trim()
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async getCommitHash() {
|
|
60
|
+
return (
|
|
61
|
+
await spawn('git', ['rev-parse', 'HEAD'], { encoding: 'utf8' })
|
|
62
|
+
).stdout.trim()
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private getAWSAccountId = once(async () => {
|
|
66
|
+
const sts = new STSClient(this.options.awsConfig || {})
|
|
67
|
+
const { Account } = await sts.send(new GetCallerIdentityCommand())
|
|
68
|
+
if (!Account) throw new Error(`failed to get AWS account id`)
|
|
69
|
+
return Account
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
private async getRegion() {
|
|
73
|
+
const ecr = new ECRClient(this.options.awsConfig || {})
|
|
74
|
+
const region = await ecr.config.region()
|
|
75
|
+
if (!region) {
|
|
76
|
+
throw new Error(`Couldn't get AWS region. Provide the AWS region by either:
|
|
77
|
+
- Setting the AWS_REGION environment variable
|
|
78
|
+
- Putting the region in your ~/.aws/config and setting AWS_SDK_LOAD_CONFIG=true
|
|
79
|
+
`)
|
|
80
|
+
}
|
|
81
|
+
return region
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private async getECRHost() {
|
|
85
|
+
return `${await this.getAWSAccountId()}.dkr.ecr.${await this.getRegion()}.amazonaws.com`
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
private async getProjectPackageJson() {
|
|
89
|
+
const { findUp } = await import('find-up')
|
|
90
|
+
|
|
91
|
+
const file = await findUp(async (dir) =>
|
|
92
|
+
(
|
|
93
|
+
!/\/node_modules\//.test(path.posix.normalize(dir)) &&
|
|
94
|
+
(await fs.stat(path.join(dir, 'package.json')).then(
|
|
95
|
+
(s) => s.isFile(),
|
|
96
|
+
() => false
|
|
97
|
+
))
|
|
98
|
+
) ?
|
|
99
|
+
path.join(dir, 'package.json')
|
|
100
|
+
: undefined
|
|
101
|
+
)
|
|
102
|
+
if (!file) {
|
|
103
|
+
throw new Error(`failed to find enclosing project package.json`)
|
|
104
|
+
}
|
|
105
|
+
return { file, contents: JSON.parse(await fs.readFile(file, 'utf8')) }
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async getDockerTags(): Promise<{
|
|
109
|
+
latest: string
|
|
110
|
+
branch: string
|
|
111
|
+
commitHash: string
|
|
112
|
+
version?: string
|
|
113
|
+
}> {
|
|
114
|
+
const [commitHash, branch, packageJson] = await Promise.all([
|
|
115
|
+
this.getCommitHash(),
|
|
116
|
+
this.getBranch(),
|
|
117
|
+
this.getProjectPackageJson(),
|
|
118
|
+
])
|
|
119
|
+
const base = this.options.repositoryName
|
|
120
|
+
const result: {
|
|
121
|
+
latest: string
|
|
122
|
+
branch: string
|
|
123
|
+
commitHash: string
|
|
124
|
+
version?: string
|
|
125
|
+
} = {
|
|
126
|
+
latest: base,
|
|
127
|
+
branch: `${base}:${branch}`,
|
|
128
|
+
commitHash: `${base}:${commitHash}`,
|
|
129
|
+
}
|
|
130
|
+
const { releaseBranches = ['master', 'main', 'release'] } = this.options
|
|
131
|
+
if (releaseBranches.includes(branch)) {
|
|
132
|
+
const version =
|
|
133
|
+
process.env.OVERRIDE_ECR_VERSION_TAG || packageJson.contents.version
|
|
134
|
+
if (typeof version !== 'string') {
|
|
135
|
+
throw new Error(
|
|
136
|
+
`failed to get version from ${path.relative(process.cwd(), packageJson.file)}`
|
|
137
|
+
)
|
|
138
|
+
}
|
|
139
|
+
result.version = `${base}:${version}`
|
|
140
|
+
}
|
|
141
|
+
return result
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async push() {
|
|
145
|
+
const { awsConfig } = this.options
|
|
146
|
+
const [ecrHost, { commitHash }] = await Promise.all([
|
|
147
|
+
this.getECRHost(),
|
|
148
|
+
this.getDockerTags(),
|
|
149
|
+
loginToECR({ awsConfig }),
|
|
150
|
+
])
|
|
151
|
+
try {
|
|
152
|
+
await spawn('docker', ['tag', commitHash, `${ecrHost}/${commitHash}`], {
|
|
153
|
+
stdio: 'inherit',
|
|
154
|
+
})
|
|
155
|
+
} catch {
|
|
156
|
+
await spawn(
|
|
157
|
+
'docker',
|
|
158
|
+
['tag', '-f', commitHash, `${ecrHost}/${commitHash}`],
|
|
159
|
+
{ stdio: 'inherit' }
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
await spawn('docker', ['push', `${ecrHost}/${commitHash}`], {
|
|
163
|
+
stdio: 'inherit',
|
|
164
|
+
})
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
async release() {
|
|
168
|
+
const [commitHash, ecrHost, tags] = await Promise.all([
|
|
169
|
+
this.getCommitHash(),
|
|
170
|
+
this.getECRHost(),
|
|
171
|
+
this.getDockerTags(),
|
|
172
|
+
])
|
|
173
|
+
const ecr = new ECRClient()
|
|
174
|
+
|
|
175
|
+
const { repositoryName } = this.options
|
|
176
|
+
|
|
177
|
+
const { images: [image] = [] } = await ecr.send(
|
|
178
|
+
new BatchGetImageCommand({
|
|
179
|
+
repositoryName,
|
|
180
|
+
imageIds: [{ imageTag: commitHash }],
|
|
181
|
+
})
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
185
|
+
const imageManifest = image?.imageManifest
|
|
186
|
+
|
|
187
|
+
if (!imageManifest) {
|
|
188
|
+
throw new Error(
|
|
189
|
+
`failed to get image manifest for ${repositoryName}:${commitHash}`
|
|
190
|
+
)
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (imageManifest) {
|
|
194
|
+
// add other tags to ECR
|
|
195
|
+
for (const key of Object.keys(tags) as (keyof typeof tags)[]) {
|
|
196
|
+
if (key === 'latest' || key === 'commitHash') continue
|
|
197
|
+
const tag = tags[key]?.replace(/^[^:]+:?/, '')
|
|
198
|
+
if (!tag) continue
|
|
199
|
+
// eslint-disable-next-line no-console
|
|
200
|
+
console.error(`Adding tag ${ecrHost}/${tags[key]}`)
|
|
201
|
+
try {
|
|
202
|
+
await ecr.send(
|
|
203
|
+
new PutImageCommand({
|
|
204
|
+
repositoryName,
|
|
205
|
+
imageManifest,
|
|
206
|
+
imageTag: tag.substring(tag.indexOf(':') + 1),
|
|
207
|
+
})
|
|
208
|
+
)
|
|
209
|
+
} catch (error) {
|
|
210
|
+
if (
|
|
211
|
+
error instanceof Object &&
|
|
212
|
+
'code' in error &&
|
|
213
|
+
error.code !== 'ImageAlreadyExistsException'
|
|
214
|
+
) {
|
|
215
|
+
throw error
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
async getNpmToken(env = process.env) {
|
|
223
|
+
const { NPM_TOKEN } = env
|
|
224
|
+
if (NPM_TOKEN) return NPM_TOKEN
|
|
225
|
+
try {
|
|
226
|
+
const homedir = os.homedir()
|
|
227
|
+
const npmrc = await fs.readFile(`${homedir}/.npmrc`, 'utf8')
|
|
228
|
+
const match = /registry\.npmjs\.org\/:_authToken=(.+)/.exec(npmrc)
|
|
229
|
+
if (match) return match[1]
|
|
230
|
+
} catch {
|
|
231
|
+
// ignore
|
|
232
|
+
}
|
|
233
|
+
throw new Error('Missing process.env.NPM_TOKEN or entry in ~/.npmrc')
|
|
234
|
+
}
|
|
235
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -9,3 +9,4 @@ export { default as checkECRRepositoryPolicy } from './checkECRRepositoryPolicy.
|
|
|
9
9
|
export { default as checkECRImageAccess } from './checkECRImageAccess.ts'
|
|
10
10
|
export { default as formatECRRepositoryHostname } from './formatECRRepositoryHostname.ts'
|
|
11
11
|
export { default as formatECRImageUri } from './formatECRImageUri.ts'
|
|
12
|
+
export { ECRDeployer, type ECRDeployerOptions } from './ECRDeployer.ts'
|