Skip to content

Commit 354a3ee

Browse files
Use version from manifest
1 parent b953f1f commit 354a3ee

File tree

4 files changed

+73
-60
lines changed

4 files changed

+73
-60
lines changed

.github/workflows/version-history.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ jobs:
7878
CG_STRING=$(if [ ${{ inputs.cg }} = "false" ]; then echo '--no-cg'; else echo '--cg'; fi)
7979
8080
# Pull images and update cgmanifest.json
81-
build/vscdc info --no-build \
82-
--markdown \
81+
build/vscdc info --markdown \
82+
--version-from-manifest \
8383
--prune \
8484
--release "$RELEASE_STRING" \
8585
--registry "$REGISTRY" \

build/src/image-info.js

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ let releaseNotesHeaderTemplate, releaseNotesVariantPartTemplate;
1111
// Register helper for anchors - Adapted from https://github.com/gjtorikian/html-pipeline/blob/main/lib/html/pipeline/toc_filter.rb
1212
handlebars.registerHelper('anchor', (value) => value.toLowerCase().replace(/[^\w\- ]/g, '').replace(/ /g, '-'));
1313

14-
async function generateImageInformationFiles(repo, release, registry, registryPath,
15-
stubRegistry, stubRegistryPath, buildFirst, pruneBetweenDefinitions, generateManifest, generateMarkdown, overwrite, outputPath, definitionId) {
14+
async function generateImageInformationFiles(repo, release, registry, registryPath,
15+
stubRegistry, stubRegistryPath, buildFirst, pruneBetweenDefinitions, generateManifest, generateMarkdown, overwrite, outputPath, definitionId, versionFromManifest) {
1616
// Load config files
1717
await configUtils.loadConfig();
1818

@@ -32,31 +32,31 @@ async function generateImageInformationFiles(repo, release, registry, registryPa
3232
// Target file paths and whether they exist
3333
const definitionRelativePath = configUtils.getDefinitionPath(currentDefinitionId, true);
3434
const historyFolder = path.join(outputPath, definitionRelativePath, configUtils.getConfig('historyFolderName', 'history'));
35-
const version = configUtils.getVersionFromRelease(release, currentDefinitionId);
35+
const version = versionFromManifest ? await configUtils.getVersionFromManifest(definitionId) : configUtils.getVersionFromRelease(release, currentDefinitionId);
3636
const markdownPath = path.join(historyFolder, `${version}.md`);
3737
const markdownExists = await asyncUtils.exists(markdownPath);
3838

3939
// Skip if not overwriting and all files exist
40-
if(! overwrite &&
41-
(! generateMarkdown || markdownExists) &&
42-
(! generateManifest || manifestExists)) {
40+
if (!overwrite &&
41+
(!generateMarkdown || markdownExists) &&
42+
(!generateManifest || manifestExists)) {
4343
console.log(`(*) Skipping ${currentDefinitionId}. Not in overwrite mode and content already exists.`);
4444
return;
4545
}
4646

4747
// Extract information
48-
const definitionInfo = await getDefinitionImageContent(repo, release, registry, registryPath, stubRegistry, stubRegistryPath, currentDefinitionId, alreadyRegistered, buildFirst);
48+
const definitionInfo = await getDefinitionImageContent(repo, release, registry, registryPath, stubRegistry, stubRegistryPath, currentDefinitionId, alreadyRegistered, buildFirst);
4949

5050
// Write markdown file as appropriate
51-
if (generateMarkdown && (overwrite || ! markdownExists)) {
51+
if (generateMarkdown && (overwrite || !markdownExists)) {
5252
console.log('(*) Writing image history markdown...');
5353
await asyncUtils.mkdirp(historyFolder);
54-
await asyncUtils.writeFile(markdownPath, definitionInfo.markdown);
54+
await asyncUtils.writeFile(markdownPath, definitionInfo.markdown);
5555
}
5656

5757
// Add component registrations if we're using them
5858
if (generateManifest) {
59-
manifest.Registrations = manifest.Registrations.concat(definitionInfo.registrations);
59+
manifest.Registrations = manifest.Registrations.concat(definitionInfo.registrations);
6060
}
6161
// Prune images if setting enabled
6262
if (pruneBetweenDefinitions) {
@@ -65,13 +65,13 @@ async function generateImageInformationFiles(repo, release, registry, registryPa
6565
});
6666

6767
// Write final cgmanifest.json file if needed
68-
if(generateManifest && (overwrite || ! manifestExists)) {
68+
if (generateManifest && (overwrite || !manifestExists)) {
6969
console.log('(*) Writing cgmanifest.json...');
7070
await asyncUtils.writeFile(
7171
path.join(outputPath, 'cgmanifest.json'),
72-
JSON.stringify(manifest, undefined, 4));
72+
JSON.stringify(manifest, undefined, 4));
7373
}
74-
console.log('(*) Done!');
74+
console.log('(*) Done!');
7575
}
7676

7777
async function getDefinitionImageContent(repo, release, registry, registryPath, stubRegistry, stubRegistryPath, definitionId, alreadyRegistered, buildFirst) {
@@ -90,7 +90,7 @@ async function getDefinitionImageContent(repo, release, registry, registryPath,
9090
let markdown = await generateReleaseNotesHeader(repo, release, definitionId, variants, dependencies);
9191

9292
await asyncUtils.forEach(variants, async (variant) => {
93-
if(variant) {
93+
if (variant) {
9494
console.log(`\n(*) Processing variant ${variant}...`);
9595
}
9696

@@ -106,7 +106,7 @@ async function getDefinitionImageContent(repo, release, registry, registryPath,
106106

107107
// Extract content information
108108
const contents = await imageContentUtils.getAllContentInfo(imageTag, dependencies, definitionId);
109-
109+
110110
// Update markdown content
111111
markdown = markdown + await generateReleaseNotesPart(contents, release, stubRegistry, stubRegistryPath, definitionId, variant);
112112

@@ -148,23 +148,23 @@ function getUniqueComponents(alreadyRegistered, contents) {
148148
const formatterFn = contentFormatter[contentType];
149149
let content = contents[contentType];
150150
if (formatterFn && content) {
151-
if(!Array.isArray(content)) {
151+
if (!Array.isArray(content)) {
152152
content = [content];
153153
}
154154
componentList = componentList.concat(content.reduce((prev, next) => {
155155
const uniqueId = JSON.stringify(next);
156-
if(!alreadyRegistered[uniqueId]) {
156+
if (!alreadyRegistered[uniqueId]) {
157157
alreadyRegistered[uniqueId] = true;
158158
const component = formatterFn(next);
159-
if(component) {
159+
if (component) {
160160
prev.push(component);
161161
}
162162
}
163163
return prev;
164164
}, []));
165165
}
166166
}
167-
167+
168168
return componentList;
169169
}
170170

@@ -189,7 +189,7 @@ async function generateReleaseNotesPart(contents, release, stubRegistry, stubReg
189189
const markdownFormatter = markdownFormatterFactory.getFormatter();
190190
const formattedContents = getFormattedContents(contents, markdownFormatter);
191191
formattedContents.hasPip = formattedContents.pip.length > 0 || formattedContents.pipx.length > 0;
192-
formattedContents.tags = configUtils.getTagList(definitionId, release, 'full-only', stubRegistry, stubRegistryPath, variant);
192+
formattedContents.tags = configUtils.getTagList(definitionId, release, 'full-only', stubRegistry, stubRegistryPath, variant);
193193
formattedContents.variant = variant;
194194

195195
// architecture property could be a single string, an array, or an object of arrays by variant
@@ -206,24 +206,24 @@ function getFormattedContents(contents, contentFormatter) {
206206
let formattedContents = {};
207207
for (let contentType in contents) {
208208
formattedContents[contentType] = getFormattedContent(contents[contentType], contentFormatter[contentType]);
209-
}
209+
}
210210
return formattedContents;
211211
}
212212

213213
function getFormattedContent(content, formatterFn) {
214214
if (!formatterFn || !content) {
215215
return null;
216216
}
217-
if(!Array.isArray(content)) {
217+
if (!Array.isArray(content)) {
218218
return formatterFn(content);
219219
}
220220
return content.reduce((prev, next) => {
221221
const formattedContent = formatterFn(next);
222-
if(formattedContent) {
222+
if (formattedContent) {
223223
prev.push(formattedContent);
224224
}
225225
return prev;
226-
}, []);
226+
}, []);
227227
}
228228

229229
module.exports = {

build/src/utils/config.js

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ async function loadConfig(repoPath) {
3838
const definitionPath = path.resolve(path.join(containersPath, definitionId));
3939

4040
// If a .deprecated file is found, remove the directory from staging and return
41-
if(await asyncUtils.exists(path.join(definitionPath, '.deprecated'))) {
41+
if (await asyncUtils.exists(path.join(definitionPath, '.deprecated'))) {
4242
await asyncUtils.rimraf(definitionPath);
4343
return;
4444
}
@@ -72,7 +72,7 @@ async function loadConfig(repoPath) {
7272
// Variants can be used as a VARAINT arg in tags, so support that too. However, these can
7373
// get overwritten in certain tag configs resulting in bad lookups, so **process them first**.
7474
const variants = definitionVariants ? ['${VARIANT}', '$VARIANT'].concat(definitionVariants) : [undefined];
75-
75+
7676
variants.forEach((variant) => {
7777
const blankTagList = getTagsForVersion(definitionId, '', 'ANY', 'ANY', variant);
7878
blankTagList.forEach((blankTag) => {
@@ -109,9 +109,14 @@ function getConfig(property, defaultVal) {
109109
return process.env[envVar] || config[property] || defaultVal;
110110
}
111111

112+
async function getVersionFromManifest(definitionId) {
113+
return config.definitionVersions[definitionId]
114+
}
115+
112116
// Loads manifest.json and adds it to config
113117
async function loadDefinitionManifest(manifestPath, definitionId) {
114118
const buildJson = await jsonc.read(manifestPath);
119+
console.log(`loading manifest for ${definitionId}`)
115120
if (buildJson.variants) {
116121
config.definitionVariants[definitionId] = buildJson.variants;
117122
}
@@ -122,6 +127,8 @@ async function loadDefinitionManifest(manifestPath, definitionId) {
122127
config.definitionDependencies[definitionId] = buildJson.dependencies;
123128
}
124129
if (buildJson.version) {
130+
console.log(`version is ${buildJson.version}`)
131+
125132
config.definitionVersions[definitionId] = buildJson.version;
126133
}
127134
}
@@ -184,7 +191,7 @@ function getTagsForVersion(definitionId, version, registry, registryPath, varian
184191
// If the image states that only versioned tags are returned and the version is 'dev',
185192
// add the image name to ensure that we do not incorrectly hijack a tag from another image.
186193
if (version === 'dev') {
187-
version = config.definitionBuildSettings[definitionId].versionedTagsOnly ? `dev-${definitionId.replace(/-/mg,'')}` : 'dev';
194+
version = config.definitionBuildSettings[definitionId].versionedTagsOnly ? `dev-${definitionId.replace(/-/mg, '')}` : 'dev';
188195
}
189196

190197

@@ -252,18 +259,18 @@ function getTagList(definitionId, release, versionPartHandling, registry, regist
252259
}
253260

254261
let versionList, updateUnversionedTags, updateLatest;
255-
switch(versionPartHandling) {
262+
switch (versionPartHandling) {
256263
case true:
257264
case 'all-latest':
258-
updateLatest = true;
265+
updateLatest = true;
259266
updateUnversionedTags = true;
260-
versionList = [version,`${versionParts[0]}.${versionParts[1]}`, `${versionParts[0]}` ];
267+
versionList = [version, `${versionParts[0]}.${versionParts[1]}`, `${versionParts[0]}`];
261268
break;
262269
case false:
263270
case 'all':
264271
updateLatest = false;
265272
updateUnversionedTags = true;
266-
versionList = [version,`${versionParts[0]}.${versionParts[1]}`, `${versionParts[0]}` ];
273+
versionList = [version, `${versionParts[0]}.${versionParts[1]}`, `${versionParts[0]}`];
267274
break;
268275
case 'full-only':
269276
updateLatest = false;
@@ -278,16 +285,16 @@ function getTagList(definitionId, release, versionPartHandling, registry, regist
278285
case 'major':
279286
updateLatest = false;
280287
updateUnversionedTags = false;
281-
versionList = [ `${versionParts[0]}`];
288+
versionList = [`${versionParts[0]}`];
282289
break;
283290
}
284291

285292
// Normally, we also want to return a tag without a version number, but for
286293
// some definitions that exist in the same repository as others, we may
287294
// only want to return a list of tags with part of the version number in it
288-
if(updateUnversionedTags && !config.definitionBuildSettings[definitionId].versionedTagsOnly) {
295+
if (updateUnversionedTags && !config.definitionBuildSettings[definitionId].versionedTagsOnly) {
289296
// This is the equivalent of latest for qualified tags- e.g. python:3 instead of python:0.35.0-3
290-
versionList.push('');
297+
versionList.push('');
291298
}
292299

293300
const allVariants = getVariants(definitionId);
@@ -301,10 +308,10 @@ function getTagList(definitionId, release, versionPartHandling, registry, regist
301308
// If this variant should also be used for the the latest tag, add it. The "latest" value could be
302309
// true, false, or a specific variant. "true" assumes the first variant is the latest.
303310
const definitionLatestProperty = config.definitionBuildSettings[definitionId].latest;
304-
return tagList.concat((updateLatest
311+
return tagList.concat((updateLatest
305312
&& definitionLatestProperty
306313
&& (!allVariants
307-
|| variant === definitionLatestProperty
314+
|| variant === definitionLatestProperty
308315
|| (definitionLatestProperty === true && variant === firstVariant)))
309316
? getLatestTag(definitionId, registry, registryPath)
310317
: []);
@@ -513,7 +520,7 @@ function getDefinitionList() {
513520
function createMultiParentBucket(variantParentMap, parentBuckets, dupeBuckets) {
514521
// Get parent of first variant
515522
const parentId = variantParentMap[Object.keys(variantParentMap)[0]];
516-
const firstParentBucket = parentBuckets[parentId] || [parentId];
523+
const firstParentBucket = parentBuckets[parentId] || [parentId];
517524
// Merge other parent buckets into the first parent
518525
for (let currentVariant in variantParentMap) {
519526
const currentParentId = variantParentMap[currentVariant];
@@ -522,11 +529,11 @@ function createMultiParentBucket(variantParentMap, parentBuckets, dupeBuckets) {
522529
// Merge buckets if not already merged
523530
if (currentParentBucket && dupeBuckets.indexOf(currentParentId) < 0) {
524531
currentParentBucket.forEach((current) => firstParentBucket.push(current));
525-
} else if (firstParentBucket.indexOf(currentParentId)<0) {
532+
} else if (firstParentBucket.indexOf(currentParentId) < 0) {
526533
firstParentBucket.push(currentParentId);
527534
}
528535
dupeBuckets.push(currentParentId);
529-
parentBuckets[currentParentId]=firstParentBucket;
536+
parentBuckets[currentParentId] = firstParentBucket;
530537
}
531538
}
532539
parentBuckets[parentId] = firstParentBucket;
@@ -557,27 +564,27 @@ function bucketDefinition(definitionId, parentId, parentBuckets) {
557564
function getParentTagForVersion(definitionId, version, registry, registryPath, variant) {
558565
let parentId = config.definitionBuildSettings[definitionId].parent;
559566
if (parentId) {
560-
if(typeof parentId !== 'string') {
567+
if (typeof parentId !== 'string') {
561568
// Use variant to figure out correct parent, or return first parent if child has no variant
562569
parentId = variant ? parentId[variant] : parentId[Object.keys(parentId)[0]];
563570
}
564-
571+
565572
// Determine right parent variant to use (assuming there are variants)
566573
const parentVariantList = getVariants(parentId);
567574
let parentVariantId;
568-
if(parentVariantList) {
575+
if (parentVariantList) {
569576
// If a variant is specified in the parentVariant property in build, use it - otherwise default to the child image's variant
570577
let parentVariant = config.definitionBuildSettings[definitionId].parentVariant || variant;
571-
if(typeof parentVariant !== 'string') {
578+
if (typeof parentVariant !== 'string') {
572579
// Use variant to figure out correct variant it not the same across all parents, or return first variant if child has no variant
573580
parentVariant = variant ? parentVariant[variant] : parentVariant[Object.keys(parentId)[0]];
574581
}
575582
parentVariantId = config.definitionBuildSettings[definitionId].idMismatch === "true" && variant.includes('-') ? variant.split('-')[1] : variant;
576-
if(!parentVariantList.includes(parentVariantId)) {
583+
if (!parentVariantList.includes(parentVariantId)) {
577584
throw `Unable to determine variant for parent. Variant ${parentVariantId} is not in ${parentId} list: ${parentVariantList}`;
578585
}
579586
}
580-
587+
581588
// Parent image version may be different than child's
582589
const parentVersion = getVersionFromRelease(version, parentId);
583590
return getTagsForVersion(parentId, parentVersion, registry, registryPath, parentVariantId)[0];
@@ -628,7 +635,7 @@ function getDefinitionFromTag(tag, registry, registryPath) {
628635
}
629636

630637
// If lookup fails, try removing a numeric first part - dev- is already handled
631-
return definitionTagLookup[`ANY/ANY/${repo}:${tagPart.replace(/^\d+-/,'')}`];
638+
return definitionTagLookup[`ANY/ANY/${repo}:${tagPart.replace(/^\d+-/, '')}`];
632639
}
633640

634641
// Return just the major version of a release number
@@ -665,7 +672,7 @@ function getPoolKeyForPoolUrl(poolUrl) {
665672

666673
function getFallbackPoolUrl(package) {
667674
const poolUrl = config.poolUrlFallback[package];
668-
console.log (`(*) Fallback pool URL for ${package} is ${poolUrl}`);
675+
console.log(`(*) Fallback pool URL for ${package} is ${poolUrl}`);
669676
return poolUrl;
670677
}
671678

@@ -679,7 +686,7 @@ async function getStagingFolder(release) {
679686
path.resolve(__dirname, '..', '..', '..'),
680687
getConfig('filesToStage'),
681688
stagingFolder);
682-
689+
683690
stagingFolders[release] = stagingFolder;
684691
return stagingFolders[release];
685692
}
@@ -691,7 +698,7 @@ function shouldFlattenDefinitionBaseImage(definitionId) {
691698
function getDefaultDependencies(dependencyType) {
692699
const packageManagerConfig = getConfig('commonDependencies');
693700
return packageManagerConfig ? packageManagerConfig[dependencyType] : null;
694-
}
701+
}
695702

696703
function getBuildSettings(definitionId) {
697704
return config.definitionBuildSettings[definitionId];
@@ -721,5 +728,6 @@ module.exports = {
721728
getPoolKeyForPoolUrl: getPoolKeyForPoolUrl,
722729
getConfig: getConfig,
723730
shouldFlattenDefinitionBaseImage: shouldFlattenDefinitionBaseImage,
724-
getDefinitionList: getDefinitionList
731+
getDefinitionList: getDefinitionList,
732+
getVersionFromManifest
725733
};

0 commit comments

Comments
 (0)