build-strap 4.0.0-dev.46 → 4.0.0-dev.54

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.
Files changed (107) hide show
  1. package/README.md +3 -34
  2. package/package.json +23 -19
  3. package/src/ant.d.ts +19 -0
  4. package/src/ant.js +12 -36
  5. package/src/cert.d.ts +12 -0
  6. package/src/cert.js +87 -148
  7. package/src/clean.d.ts +4 -0
  8. package/src/clean.js +5 -13
  9. package/src/copy.d.ts +7 -0
  10. package/src/copy.js +48 -74
  11. package/src/cp.d.ts +17 -0
  12. package/src/cp.js +81 -165
  13. package/src/docker.container.d.ts +73 -0
  14. package/src/docker.container.js +208 -350
  15. package/src/docker.d.ts +68 -0
  16. package/src/docker.js +163 -339
  17. package/src/docker.network.d.ts +42 -0
  18. package/src/docker.network.js +67 -141
  19. package/src/docker.volume.d.ts +26 -0
  20. package/src/docker.volume.js +50 -124
  21. package/src/dockerCleanup.d.ts +38 -0
  22. package/src/dockerCleanup.js +62 -136
  23. package/src/dockerCompose.d.ts +154 -0
  24. package/src/dockerCompose.js +390 -716
  25. package/src/fs.d.ts +5 -0
  26. package/src/fs.js +33 -91
  27. package/src/git.d.ts +9 -0
  28. package/src/git.js +19 -29
  29. package/src/index.d.ts +20 -0
  30. package/src/index.js +20 -26
  31. package/src/maps.d.ts +33 -0
  32. package/src/maps.js +12 -82
  33. package/src/npm.d.ts +48 -0
  34. package/src/npm.js +128 -131
  35. package/src/pkg.d.ts +38 -0
  36. package/src/pkg.js +27 -74
  37. package/src/publish.d.ts +27 -0
  38. package/src/publish.js +51 -138
  39. package/src/run.d.ts +13 -0
  40. package/src/run.js +39 -84
  41. package/src/tgz.d.ts +13 -0
  42. package/src/tgz.js +54 -88
  43. package/src/version.d.ts +34 -0
  44. package/src/version.js +85 -126
  45. package/src/yarn.d.ts +44 -0
  46. package/src/yarn.js +147 -115
  47. package/ant.js +0 -43
  48. package/ant.js.flow +0 -42
  49. package/artifactory.js +0 -617
  50. package/artifactory.js.flow +0 -616
  51. package/cert.conf +0 -20
  52. package/cert.js +0 -153
  53. package/cert.js.flow +0 -152
  54. package/clean.js +0 -20
  55. package/clean.js.flow +0 -19
  56. package/copy.js +0 -80
  57. package/copy.js.flow +0 -79
  58. package/cp.js +0 -173
  59. package/cp.js.flow +0 -172
  60. package/docker.container.js +0 -390
  61. package/docker.container.js.flow +0 -389
  62. package/docker.js +0 -365
  63. package/docker.js.flow +0 -364
  64. package/docker.network.js +0 -160
  65. package/docker.network.js.flow +0 -159
  66. package/docker.volume.js +0 -136
  67. package/docker.volume.js.flow +0 -136
  68. package/dockerCleanup.js +0 -152
  69. package/dockerCleanup.js.flow +0 -151
  70. package/dockerCompose.js +0 -766
  71. package/dockerCompose.js.flow +0 -765
  72. package/flow.js +0 -21
  73. package/flow.js.flow +0 -20
  74. package/fs.js +0 -95
  75. package/fs.js.flow +0 -96
  76. package/git.js +0 -35
  77. package/git.js.flow +0 -34
  78. package/hg.js +0 -35
  79. package/hg.js.flow +0 -34
  80. package/index.js +0 -27
  81. package/index.js.flow +0 -26
  82. package/inline-resources.js +0 -158
  83. package/inline-resources.js.flow +0 -157
  84. package/maps.js +0 -112
  85. package/maps.js.flow +0 -111
  86. package/npm.js +0 -145
  87. package/npm.js.flow +0 -144
  88. package/pkg.js +0 -81
  89. package/pkg.js.flow +0 -80
  90. package/publish.js +0 -145
  91. package/publish.js.flow +0 -144
  92. package/run.js +0 -90
  93. package/run.js.flow +0 -89
  94. package/src/artifactory.js +0 -616
  95. package/src/cert.conf +0 -20
  96. package/src/flow.js +0 -20
  97. package/src/hg.js +0 -34
  98. package/src/inline-resources.js +0 -157
  99. package/src/test.js +0 -55
  100. package/test.js +0 -56
  101. package/test.js.flow +0 -55
  102. package/tgz.js +0 -102
  103. package/tgz.js.flow +0 -101
  104. package/version.js +0 -143
  105. package/version.js.flow +0 -142
  106. package/yarn.js +0 -124
  107. package/yarn.js.flow +0 -123
