Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions packages/nx/src/command-line/release/config/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -920,7 +920,7 @@ export async function createNxReleaseConfig(
// If any project in the group has docker configuration, disable semver requirement
releaseGroup.releaseTag.requireSemver = false;

// Set preferDockerVersion to true by default when docker projects exist,
// Set preferDockerVersion by default when docker projects exist,
// unless user has explicitly configured it
if (
releaseGroup.releaseTag.preferDockerVersion === false &&
Expand All @@ -931,7 +931,19 @@ export async function createNxReleaseConfig(
userConfig.releaseTag?.preferDockerVersion === undefined &&
userConfig.releaseTagPatternPreferDockerVersion === undefined
) {
releaseGroup.releaseTag.preferDockerVersion = true;
// Check if ALL projects have docker config, or just some
const allProjectsHaveDocker = releaseGroup.projects.every(
(projectName) => {
const projectNode = projectGraph.nodes[projectName];
const projectDockerConfig = projectNode?.data.release?.docker;
return projectDockerConfig !== undefined || !!releaseGroup.docker;
}
);

// Use 'both' for mixed groups so non-docker projects fall back correctly
releaseGroup.releaseTag.preferDockerVersion = allProjectsHaveDocker
? true
: 'both';
}
}
}
Expand Down
172 changes: 172 additions & 0 deletions packages/nx/src/command-line/release/utils/shared.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,178 @@ describe('shared', () => {
expect(tags).toEqual(['my-group/a@1.1.0', 'my-group/b@1.2.0']);
});

it('should fall back to newVersion when preferDockerVersion is true but dockerVersion is null (fixed group)', () => {
const { releaseGroup, releaseGroupToFilteredProjects } =
setUpReleaseGroup();
releaseGroup.releaseTag.preferDockerVersion = true;

const tags = createGitTagValues(
[releaseGroup],
releaseGroupToFilteredProjects,
{
a: {
currentVersion: '1.0.0',
dependentProjects: [],
newVersion: '1.1.0',
dockerVersion: null,
},
b: {
currentVersion: '1.0.0',
dependentProjects: [],
newVersion: '1.1.0',
dockerVersion: null,
},
}
);

expect(tags).toEqual(['my-group-1.1.0']);
});

it('should fall back to newVersion when preferDockerVersion is true but dockerVersion is null (independent group)', () => {
const projects = ['a', 'b'];
const releaseGroup: ReleaseGroupWithName = {
name: 'my-group',
projects,
projectsRelationship: 'independent',
releaseTag: {
pattern: '{projectName}-{version}',
checkAllBranchesWhen: undefined,
requireSemver: true,
preferDockerVersion: true,
strictPreid: false,
},
changelog: undefined,
version: undefined,
versionPlans: false,
resolvedVersionPlans: false,
};
const releaseGroupToFilteredProjects = new Map().set(
releaseGroup,
new Set(projects)
);

const tags = createGitTagValues(
[releaseGroup],
releaseGroupToFilteredProjects,
{
a: {
currentVersion: '1.0.0',
dependentProjects: [],
newVersion: '1.1.0',
dockerVersion: null,
},
b: {
currentVersion: '1.0.0',
dependentProjects: [],
newVersion: '1.2.0',
dockerVersion: null,
},
}
);

expect(tags).toEqual(['a-1.1.0', 'b-1.2.0']);
});

it('should produce no tag when both dockerVersion and newVersion are null with preferDockerVersion true', () => {
const { releaseGroup, releaseGroupToFilteredProjects } =
setUpReleaseGroup();
releaseGroup.releaseTag.preferDockerVersion = true;

const tags = createGitTagValues(
[releaseGroup],
releaseGroupToFilteredProjects,
{
a: {
currentVersion: '1.0.0',
dependentProjects: [],
newVersion: null,
dockerVersion: null,
},
b: {
currentVersion: '1.0.0',
dependentProjects: [],
newVersion: null,
dockerVersion: null,
},
}
);

expect(tags).toEqual([]);
});

