Skip to content

Commit

Permalink
refactor(CLI): Cover image building with modern logs
Browse files Browse the repository at this point in the history
  • Loading branch information
pgrzesik committed Oct 11, 2021
1 parent 865f21f commit a2be338
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 31 deletions.
79 changes: 49 additions & 30 deletions lib/plugins/aws/provider.js
Expand Up @@ -14,8 +14,9 @@ const path = require('path');
const spawnExt = require('child-process-ext/spawn');
const ServerlessError = require('../../serverless-error');
const awsRequest = require('../../aws/request');
const log = require('@serverless/utils/log');
const oldLog = require('@serverless/utils/log');
const deepSortObjectByKey = require('../../utils/deepSortObjectByKey');
const { progress, legacy, log } = require('@serverless/utils/log');

const isLambdaArn = RegExp.prototype.test.bind(/^arn:[^:]+:lambda:/);
const isEcrUri = RegExp.prototype.test.bind(
Expand Down Expand Up @@ -1444,7 +1445,7 @@ class AwsProvider {
// Emit a warning for misuses of the old signature including stage and region
// TODO: Determine calling module and log that
if (process.env.SLS_DEBUG && options != null && !_.isObject(options)) {
log('WARNING: Inappropriate call of provider.request()');
oldLog('WARNING: Inappropriate call of provider.request()');
}
const requestOptions = _.isObject(options) ? options : {};
const shouldCache = _.get(requestOptions, 'useCache', false);
Expand Down Expand Up @@ -1819,7 +1820,10 @@ class AwsProvider {
const pushDockerArgs = ['push', remoteTag];
try {
const { stdBuffer: pushDockerStdBuffer } = await spawnExt('docker', pushDockerArgs);
process.stdout.write(pushDockerStdBuffer);
legacy.write(pushDockerStdBuffer);
if (pushDockerStdBuffer) {
log.info(pushDockerStdBuffer.toString().trimRight());
}
return pushDockerStdBuffer.toString();
} catch (err) {
if (
Expand Down Expand Up @@ -1880,7 +1884,8 @@ Object.defineProperties(
];
try {
const { stdBuffer } = await spawnExt('docker', dockerArgs);
this.serverless.cli.log('Login to Docker succeeded!');
legacy.log('Login to Docker succeeded!');
log.info('Login to Docker succeeded!');
if (stdBuffer.includes('password will be stored unencrypted')) {
this.serverless.cli.log(
'WARNING: Docker authentication token will be stored unencrypted in docker config. Configure Docker credential helper to remove this warning.',
Expand Down Expand Up @@ -1929,6 +1934,7 @@ Object.defineProperties(
),
resolveImageUriAndShaFromPath: d(
async function ({ imageName, imagePath, imageFilename, buildArgs, cacheFrom, scanOnPush }) {
const imageProgress = progress.get(`containerImage:${imageName}`);
await this.ensureDockerIsAvailable();

let isDockerfileAvailable = false;
Expand Down Expand Up @@ -1972,35 +1978,48 @@ Object.defineProperties(
imagePath,
];

let imageSha;
try {
const { stdBuffer: buildDockerStdBuffer } = await spawnExt('docker', buildDockerArgs);
process.stdout.write(buildDockerStdBuffer);
} catch (err) {
throw new ServerlessError(
`Encountered error during executing: docker ${buildDockerArgs.join(
' '
)}\nOutput of the command:\n${err.stdBuffer}`,
'DOCKER_BUILD_ERROR'
);
}

const tagDockerArgs = ['tag', localTag, remoteTag];
try {
const { stdBuffer: tagDockerStdBuffer } = await spawnExt('docker', tagDockerArgs);
process.stdout.write(tagDockerStdBuffer);
} catch (err) {
throw new ServerlessError(
`Encountered error during executing: docker ${tagDockerArgs.join(
' '
)}\nOutput of the command:\n${err.stdBuffer}`,
'DOCKER_TAG_ERROR'
);
}
imageProgress.notice(`Building image "${imageName}"`);
try {
const { stdBuffer: buildDockerStdBuffer } = await spawnExt('docker', buildDockerArgs);
legacy.write(buildDockerStdBuffer);
if (buildDockerStdBuffer) {
log.info(buildDockerStdBuffer.toString().trimRight());
}
} catch (err) {
throw new ServerlessError(
`Encountered error during executing: docker ${buildDockerArgs.join(
' '
)}\nOutput of the command:\n${err.stdBuffer}`,
'DOCKER_BUILD_ERROR'
);
}

const dockerPushOutput = await this.dockerPushToEcr(remoteTag);
imageProgress.notice(`Tagging image "${imageName}"`);
const tagDockerArgs = ['tag', localTag, remoteTag];
try {
const { stdBuffer: tagDockerStdBuffer } = await spawnExt('docker', tagDockerArgs);
legacy.write(tagDockerStdBuffer);
if (tagDockerStdBuffer) {
log.info(tagDockerStdBuffer.toString().trimRight());
}
} catch (err) {
throw new ServerlessError(
`Encountered error during executing: docker ${tagDockerArgs.join(
' '
)}\nOutput of the command:\n${err.stdBuffer}`,
'DOCKER_TAG_ERROR'
);
}

// Extract imageSha from `docker push` output
const imageSha = dockerPushOutput.match(/(sha256:[a-f0-9]{64})/)[0];
imageProgress.notice(`Uploading image "${imageName}"`);
const dockerPushOutput = await this.dockerPushToEcr(remoteTag);
// Extract imageSha from `docker push` output
imageSha = dockerPushOutput.match(/(sha256:[a-f0-9]{64})/)[0];
} finally {
imageProgress.remove();
}

return {
functionImageSha: imageSha.slice('sha256:'.length),
Expand Down
2 changes: 1 addition & 1 deletion lib/plugins/aws/remove/index.js
Expand Up @@ -34,8 +34,8 @@ class AwsRemove {
.getProvider('aws')
.getStage()} ${style.aside(`(${this.serverless.getProvider('aws').getRegion()})`)}`
);
log.info(); // Ensure gap between verbose logging
}
log.info(); // Ensure gap between verbose logging
},
'remove:remove': async () => {
const doesEcrRepositoryExistPromise = this.checkIfEcrRepositoryExists();
Expand Down

0 comments on commit a2be338

Please sign in to comment.