package/docker.volume.js DELETED
@@ -1,136 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports._dockerVolumeInspect = _dockerVolumeInspect;exports._dockerVolumeLs = _dockerVolumeLs;exports.dockerVolumeCreate = dockerVolumeCreate;exports.dockerVolumeFind = dockerVolumeFind;exports.dockerVolumeLs = exports.dockerVolumeInspect = void 0;exports.dockerVolumeRm = dockerVolumeRm;
2
- var _throttle = _interopRequireDefault(require("lodash/throttle"));
3
- var _cp = require("./cp");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
- // calling this function in rapid succession can lead to errors.
24
- // prefer throttled version
25
- async function _dockerVolumeLs({
26
- filter } =
27
- {}) {
28
- return (
29
- await (0, _cp.spawn)('docker', ['volume', 'ls', '--format', '{{json .}}'], {
30
- captureOutput: true })).
31
-
32
-
33
- split('\n').
34
- filter((line) => !!line.trim()).
35
- map((line) => {
36
- const {
37
- Name: name,
38
- Driver: driver,
39
- Scope: scope,
40
- Labels,
41
- Mountpoint: mountPoint } =
42
- JSON.parse(line.trim());
43
-
44
- return {
45
- name,
46
- driver,
47
- scope,
48
- labels: Labels.split(',').map((l) => l.trim()),
49
- mountPoint,
50
- inspect: async () => (await dockerVolumeInspect(name))[0],
51
- rm: async () => dockerVolumeRm(name) };
52
-
53
- }).
54
- filter((v) => v.name && (typeof filter === 'function' ? filter(v) : true));
55
- }
56
-
57
- const dockerVolumeLs =
58
-
59
- (0, _throttle.default)(_dockerVolumeLs, 500, {
60
- trailing: false });exports.dockerVolumeLs = dockerVolumeLs;
61
-
62
-
63
- async function dockerVolumeFind(
64
- search,
65
- options)
66
- {
67
- return (await dockerVolumeLs(options)).find(
68
- (v) => v.name === search || v.name.startsWith(search));
69
-
70
- }
71
-
72
-
73
-
74
-
75
-
76
-
77
- async function dockerVolumeCreate(
78
- name,
79
- { labels = [], driver, driverOpts = {} } = {})
80
- {
81
- const existing = await dockerVolumeFind(name);
82
- if (existing) return existing;
83
- await (0, _cp.spawn)('docker', [
84
- 'volume',
85
- 'create',
86
- ...labels.flatMap((l) => ['--label', l]),
87
- ...(driver ? ['-d', driver] : []),
88
- ...Object.entries(driverOpts).flatMap(([k, v]) => [
89
- '-o',
90
- `${k}=${v}`]),
91
-
92
- name]);
93
-
94
- return dockerVolumeFind(name);
95
- }
96
-
97
- async function dockerVolumeRm(
98
- id,
99
- ignoreErrors = true)
100
- {
101
- const ids = Array.isArray(id) ? id : [id];
102
- try {
103
- await (0, _cp.spawn)('docker', ['volume', 'rm', ...ids]);
104
- } catch (e) {
105
- if (!ignoreErrors) {
106
- throw new Error(`Failed to remove volume(s): ${e.message}`);
107
- }
108
- }
109
- }
110
-
111
- // calling this function in rapid succession can lead to errors.
112
- // prefer throttled version
113
- async function _dockerVolumeInspect(
114
- id)
115
- {
116
- const ids = Array.isArray(id) ? id : [id];
117
- return (
118
- JSON.parse(
119
- (
120
- await (0, _cp.spawn)(
121
- 'docker',
122
- ['volume', 'inspect', '--format', '{{json .}}', ...ids],
123
- { captureOutput: true })).
124
-
125
- trim()) ||
126
- []);
127
-
128
- }
129
-
130
- const dockerVolumeInspect =
131
-
132
- (0, _throttle.default)(
133
- _dockerVolumeInspect,
134
- 500,
135
- { trailing: true });exports.dockerVolumeInspect = dockerVolumeInspect;
136
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kb2NrZXIudm9sdW1lLmpzIl0sIm5hbWVzIjpbIl9kb2NrZXJWb2x1bWVMcyIsImZpbHRlciIsImNhcHR1cmVPdXRwdXQiLCJzcGxpdCIsImxpbmUiLCJ0cmltIiwibWFwIiwiTmFtZSIsIm5hbWUiLCJEcml2ZXIiLCJkcml2ZXIiLCJTY29wZSIsInNjb3BlIiwiTGFiZWxzIiwiTW91bnRwb2ludCIsIm1vdW50UG9pbnQiLCJKU09OIiwicGFyc2UiLCJsYWJlbHMiLCJsIiwiaW5zcGVjdCIsImRvY2tlclZvbHVtZUluc3BlY3QiLCJybSIsImRvY2tlclZvbHVtZVJtIiwidiIsImRvY2tlclZvbHVtZUxzIiwidHJhaWxpbmciLCJkb2NrZXJWb2x1bWVGaW5kIiwic2VhcmNoIiwib3B0aW9ucyIsImZpbmQiLCJzdGFydHNXaXRoIiwiZG9ja2VyVm9sdW1lQ3JlYXRlIiwiZHJpdmVyT3B0cyIsImV4aXN0aW5nIiwiZmxhdE1hcCIsIk9iamVjdCIsImVudHJpZXMiLCJrIiwiaWQiLCJpZ25vcmVFcnJvcnMiLCJpZHMiLCJBcnJheSIsImlzQXJyYXkiLCJlIiwiRXJyb3IiLCJtZXNzYWdlIiwiX2RvY2tlclZvbHVtZUluc3BlY3QiXSwibWFwcGluZ3MiOiI7QUFDQTtBQUNBLDBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTtBQUNBO0FBQ08sZUFBZUEsZUFBZixDQUErQjtBQUNwQ0MsRUFBQUEsTUFEb0M7QUFFWCxFQUZwQixFQUVpRDtBQUN0RCxTQUFPO0FBQ0wsUUFBTSxlQUFNLFFBQU4sRUFBZ0IsQ0FBQyxRQUFELEVBQVcsSUFBWCxFQUFpQixVQUFqQixFQUE2QixZQUE3QixDQUFoQixFQUE0RDtBQUNoRUMsSUFBQUEsYUFBYSxFQUFFLElBRGlELEVBQTVELENBREQ7OztBQUtKQyxFQUFBQSxLQUxJLENBS0UsSUFMRjtBQU1KRixFQUFBQSxNQU5JLENBTUcsQ0FBQ0csSUFBRCxLQUFVLENBQUMsQ0FBQ0EsSUFBSSxDQUFDQyxJQUFMLEVBTmY7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QSxFQUFELENBQXJDO0FBQ0EsTUFBSTtBQUNGLFVBQU0sZUFBTSxRQUFOLEVBQWdCLENBQUMsUUFBRCxFQUFXLElBQVgsRUFBaUIsR0FBR0UsR0FBcEIsQ0FBaEIsQ0FBTjtBQUNELEdBRkQsQ0FFRSxPQUFPRyxDQUFQLEVBQVU7QUFDVixRQUFJLENBQUNKLFlBQUwsRUFBbUI7QUFDakIsWUFBTSxJQUFJSyxLQUFKLENBQVcsK0JBQThCRCxDQUFDLENBQUNFLE9BQVEsRUFBbkQsQ0FBTjtBQUNEO0FBQ0Y7QUFDRjs7QUFFRDtBQUNBO0FBQ08sZUFBZUMsb0JBQWY7QUFDTFIsRUFESztBQUVpQztBQUN0QyxRQUFNRSxHQUFHLEdBQUdDLEtBQUssQ0FBQ0MsT0FBTixDQUFjSixFQUFkLElBQW9CQSxFQUFwQixHQUF5QixDQUFDQSxFQUFELENBQXJDO0FBQ0E7QUFDRXZCLElBQUFBLElBQUksQ0FBQ0MsS0FBTDtBQUNFO0FBQ0UsVUFBTTtBQUNKLFlBREk7QUFFSixLQUFDLFFBQUQsRUFBVyxTQUFYLEVBQXNCLFVBQXRCLEVBQWtDLFlBQWxDLEVBQWdELEdBQUd3QixHQUFuRCxDQUZJO0FBR0osTUFBRXZDLGFBQWEsRUFBRSxJQUFqQixFQUhJLENBRFI7O0FBTUVHLElBQUFBLElBTkYsRUFERjtBQVFLLE1BVFA7O0FBV0Q7O0FBRU0sTUFBTWdCLG1CQUU0Qjs7QUFBRztBQUMxQzBCLG9CQUQwQztBQUUxQyxHQUYwQztBQUcxQyxFQUFFckIsUUFBUSxFQUFFLElBQVosRUFIMEMsQ0FGckMsQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSAnbG9kYXNoL3Rocm90dGxlJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnLi9jcCc7XG5cbnR5cGUgRG9ja2VyVm9sdW1lSW5zcGVjdE91dHB1dCA9IHtcbiAgW3N0cmluZ106IGFueSxcbn07XG5cbmV4cG9ydCB0eXBlIERvY2tlclZvbHVtZSA9IHt8XG4gIG5hbWU6IHN0cmluZyxcbiAgZHJpdmVyOiBzdHJpbmcsXG4gIHNjb3BlOiBzdHJpbmcsXG4gIGxhYmVsczogc3RyaW5nW10sXG4gIG1vdW50UG9pbnQ6IHN0cmluZyxcbiAgaW5zcGVjdDogKCkgPT4gUHJvbWlzZTxEb2NrZXJWb2x1bWVJbnNwZWN0T3V0cHV0PixcbiAgcm06ICgpID0+IFByb21pc2U8dm9pZD4sXG58fTtcblxudHlwZSBEb2NrZXJWb2x1bWVMc09wdGlvbnMgPSB7XG4gIGZpbHRlcj86ICh2b2w6IERvY2tlclZvbHVtZSkgPT4gYm9vbGVhbixcbn07XG5cbi8vIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBpbiByYXBpZCBzdWNjZXNzaW9uIGNhbiBsZWFkIHRvIGVycm9ycy5cbi8vIHByZWZlciB0aHJvdHRsZWQgdmVyc2lvblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9kb2NrZXJWb2x1bWVMcyh7XG4gIGZpbHRlcixcbn06IERvY2tlclZvbHVtZUxzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxEb2NrZXJWb2x1bWVbXT4ge1xuICByZXR1cm4gKFxuICAgIGF3YWl0IHNwYXduKCdkb2NrZXInLCBbJ3ZvbHVtZScsICdscycsICctLWZvcm1hdCcsICd7e2pzb24gLn19J10sIHtcbiAgICAgIGNhcHR1cmVPdXRwdXQ6IHRydWUsXG4gICAgfSlcbiAgKVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiAhIWxpbmUudHJpbSgpKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgTmFtZTogbmFtZSxcbiAgICAgICAgRHJpdmVyOiBkcml2ZXIsXG4gICAgICAgIFNjb3BlOiBzY29wZSxcbiAgICAgICAgTGFiZWxzLFxuICAgICAgICBNb3VudHBvaW50OiBtb3VudFBvaW50LFxuICAgICAgfSA9IEpTT04ucGFyc2UobGluZS50cmltKCkpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBkcml2ZXIsXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBsYWJlbHM6IExhYmVscy5zcGxpdCgnLCcpLm1hcCgobCkgPT4gbC50cmltKCkpLFxuICAgICAgICBtb3VudFBvaW50LFxuICAgICAgICBpbnNwZWN0OiBhc3luYyAoKSA9PiAoYXdhaXQgZG9ja2VyVm9sdW1lSW5zcGVjdChuYW1lKSlbMF0sXG4gICAgICAgIHJtOiBhc3luYyAoKSA9PiBkb2NrZXJWb2x1bWVSbShuYW1lKSxcbiAgICAgIH07XG4gICAgfSlcbiAgICAuZmlsdGVyKCh2KSA9PiB2Lm5hbWUgJiYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicgPyBmaWx0ZXIodikgOiB0cnVlKSk7XG59XG5cbmV4cG9ydCBjb25zdCBkb2NrZXJWb2x1bWVMczogKFxuICBEb2NrZXJWb2x1bWVMc09wdGlvbnMgfCB2b2lkLFxuKSA9PiBQcm9taXNlPERvY2tlclZvbHVtZVtdPiA9IHRocm90dGxlKF9kb2NrZXJWb2x1bWVMcywgNTAwLCB7XG4gIHRyYWlsaW5nOiBmYWxzZSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG9ja2VyVm9sdW1lRmluZChcbiAgc2VhcmNoOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBEb2NrZXJWb2x1bWVMc09wdGlvbnMsXG4pOiBQcm9taXNlPD9Eb2NrZXJWb2x1bWU+IHtcbiAgcmV0dXJuIChhd2FpdCBkb2NrZXJWb2x1bWVMcyhvcHRpb25zKSkuZmluZChcbiAgICAodikgPT4gdi5uYW1lID09PSBzZWFyY2ggfHwgdi5uYW1lLnN0YXJ0c1dpdGgoc2VhcmNoKSxcbiAgKTtcbn1cblxuZXhwb3J0IHR5cGUgRG9ja2VyVm9sdW1lQ3JlYXRlT3B0aW9ucyA9IHt8XG4gIGxhYmVscz86IHN0cmluZ1tdLFxuICBkcml2ZXI/OiBzdHJpbmcsXG4gIGRyaXZlck9wdHM/OiB7IFtzdHJpbmddOiBzdHJpbmcgfSxcbnx9O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvY2tlclZvbHVtZUNyZWF0ZShcbiAgbmFtZTogc3RyaW5nLFxuICB7IGxhYmVscyA9IFtdLCBkcml2ZXIsIGRyaXZlck9wdHMgPSB7fSB9OiBEb2NrZXJWb2x1bWVDcmVhdGVPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPD9Eb2NrZXJWb2x1bWU+IHtcbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBkb2NrZXJWb2x1bWVGaW5kKG5hbWUpO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgYXdhaXQgc3Bhd24oJ2RvY2tlcicsIFtcbiAgICAndm9sdW1lJyxcbiAgICAnY3JlYXRlJyxcbiAgICAuLi5sYWJlbHMuZmxhdE1hcCgobCkgPT4gWyctLWxhYmVsJywgbF0pLFxuICAgIC4uLihkcml2ZXIgPyBbJy1kJywgZHJpdmVyXSA6IFtdKSxcbiAgICAuLi5PYmplY3QuZW50cmllcyhkcml2ZXJPcHRzKS5mbGF0TWFwKChbaywgdl0pID0+IFtcbiAgICAgICctbycsXG4gICAgICBgJHtrfT0keyh2OiBhbnkpfWAsXG4gICAgXSksXG4gICAgbmFtZSxcbiAgXSk7XG4gIHJldHVybiBkb2NrZXJWb2x1bWVGaW5kKG5hbWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG9ja2VyVm9sdW1lUm0oXG4gIGlkOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgaWdub3JlRXJyb3JzOiBib29sZWFuID0gdHJ1ZSxcbikge1xuICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KGlkKSA/IGlkIDogW2lkXTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBzcGF3bignZG9ja2VyJywgWyd2b2x1bWUnLCAncm0nLCAuLi5pZHNdKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghaWdub3JlRXJyb3JzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZW1vdmUgdm9sdW1lKHMpOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGluIHJhcGlkIHN1Y2Nlc3Npb24gY2FuIGxlYWQgdG8gZXJyb3JzLlxuLy8gcHJlZmVyIHRocm90dGxlZCB2ZXJzaW9uXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2RvY2tlclZvbHVtZUluc3BlY3QoXG4gIGlkOiBzdHJpbmcgfCBzdHJpbmdbXSxcbik6IFByb21pc2U8RG9ja2VyVm9sdW1lSW5zcGVjdE91dHB1dFtdPiB7XG4gIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkoaWQpID8gaWQgOiBbaWRdO1xuICByZXR1cm4gKFxuICAgIEpTT04ucGFyc2UoXG4gICAgICAoXG4gICAgICAgIGF3YWl0IHNwYXduKFxuICAgICAgICAgICdkb2NrZXInLFxuICAgICAgICAgIFsndm9sdW1lJywgJ2luc3BlY3QnLCAnLS1mb3JtYXQnLCAne3tqc29uIC59fScsIC4uLmlkc10sXG4gICAgICAgICAgeyBjYXB0dXJlT3V0cHV0OiB0cnVlIH0sXG4gICAgICAgIClcbiAgICAgICkudHJpbSgpLFxuICAgICkgfHwgW11cbiAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclZvbHVtZUluc3BlY3Q6IChcbiAgc3RyaW5nIHwgc3RyaW5nW10sXG4pID0+IFByb21pc2U8RG9ja2VyVm9sdW1lSW5zcGVjdE91dHB1dFtdPiA9IHRocm90dGxlKFxuICBfZG9ja2VyVm9sdW1lSW5zcGVjdCxcbiAgNTAwLFxuICB7IHRyYWlsaW5nOiB0cnVlIH0sXG4pO1xuIl19
@@ -1,136 +0,0 @@
1
- // @flow
2
- import throttle from 'lodash/throttle';
3
- import { spawn } from './cp';
4
-
5
- type DockerVolumeInspectOutput = {
6
- [string]: any,
7
- };
8
-
9
- export type DockerVolume = {|
10
- name: string,
11
- driver: string,
12
- scope: string,
13
- labels: string[],
14
- mountPoint: string,
15
- inspect: () => Promise<DockerVolumeInspectOutput>,
16
- rm: () => Promise<void>,
17
- |};
18
-
19
- type DockerVolumeLsOptions = {
20
- filter?: (vol: DockerVolume) => boolean,
21
- };
22
-
23
- // calling this function in rapid succession can lead to errors.
24
- // prefer throttled version
25
- export async function _dockerVolumeLs({
26
- filter,
27
- }: DockerVolumeLsOptions = {}): Promise<DockerVolume[]> {
28
- return (
29
- await spawn('docker', ['volume', 'ls', '--format', '{{json .}}'], {
30
- captureOutput: true,
31
- })
32
- )
33
- .split('\n')
34
- .filter((line) => !!line.trim())
35
- .map((line) => {
36
- const {
37
- Name: name,
38
- Driver: driver,
39
- Scope: scope,
40
- Labels,
41
- Mountpoint: mountPoint,
42
- } = JSON.parse(line.trim());
43
-
44
- return {
45
- name,
46
- driver,
47
- scope,
48
- labels: Labels.split(',').map((l) => l.trim()),
49
- mountPoint,
50
- inspect: async () => (await dockerVolumeInspect(name))[0],
51
- rm: async () => dockerVolumeRm(name),
52
- };
53
- })
54
- .filter((v) => v.name && (typeof filter === 'function' ? filter(v) : true));
55
- }
56
-
57
- export const dockerVolumeLs: (
58
- DockerVolumeLsOptions | void,
59
- ) => Promise<DockerVolume[]> = throttle(_dockerVolumeLs, 500, {
60
- trailing: false,
61
- });
62
-
63
- export async function dockerVolumeFind(
64
- search: string,
65
- options?: DockerVolumeLsOptions,
66
- ): Promise<?DockerVolume> {
67
- return (await dockerVolumeLs(options)).find(
68
- (v) => v.name === search || v.name.startsWith(search),
69
- );
70
- }
71
-
72
- export type DockerVolumeCreateOptions = {|
73
- labels?: string[],
74
- driver?: string,
75
- driverOpts?: { [string]: string },
76
- |};
77
- export async function dockerVolumeCreate(
78
- name: string,
79
- { labels = [], driver, driverOpts = {} }: DockerVolumeCreateOptions = {},
80
- ): Promise<?DockerVolume> {
81
- const existing = await dockerVolumeFind(name);
82
- if (existing) return existing;
83
- await spawn('docker', [
84
- 'volume',
85
- 'create',
86
- ...labels.flatMap((l) => ['--label', l]),
87
- ...(driver ? ['-d', driver] : []),
88
- ...Object.entries(driverOpts).flatMap(([k, v]) => [
89
- '-o',
90
- `${k}=${(v: any)}`,
91
- ]),
92
- name,
93
- ]);
94
- return dockerVolumeFind(name);
95
- }
96
-
97
- export async function dockerVolumeRm(
98
- id: string | string[],
99
- ignoreErrors: boolean = true,
100
- ) {
101
- const ids = Array.isArray(id) ? id : [id];
102
- try {
103
- await spawn('docker', ['volume', 'rm', ...ids]);
104
- } catch (e) {
105
- if (!ignoreErrors) {
106
- throw new Error(`Failed to remove volume(s): ${e.message}`);
107
- }
108
- }
109
- }
110
-
111
- // calling this function in rapid succession can lead to errors.
112
- // prefer throttled version
113
- export async function _dockerVolumeInspect(
114
- id: string | string[],
115
- ): Promise<DockerVolumeInspectOutput[]> {
116
- const ids = Array.isArray(id) ? id : [id];
117
- return (
118
- JSON.parse(
119
- (
120
- await spawn(
121
- 'docker',
122
- ['volume', 'inspect', '--format', '{{json .}}', ...ids],
123
- { captureOutput: true },
124
- )
125
- ).trim(),
126
- ) || []
127
- );
128
- }
129
-
130
- export const dockerVolumeInspect: (
131
- string | string[],
132
- ) => Promise<DockerVolumeInspectOutput[]> = throttle(
133
- _dockerVolumeInspect,
134
- 500,
135
- { trailing: true },
136
- );
package/dockerCleanup.js DELETED
@@ -1,152 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.dockerImageCleanup = exports.dockerContainerCleanup = exports.dockerCleanup = exports.default = void 0;
2
- var _uniq = _interopRequireDefault(require("lodash/uniq"));
3
- var _docker = require("./docker");
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
- var _docker2 = require("./docker.container");
12
- var _run = require("./run");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
13
-
14
- // flattens arrays of promises and/or promises for arrays
15
- // into a single array of (awaited) values
16
- const flatten = async (input) => {
17
- const result = await input;
18
- return Array.isArray(result) ?
19
- [].concat(...(await Promise.all(result.map(flatten)))) :
20
- result;
21
- };
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
- /**
33
- * Purge stopped containers
34
- */
35
- const dockerContainerCleanup = async ({
36
- dryRun = process.argv.includes('--dry-run') } =
37
- {}) => {
38
- const toClean = await (0, _docker2.dockerContainerLs)({
39
- all: true,
40
- filter: (c) => c.exited });
41
-
42
- if (dryRun) {
43
- (0, _run.buildLog)(
44
- `Containers to delete (dry run):\n ${toClean.
45
- map((c) => c.id).
46
- join('\n ')}`);
47
-
48
- } else {
49
- await Promise.all(toClean.map(async (c) => c.rm(true)));
50
- }
51
- };exports.dockerContainerCleanup = dockerContainerCleanup;
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
- /**
75
- * Purge docker images created during build process
76
- */
77
- const dockerImageCleanup = async ({
78
- repos = [(0, _docker.getDockerRepo)()],
79
- buildImageIds = [],
80
- images = [],
81
- purgeAll = process.argv.includes('--purge-all'),
82
- purgeOld = !process.argv.includes('--keep-old'),
83
- dryRun = process.argv.includes('--dry-run') } =
84
- {}) => {
85
- // only match images without a :latest tag
86
- const filterLatest = (m) =>
87
- purgeAll || !m.tag.match(/^latest(-\w+)?$/);
88
- // only match images more than an hour old, AND without a :latest* tag
89
- const filterOld = (m) =>
90
- purgeAll || filterLatest(m) && m.created < Date.now() - 1000 * 60 * 60;
91
-
92
- const uniqueList = (0, _uniq.default)([
93
- // the things that we know were just built by us
94
- // remove all tags from the given repos with a matching `buildImageIds`, except for :latest*
95
- ...(await flatten(
96
- repos.map((r) =>
97
- buildImageIds.map(async (b) => (0, _docker.getDockerTags)(b, r, true, filterLatest))))),
98
-
99
-
100
-
101
- // unconditionally delete explicitly passed images/ids
102
- ...images,
103
-
104
- // images in the given `repos` without a tag, older than 1hr
105
- ...(await flatten(
106
- repos.map(async (r) => (0, _docker.getUntaggedDockerIds)(r, filterOld)))),
107
-
108
-
109
- // images with no repo and no tag
110
- ...(
111
- await (0, _docker.dockerImages)(
112
- null,
113
- (m) => m.repository === '<none>' && m.tag === '<none>' && filterOld(m))).
114
-
115
- map((m) => m.id),
116
-
117
- // any leftover tags from prior builds (only if purgeAll or purgeOld)
118
- ...(purgeAll || purgeOld ?
119
- await flatten(
120
- repos.map(async (r) => (0, _docker.getDockerTags)(null, r, true, filterOld))) :
121
-
122
- [])]);
123
-
124
-
125
- if (dryRun) {
126
- (0, _run.buildLog)(`Images to delete (dry run):\n ${uniqueList.join('\n ')}`);
127
- } else {
128
- await (0, _docker.dockerRmi)(uniqueList, true);
129
- }
130
- };exports.dockerImageCleanup = dockerImageCleanup;
131
-
132
-
133
-
134
-
135
-
136
-
137
- /**
138
- * Purge docker images created during build process
139
- */
140
- const dockerCleanup = async ({
141
- dryRun,
142
- ...rest } =
143
- {}) => {
144
- await dockerContainerCleanup({ dryRun });
145
- await dockerImageCleanup({
146
- dryRun,
147
- ...rest });
148
-
149
- };exports.dockerCleanup = dockerCleanup;var _default =
150
-
151
- dockerCleanup;exports.default = _default;
152
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kb2NrZXJDbGVhbnVwLmpzIl0sIm5hbWVzIjpbImZsYXR0ZW4iLCJpbnB1dCIsInJlc3VsdCIsIkFycmF5IiwiaXNBcnJheSIsImNvbmNhdCIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJkb2NrZXJDb250YWluZXJDbGVhbnVwIiwiZHJ5UnVuIiwicHJvY2VzcyIsImFyZ3YiLCJpbmNsdWRlcyIsInRvQ2xlYW4iLCJmaWx0ZXIiLCJjIiwiZXhpdGVkIiwiaWQiLCJqb2luIiwicm0iLCJkb2NrZXJJbWFnZUNsZWFudXAiLCJyZXBvcyIsImJ1aWxkSW1hZ2VJZHMiLCJpbWFnZXMiLCJwdXJnZUFsbCIsInB1cmdlT2xkIiwiZmlsdGVyTGF0ZXN0IiwibSIsInRhZyIsIm1hdGNoIiwiZmlsdGVyT2xkIiwiY3JlYXRlZCIsIkRhdGUiLCJub3ciLCJ1bmlxdWVMaXN0IiwiciIsImIiLCJyZXBvc2l0b3J5IiwiZG9ja2VyQ2xlYW51cCIsInJlc3QiXSwibWFwcGluZ3MiOiI7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0EsNEI7O0FBRUE7QUFDQTtBQUNBLE1BQU1BLE9BQU8sR0FBRyxPQUFPQyxLQUFQLEtBQWlCO0FBQy9CLFFBQU1DLE1BQU0sR0FBRyxNQUFNRCxLQUFyQjtBQUNBLFNBQU9FLEtBQUssQ0FBQ0MsT0FBTixDQUFjRixNQUFkO0FBQ0gsS0FBR0csTUFBSCxDQUFVLElBQUksTUFBTUMsT0FBTyxDQUFDQyxHQUFSLENBQVlMLE1BQU0sQ0FBQ00sR0FBUCxDQUFXUixPQUFYLENBQVosQ0FBVixDQUFWLENBREc7QUFFSEUsRUFBQUEsTUFGSjtBQUdELENBTEQ7Ozs7Ozs7Ozs7O0FBZ0JBO0FBQ0E7QUFDQTtBQUNPLE1BQU1PLHNCQUFzQixHQUFHLE9BQU87QUFDM0NDLEVBQUFBLE1BQU0sR0FBR0MsT0FBTyxDQUFDQyxJQUFSLENBQWFDLFFBQWIsQ0FBc0IsV0FBdEIsQ0FEa0M7QUFFVixFQUZHLEtBRUk7QUFDeEMsUUFBTUMsT0FBTyxHQUFH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QixFQUF1QixJQUF2QixFQUE2QkwsU0FBN0IsQ0FBdkIsQ0FEVyxDQURiOztBQUlBLElBSkosQ0ExQnNCLENBQUwsQ0FBbkI7OztBQWlDQSxNQUFJckIsTUFBSixFQUFZO0FBQ1YsdUJBQVUsa0NBQWlDeUIsVUFBVSxDQUFDaEIsSUFBWCxDQUFnQixNQUFoQixDQUF3QixFQUFuRTtBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sdUJBQVVnQixVQUFWLEVBQXNCLElBQXRCLENBQU47QUFDRDtBQUNGLENBckRNLEM7Ozs7Ozs7QUE0RFA7QUFDQTtBQUNBO0FBQ08sTUFBTUksYUFBYSxHQUFHLE9BQU87QUFDbEM3QixFQUFBQSxNQURrQztBQUVsQyxLQUFHOEIsSUFGK0I7QUFHVixFQUhHLEtBR0k7QUFDL0IsUUFBTS9CLHNCQUFzQixDQUFDLEVBQUVDLE1BQUYsRUFBRCxDQUE1QjtBQUNBLFFBQU1XLGtCQUFrQixDQUFDO0FBQ3ZCWCxJQUFBQSxNQUR1QjtBQUV2QixPQUFHOEIsSUFGb0IsRUFBRCxDQUF4Qjs7QUFJRCxDQVRNLEM7O0FBV1FELGEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuaW1wb3J0IHVuaXEgZnJvbSAnbG9kYXNoL3VuaXEnO1xuaW1wb3J0IHtcbiAgZG9ja2VySW1hZ2VzLFxuICBkb2NrZXJSbWksXG4gIGdldFVudGFnZ2VkRG9ja2VySWRzLFxuICBnZXREb2NrZXJUYWdzLFxuICBnZXREb2NrZXJSZXBvLFxufSBmcm9tICcuL2RvY2tlcic7XG5pbXBvcnQgdHlwZSB7IERvY2tlckltYWdlLCBEb2NrZXJJbWFnZUZpbHRlciB9IGZyb20gJy4vZG9ja2VyJztcbmltcG9ydCB7IGRvY2tlckNvbnRhaW5lckxzIH0gZnJvbSAnLi9kb2NrZXIuY29udGFpbmVyJztcbmltcG9ydCB7IGJ1aWxkTG9nIH0gZnJvbSAnLi9ydW4nO1xuXG4vLyBmbGF0dGVucyBhcnJheXMgb2YgcHJvbWlzZXMgYW5kL29yIHByb21pc2VzIGZvciBhcnJheXNcbi8vIGludG8gYSBzaW5nbGUgYXJyYXkgb2YgKGF3YWl0ZWQpIHZhbHVlc1xuY29uc3QgZmxhdHRlbiA9IGFzeW5jIChpbnB1dCkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbnB1dDtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocmVzdWx0KVxuICAgID8gW10uY29uY2F0KC4uLihhd2FpdCBQcm9taXNlLmFsbChyZXN1bHQubWFwKGZsYXR0ZW4pKSkpXG4gICAgOiByZXN1bHQ7XG59O1xuXG50eXBlIENvbW1vbkRvY2tlckNsZWFudXBPcHRpb25zID0ge3xcbiAgLyoqIHByaW50IG1hdGNoZWQgaXRlbXMgdG8gY29uc29sZSBpbnN0ZWFkIG9mIGRlbGV0aW5nICovXG4gIGRyeVJ1bj86IGJvb2xlYW4sXG58fTtcblxudHlwZSBEb2NrZXJDb250YWluZXJDbGVhbnVwT3B0aW9ucyA9IHt8XG4gIC4uLkNvbW1vbkRvY2tlckNsZWFudXBPcHRpb25zLFxufH07XG5cbi8qKlxuICogUHVyZ2Ugc3RvcHBlZCBjb250YWluZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBkb2NrZXJDb250YWluZXJDbGVhbnVwID0gYXN5bmMgKHtcbiAgZHJ5UnVuID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWRyeS1ydW4nKSxcbn06IERvY2tlckNvbnRhaW5lckNsZWFudXBPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgdG9DbGVhbiA9IGF3YWl0IGRvY2tlckNvbnRhaW5lckxzKHtcbiAgICBhbGw6IHRydWUsXG4gICAgZmlsdGVyOiAoYykgPT4gYy5leGl0ZWQsXG4gIH0pO1xuICBpZiAoZHJ5UnVuKSB7XG4gICAgYnVpbGRMb2coXG4gICAgICBgQ29udGFpbmVycyB0byBkZWxldGUgKGRyeSBydW4pOlxcbiAgJHt0b0NsZWFuXG4gICAgICAgIC5tYXAoKGMpID0+IGMuaWQpXG4gICAgICAgIC5qb2luKCdcXG4gICcpfWAsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0b0NsZWFuLm1hcChhc3luYyAoYykgPT4gYy5ybSh0cnVlKSkpO1xuICB9XG59O1xuXG50eXBlIERvY2tlckltYWdlQ2xlYW51cE9wdGlvbnMgPSB7fFxuICAuLi5Db21tb25Eb2NrZXJDbGVhbnVwT3B0aW9ucyxcbiAgLyoqIEltYWdlIHJlcG9zaXRvcmllcyB0byBjbGVhbiAoZGVmYXVsdHMgdG8gdGhlIG9uZSBjb25maWd1cmVkIGluIHBhY2thZ2UuanNvbikgKi9cbiAgcmVwb3M/OiBzdHJpbmdbXSxcbiAgLyoqIEltYWdlIGlkcyBrbm93biB0byBiZSBwcm9kdWNlZCBieSB0aGlzIGJ1aWxkICovXG4gIGJ1aWxkSW1hZ2VJZHM/OiBzdHJpbmdbXSxcbiAgLyoqIEV4cGxpY2l0IGltYWdlIG5hbWVzL2lkcyB0byBkZWxldGUgdW5jb25kaXRpb25hbGx5ICovXG4gIGltYWdlcz86IHN0cmluZ1tdLFxuICAvKipcbiAgICogaWdub3JlIGRlZmF1bHQgZXhjbHVzaW9ucyBvZiA6bGF0ZXN0KiBhbmQgaW1hZ2VzIDwgMWhyIG9sZFxuICAgKiB0aGlzIHdpbGwgZGVsZXRlIGFsbCBpbWFnZXMgaW4gdGhlIGdpdmVuIHJlcG9zXG4gICAqL1xuICBwdXJnZUFsbD86IGJvb2xlYW4sXG4gIC8qKlxuICAgKiBsb29rcyBmb3Igb3RoZXIgYnVpbGRzIG9mIHRoZSBzYW1lIHJlcG9zXG4gICAqIHRoaXMgd2lsbCBzdGlsbCBleGNsdWRlIDpsYXRlc3QqIGFuZCBpbWFnZXMgPCAxaHIgb2xkXG4gICAqIHVzZWZ1bCB0byBjbGVhbiB1cCBhZnRlciBwYXN0IGJ1aWxkcyB0aGF0IGZhaWxlZCB0byBjbGVhbiB0aGVtc2VsdmVzIHByb3Blcmx5XG4gICAqL1xuICBwdXJnZU9sZD86IGJvb2xlYW4sXG58fTtcblxuLyoqXG4gKiBQdXJnZSBkb2NrZXIgaW1hZ2VzIGNyZWF0ZWQgZHVyaW5nIGJ1aWxkIHByb2Nlc3NcbiAqL1xuZXhwb3J0IGNvbnN0IGRvY2tlckltYWdlQ2xlYW51cCA9IGFzeW5jICh7XG4gIHJlcG9zID0gW2dldERvY2tlclJlcG8oKV0sXG4gIGJ1aWxkSW1hZ2VJZHMgPSBbXSxcbiAgaW1hZ2VzID0gW10sXG4gIHB1cmdlQWxsID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXB1cmdlLWFsbCcpLFxuICBwdXJnZU9sZCA9ICFwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0ta2VlcC1vbGQnKSxcbiAgZHJ5UnVuID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWRyeS1ydW4nKSxcbn06IERvY2tlckltYWdlQ2xlYW51cE9wdGlvbnMgPSB7fSkgPT4ge1xuICAvLyBvbmx5IG1hdGNoIGltYWdlcyB3aXRob3V0IGEgOmxhdGVzdCB0YWdcbiAgY29uc3QgZmlsdGVyTGF0ZXN0OiBEb2NrZXJJbWFnZUZpbHRlciA9IChtOiBEb2NrZXJJbWFnZSkgPT5cbiAgICBwdXJnZUFsbCB8fCAhbS50YWcubWF0Y2goL15sYXRlc3QoLVxcdyspPyQvKTtcbiAgLy8gb25seSBtYXRjaCBpbWFnZXMgbW9yZSB0aGFuIGFuIGhvdXIgb2xkLCBBTkQgd2l0aG91dCBhIDpsYXRlc3QqIHRhZ1xuICBjb25zdCBmaWx0ZXJPbGQ6IERvY2tlckltYWdlRmlsdGVyID0gKG06IERvY2tlckltYWdlKSA9PlxuICAgIHB1cmdlQWxsIHx8IChmaWx0ZXJMYXRlc3QobSkgJiYgbS5jcmVhdGVkIDwgRGF0ZS5ub3coKSAtIDEwMDAgKiA2MCAqIDYwKTtcblxuICBjb25zdCB1bmlxdWVMaXN0ID0gdW5pcShbXG4gICAgLy8gdGhlIHRoaW5ncyB0aGF0IHdlIGtub3cgd2VyZSBqdXN0IGJ1aWx0IGJ5IHVzXG4gICAgLy8gcmVtb3ZlIGFsbCB0YWdzIGZyb20gdGhlIGdpdmVuIHJlcG9zIHdpdGggYSBtYXRjaGluZyBgYnVpbGRJbWFnZUlkc2AsIGV4Y2VwdCBmb3IgOmxhdGVzdCpcbiAgICAuLi4oYXdhaXQgZmxhdHRlbihcbiAgICAgIHJlcG9zLm1hcCgocikgPT5cbiAgICAgICAgYnVpbGRJbWFnZUlkcy5tYXAoYXN5bmMgKGIpID0+IGdldERvY2tlclRhZ3MoYiwgciwgdHJ1ZSwgZmlsdGVyTGF0ZXN0KSksXG4gICAgICApLFxuICAgICkpLFxuXG4gICAgLy8gdW5jb25kaXRpb25hbGx5IGRlbGV0ZSBleHBsaWNpdGx5IHBhc3NlZCBpbWFnZXMvaWRzXG4gICAgLi4uaW1hZ2VzLFxuXG4gICAgLy8gaW1hZ2VzIGluIHRoZSBnaXZlbiBgcmVwb3NgIHdpdGhvdXQgYSB0YWcsIG9sZGVyIHRoYW4gMWhyXG4gICAgLi4uKGF3YWl0IGZsYXR0ZW4oXG4gICAgICByZXBvcy5tYXAoYXN5bmMgKHIpID0+IGdldFVudGFnZ2VkRG9ja2VySWRzKHIsIGZpbHRlck9sZCkpLFxuICAgICkpLFxuXG4gICAgLy8gaW1hZ2VzIHdpdGggbm8gcmVwbyBhbmQgbm8gdGFnXG4gICAgLi4uKFxuICAgICAgYXdhaXQgZG9ja2VySW1hZ2VzKFxuICAgICAgICBudWxsLFxuICAgICAgICAobSkgPT4gbS5yZXBvc2l0b3J5ID09PSAnPG5vbmU+JyAmJiBtLnRhZyA9PT0gJzxub25lPicgJiYgZmlsdGVyT2xkKG0pLFxuICAgICAgKVxuICAgICkubWFwKChtKSA9PiBtLmlkKSxcblxuICAgIC8vIGFueSBsZWZ0b3ZlciB0YWdzIGZyb20gcHJpb3IgYnVpbGRzIChvbmx5IGlmIHB1cmdlQWxsIG9yIHB1cmdlT2xkKVxuICAgIC4uLihwdXJnZUFsbCB8fCBwdXJnZU9sZFxuICAgICAgPyBhd2FpdCBmbGF0dGVuKFxuICAgICAgICAgIHJlcG9zLm1hcChhc3luYyAocikgPT4gZ2V0RG9ja2VyVGFncyhudWxsLCByLCB0cnVlLCBmaWx0ZXJPbGQpKSxcbiAgICAgICAgKVxuICAgICAgOiBbXSksXG4gIF0pO1xuXG4gIGlmIChkcnlSdW4pIHtcbiAgICBidWlsZExvZyhgSW1hZ2VzIHRvIGRlbGV0ZSAoZHJ5IHJ1bik6XFxuICAke3VuaXF1ZUxpc3Quam9pbignXFxuICAnKX1gKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBkb2NrZXJSbWkodW5pcXVlTGlzdCwgdHJ1ZSk7XG4gIH1cbn07XG5cbnR5cGUgRG9ja2VyQ2xlYW51cE9wdGlvbnMgPSB7fFxuICAuLi5Eb2NrZXJJbWFnZUNsZWFudXBPcHRpb25zLFxuICAuLi5Eb2NrZXJDb250YWluZXJDbGVhbnVwT3B0aW9ucyxcbnx9O1xuXG4vKipcbiAqIFB1cmdlIGRvY2tlciBpbWFnZXMgY3JlYXRlZCBkdXJpbmcgYnVpbGQgcHJvY2Vzc1xuICovXG5leHBvcnQgY29uc3QgZG9ja2VyQ2xlYW51cCA9IGFzeW5jICh7XG4gIGRyeVJ1bixcbiAgLi4ucmVzdFxufTogRG9ja2VyQ2xlYW51cE9wdGlvbnMgPSB7fSkgPT4ge1xuICBhd2FpdCBkb2NrZXJDb250YWluZXJDbGVhbnVwKHsgZHJ5UnVuIH0pO1xuICBhd2FpdCBkb2NrZXJJbWFnZUNsZWFudXAoe1xuICAgIGRyeVJ1bixcbiAgICAuLi5yZXN0LFxuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRvY2tlckNsZWFudXA7XG4iXX0=
@@ -1,151 +0,0 @@
1
- // @flow
2
- import uniq from 'lodash/uniq';
3
- import {
4
- dockerImages,
5
- dockerRmi,
6
- getUntaggedDockerIds,
7
- getDockerTags,
8
- getDockerRepo,
9
- } from './docker';
10
- import type { DockerImage, DockerImageFilter } from './docker';
11
- import { dockerContainerLs } from './docker.container';
12
- import { buildLog } from './run';
13
-
14
- // flattens arrays of promises and/or promises for arrays
15
- // into a single array of (awaited) values
16
- const flatten = async (input) => {
17
- const result = await input;
18
- return Array.isArray(result)
19
- ? [].concat(...(await Promise.all(result.map(flatten))))
20
- : result;
21
- };
22
-
23
- type CommonDockerCleanupOptions = {|
24
- /** print matched items to console instead of deleting */
25
- dryRun?: boolean,
26
- |};
27
-
28
- type DockerContainerCleanupOptions = {|
29
- ...CommonDockerCleanupOptions,
30
- |};
31
-
32
- /**
33
- * Purge stopped containers
34
- */
35
- export const dockerContainerCleanup = async ({
36
- dryRun = process.argv.includes('--dry-run'),
37
- }: DockerContainerCleanupOptions = {}) => {
38
- const toClean = await dockerContainerLs({
39
- all: true,
40
- filter: (c) => c.exited,
41
- });
42
- if (dryRun) {
43
- buildLog(
44
- `Containers to delete (dry run):\n ${toClean
45
- .map((c) => c.id)
46
- .join('\n ')}`,
47
- );
48
- } else {
49
- await Promise.all(toClean.map(async (c) => c.rm(true)));
50
- }
51
- };
52
-
53
- type DockerImageCleanupOptions = {|
54
- ...CommonDockerCleanupOptions,
55
- /** Image repositories to clean (defaults to the one configured in package.json) */
56
- repos?: string[],
57
- /** Image ids known to be produced by this build */
58
- buildImageIds?: string[],
59
- /** Explicit image names/ids to delete unconditionally */
60
- images?: string[],
61
- /**
62
- * ignore default exclusions of :latest* and images < 1hr old
63
- * this will delete all images in the given repos
64
- */
65
- purgeAll?: boolean,
66
- /**
67
- * looks for other builds of the same repos
68
- * this will still exclude :latest* and images < 1hr old
69
- * useful to clean up after past builds that failed to clean themselves properly
70
- */
71
- purgeOld?: boolean,
72
- |};
73
-
74
- /**
75
- * Purge docker images created during build process
76
- */
77
- export const dockerImageCleanup = async ({
78
- repos = [getDockerRepo()],
79
- buildImageIds = [],
80
- images = [],
81
- purgeAll = process.argv.includes('--purge-all'),
82
- purgeOld = !process.argv.includes('--keep-old'),
83
- dryRun = process.argv.includes('--dry-run'),
84
- }: DockerImageCleanupOptions = {}) => {
85
- // only match images without a :latest tag
86
- const filterLatest: DockerImageFilter = (m: DockerImage) =>
87
- purgeAll || !m.tag.match(/^latest(-\w+)?$/);
88
- // only match images more than an hour old, AND without a :latest* tag
89
- const filterOld: DockerImageFilter = (m: DockerImage) =>
90
- purgeAll || (filterLatest(m) && m.created < Date.now() - 1000 * 60 * 60);
91
-
92
- const uniqueList = uniq([
93
- // the things that we know were just built by us
94
- // remove all tags from the given repos with a matching `buildImageIds`, except for :latest*
95
- ...(await flatten(
96
- repos.map((r) =>
97
- buildImageIds.map(async (b) => getDockerTags(b, r, true, filterLatest)),
98
- ),
99
- )),
100
-
101
- // unconditionally delete explicitly passed images/ids
102
- ...images,
103
-
104
- // images in the given `repos` without a tag, older than 1hr
105
- ...(await flatten(
106
- repos.map(async (r) => getUntaggedDockerIds(r, filterOld)),
107
- )),
108
-
109
- // images with no repo and no tag
110
- ...(
111
- await dockerImages(
112
- null,
113
- (m) => m.repository === '<none>' && m.tag === '<none>' && filterOld(m),
114
- )
115
- ).map((m) => m.id),
116
-
117
- // any leftover tags from prior builds (only if purgeAll or purgeOld)
118
- ...(purgeAll || purgeOld
119
- ? await flatten(
120
- repos.map(async (r) => getDockerTags(null, r, true, filterOld)),
121
- )
122
- : []),
123
- ]);
124
-
125
- if (dryRun) {
126
- buildLog(`Images to delete (dry run):\n ${uniqueList.join('\n ')}`);
127
- } else {
128
- await dockerRmi(uniqueList, true);
129
- }
130
- };
131
-
132
- type DockerCleanupOptions = {|
133
- ...DockerImageCleanupOptions,
134
- ...DockerContainerCleanupOptions,
135
- |};
136
-
137
- /**
138
- * Purge docker images created during build process
139
- */
140
- export const dockerCleanup = async ({
141
- dryRun,
142
- ...rest
143
- }: DockerCleanupOptions = {}) => {
144
- await dockerContainerCleanup({ dryRun });
145
- await dockerImageCleanup({
146
- dryRun,
147
- ...rest,
148
- });
149
- };
150
-
151
- export default dockerCleanup;