Improved Azure DevOps support for mono-repos

Signed-off-by: R-Beck-2020 <78100403+R-Beck-2020@users.noreply.github.com>
This commit is contained in:
R-Beck-2020
2024-01-09 12:31:41 +00:00
parent 2cfd6f55e3
commit cb0afaad2b
7 changed files with 98 additions and 27 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-azure-devops': minor
---
Prefer dev.azure.com/build-definition annotation when it is provided, as it is more specific than dev.azure.com/project-repo
@@ -99,7 +99,7 @@ describe('useBuildRuns', () => {
renderHook(() => useBuildRuns(entity), {
wrapper: Wrapper,
}),
).toThrow('Value for annotation "dev.azure.com/project" was not found');
).toThrow('"dev.azure.com" annotations are missing');
});
it('should return throw when annotation invalid', async () => {
@@ -103,7 +103,7 @@ describe('useGitTags', () => {
renderHook(() => useGitTags(entity), {
wrapper: Wrapper,
}),
).toThrow('Value for annotation "dev.azure.com/project" was not found');
).toThrow('"dev.azure.com" annotations are missing');
});
it('should return throw when annotation invalid', async () => {
@@ -102,7 +102,7 @@ describe('usePullRequests', () => {
renderHook(() => usePullRequests(entity), {
wrapper: Wrapper,
}),
).toThrow('Value for annotation "dev.azure.com/project" was not found');
).toThrow('"dev.azure.com" annotations are missing');
});
it('should return throw when annotation invalid', async () => {
@@ -81,7 +81,7 @@ describe('useReadme', () => {
renderHook(() => useReadme(entity), {
wrapper: Wrapper,
}),
).toThrow('Value for annotation "dev.azure.com/project" was not found');
).toThrow('"dev.azure.com" annotations are missing');
});
it('should return throw when annotation invalid', async () => {
@@ -140,7 +140,7 @@ describe('getAnnotationValuesFromEntity', () => {
});
describe('with only project annotation', () => {
it('should should throw annotation not found error', () => {
it('should throw annotation not found error', () => {
const entity: Entity = {
apiVersion: 'backstage.io/v1alpha1',
kind: 'Component',
@@ -163,7 +163,7 @@ describe('getAnnotationValuesFromEntity', () => {
});
describe('with only build-definition annotation', () => {
it('should should throw annotation not found error', () => {
it('should throw annotation not found error', () => {
const entity: Entity = {
apiVersion: 'backstage.io/v1alpha1',
kind: 'Component',
@@ -381,4 +381,55 @@ describe('getAnnotationValuesFromEntity', () => {
);
});
});
describe('projectRepo and buildDefinition are provided', () => {
it('should return project, repo and buildDefinition', () => {
const entity: Entity = {
apiVersion: 'backstage.io/v1alpha1',
kind: 'Component',
metadata: {
namespace: 'default',
name: 'project-repo',
annotations: {
'dev.azure.com/build-definition': 'buildDefinitionName',
'dev.azure.com/project-repo': 'projectName/repoName',
},
},
};
const values = getAnnotationValuesFromEntity(entity);
expect(values).toEqual({
project: 'projectName',
repo: 'repoName',
definition: 'buildDefinitionName',
host: undefined,
org: undefined,
});
});
});
describe('project, projectRepo and buildDefinition are provided', () => {
it('should prefer project over project-repo.project and return no repo', () => {
const entity: Entity = {
apiVersion: 'backstage.io/v1alpha1',
kind: 'Component',
metadata: {
namespace: 'default',
name: 'project-repo',
annotations: {
'dev.azure.com/project': 'projectName',
'dev.azure.com/build-definition': 'buildDefinitionName',
'dev.azure.com/project-repo': 'ignoredProject/repoName',
},
},
};
const values = getAnnotationValuesFromEntity(entity);
expect(values).toEqual({
project: 'projectName',
repo: undefined,
definition: 'buildDefinitionName',
host: undefined,
org: undefined,
});
});
});
});
@@ -29,34 +29,49 @@ export function getAnnotationValuesFromEntity(entity: Entity): {
host?: string;
org?: string;
} {
const { host, org } = getHostOrg(entity.metadata.annotations);
const projectRepoValues = getProjectRepo(entity.metadata.annotations);
if (projectRepoValues.project && projectRepoValues.repo) {
return {
project: projectRepoValues.project,
repo: projectRepoValues.repo,
host,
org,
};
}
const hostOrg = getHostOrg(entity.metadata.annotations);
const projectRepo = getProjectRepo(entity.metadata.annotations);
const project =
entity.metadata.annotations?.[AZURE_DEVOPS_PROJECT_ANNOTATION];
if (!project) {
const definition =
entity.metadata.annotations?.[AZURE_DEVOPS_BUILD_DEFINITION_ANNOTATION];
if (definition) {
if (project) {
return {
project,
definition,
...hostOrg,
};
}
if (projectRepo.project) {
return {
project: projectRepo.project,
repo: projectRepo.repo,
definition,
...hostOrg,
};
}
throw new Error(
`Value for annotation "${AZURE_DEVOPS_PROJECT_ANNOTATION}" was not found`,
);
} else {
if (projectRepo.project) {
return {
project: projectRepo.project,
repo: projectRepo.repo,
...hostOrg,
};
}
if (project) {
throw new Error(
`Value for annotation "${AZURE_DEVOPS_BUILD_DEFINITION_ANNOTATION}" was not found`,
);
}
}
const definition =
entity.metadata.annotations?.[AZURE_DEVOPS_BUILD_DEFINITION_ANNOTATION];
if (!definition) {
throw new Error(
`Value for annotation "${AZURE_DEVOPS_BUILD_DEFINITION_ANNOTATION}" was not found`,
);
}
return { project, definition, host, org };
throw new Error('"dev.azure.com" annotations are missing');
}
function getProjectRepo(annotations?: Record<string, string>): {