it('should fall back to dockerVersion when preferDockerVersion is false but newVersion is null', () => {
const { releaseGroup, releaseGroupToFilteredProjects } =
setUpReleaseGroup();
releaseGroup.releaseTag.preferDockerVersion = false;

const tags = createGitTagValues(
[releaseGroup],
releaseGroupToFilteredProjects,
{
a: {
currentVersion: '1.0.0',
dependentProjects: [],
newVersion: null,
dockerVersion: '2024.01.abc123',
},
b: {
currentVersion: '1.0.0',
dependentProjects: [],
newVersion: null,
dockerVersion: '2024.01.abc123',
},
}
);

expect(tags).toEqual(['my-group-2024.01.abc123']);
});

it('should handle mixed independent group where some projects have docker version and some do not', () => {
const projects = ['a', 'b'];
const releaseGroup: ReleaseGroupWithName = {
name: 'my-group',
projects,
projectsRelationship: 'independent',
releaseTag: {
pattern: '{projectName}-{version}',
checkAllBranchesWhen: undefined,
requireSemver: true,
preferDockerVersion: true,
strictPreid: false,
},
changelog: undefined,
version: undefined,
versionPlans: false,
resolvedVersionPlans: false,
};
const releaseGroupToFilteredProjects = new Map().set(
releaseGroup,
new Set(projects)
);

const tags = createGitTagValues(
[releaseGroup],
releaseGroupToFilteredProjects,
{
a: {
currentVersion: '1.0.0',
dependentProjects: [],
newVersion: '1.1.0',
dockerVersion: '2024.01.abc123',
},
b: {
currentVersion: '1.0.0',
dependentProjects: [],
newVersion: '1.2.0',
dockerVersion: null,
},
}
);

// Project 'a' has dockerVersion so uses it; project 'b' falls back to newVersion
expect(tags).toEqual(['a-2024.01.abc123', 'b-1.2.0']);
});

function setUpReleaseGroup() {
const projects = ['a', 'b'];
const releaseGroup: ReleaseGroupWithName = {
Expand Down
46 changes: 27 additions & 19 deletions packages/nx/src/command-line/release/utils/shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -313,16 +313,21 @@ export function createGitTagValues(
);
}
} else {
// Use either docker version or semver version based on preference
tags.push(
interpolate(releaseGroup.releaseTag.pattern, {
version: preferDockerVersion
? projectVersionData.dockerVersion
: projectVersionData.newVersion,
projectName: sanitizeProjectNameForGitTag(project),
releaseGroupName: releaseGroup.name,
})
);
// Use either docker version or semver version based on preference, with null fallback
const version = preferDockerVersion
? (projectVersionData.dockerVersion ??
projectVersionData.newVersion)
: (projectVersionData.newVersion ??
projectVersionData.dockerVersion);
if (version) {
tags.push(
interpolate(releaseGroup.releaseTag.pattern, {
version,
projectName: sanitizeProjectNameForGitTag(project),
releaseGroupName: releaseGroup.name,
})
);
}
}
}
}
Expand Down Expand Up @@ -356,15 +361,18 @@ export function createGitTagValues(
);
}
} else {
// Use either docker version or semver version based on preference
tags.push(
interpolate(releaseGroup.releaseTag.pattern, {
version: preferDockerVersion
? projectVersionData.dockerVersion
: projectVersionData.newVersion,
releaseGroupName: releaseGroup.name,
})
);
// Use either docker version or semver version based on preference, with null fallback
const version = preferDockerVersion
? (projectVersionData.dockerVersion ?? projectVersionData.newVersion)
: (projectVersionData.newVersion ?? projectVersionData.dockerVersion);
if (version) {
tags.push(
interpolate(releaseGroup.releaseTag.pattern, {
version,
releaseGroupName: releaseGroup.name,
})
);
}
}
}
}
Expand Down
Loading