in build/src/push.js [14:57]
async function push(repo, release, updateLatest, registry, registryPath, stubRegistry,
stubRegistryPath, pushImages, prepOnly, definitionsToSkip, page, pageTotal, replaceImages, definitionId) {
// Optional argument defaults
prepOnly = typeof prepOnly === 'undefined' ? false : prepOnly;
pushImages = typeof pushImages === 'undefined' ? true : pushImages;
page = page || 1;
pageTotal = pageTotal || 1;
stubRegistry = stubRegistry || registry;
stubRegistryPath = stubRegistryPath || registryPath;
definitionsToSkip = definitionsToSkip || [];
// Always replace images when building and pushing the "dev" tag
replaceImages = (configUtils.getVersionFromRelease(release, definitionId) == 'dev') || replaceImages;
// Stage content
const stagingFolder = await configUtils.getStagingFolder(release);
await configUtils.loadConfig(stagingFolder);
// Use or create a buildx / buildkit "builder" that using the docker-container driver which internally
// uses QEMU to emulate different architectures for cross-platform builds. Setting up a separate
// builder avoids problems with the default config being different otherwise altered. It also can
// be tweaked down the road to use a different driver like using separate machines per architecture.
// See https://docs.docker.com/engine/reference/commandline/buildx_create/
console.log('(*) Setting up builder...');
const builders = await asyncUtils.exec('docker buildx ls');
if(builders.indexOf('vscode-dev-containers') < 0) {
await asyncUtils.spawn('docker', ['buildx', 'create', '--use', '--name', 'vscode-dev-containers']);
} else {
await asyncUtils.spawn('docker', ['buildx', 'use', 'vscode-dev-containers']);
}
// This step sets up the QEMU emulators for cross-platform builds. See https://github.com/docker/buildx#building-multi-platform-images
await asyncUtils.spawn('docker', ['run', '--privileged', '--rm', 'tonistiigi/binfmt', '--install', 'all']);
// Build and push subset of images
const definitionsToPush = definitionId ? [definitionId] : configUtils.getSortedDefinitionBuildList(page, pageTotal, definitionsToSkip);
await asyncUtils.forEach(definitionsToPush, async (currentDefinitionId) => {
console.log(`**** Pushing ${currentDefinitionId} ${release} ****`);
await pushImage(
currentDefinitionId, repo, release, updateLatest, registry, registryPath, stubRegistry, stubRegistryPath, prepOnly, pushImages, replaceImages);
});
return stagingFolder;
}