From b6738e7655c5678255809a8756fd3a9048f4cab4 Mon Sep 17 00:00:00 2001 From: GregoireW <24318548+GregoireW@users.noreply.github.com> Date: Sat, 21 Aug 2021 18:39:29 +0200 Subject: [PATCH 1/4] Fix case with no last build in jenkins Signed-off-by: GregoireW <24318548+GregoireW@users.noreply.github.com> --- .../src/service/jenkinsApi.test.ts | 23 +++++++++++++++++-- .../jenkins-backend/src/service/jenkinsApi.ts | 8 ++++++- plugins/jenkins-backend/src/types.ts | 6 ++--- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.test.ts b/plugins/jenkins-backend/src/service/jenkinsApi.test.ts index d1c4705225..5f74259eef 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.test.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.test.ts @@ -284,6 +284,15 @@ describe('JenkinsApi', () => { }, }; + const projectWithoutBuild: JenkinsProject = { + actions: [], + displayName: 'Example Build', + fullDisplayName: 'Example jobName » Example Build', + fullName: 'example-jobName/exampleBuild', + inQueue: false, + lastBuild: null, + }; + it('augments project', async () => { mockedJenkinsClient.job.get.mockResolvedValueOnce({ jobs: [projectWithScmActions], @@ -294,6 +303,16 @@ describe('JenkinsApi', () => { expect(result).toHaveLength(1); expect(result[0].status).toEqual('success'); }); + it('augments project without build', async () => { + mockedJenkinsClient.job.get.mockResolvedValueOnce({ + jobs: [projectWithoutBuild], + }); + + const result = await jenkinsApi.getProjects(jenkinsInfo); + + expect(result).toHaveLength(1); + expect(result[0].status).toEqual('build not found'); + }); it('augments build', async () => { mockedJenkinsClient.job.get.mockResolvedValueOnce({ jobs: [projectWithScmActions], @@ -304,7 +323,7 @@ describe('JenkinsApi', () => { expect(result).toHaveLength(1); // TODO: I am really just asserting the previous behaviour wth no understanding here. // In my 2 Jenkins instances, 1 returns a lot of different and confusing BuildData sections and 1 returns none ☹️ - expect(result[0].lastBuild.source).toEqual({ + expect(result[0].lastBuild!.source).toEqual({ branchName: 'master', commit: { hash: '14d31bde', @@ -322,7 +341,7 @@ describe('JenkinsApi', () => { const result = await jenkinsApi.getProjects(jenkinsInfo); expect(result).toHaveLength(1); - expect(result[0].lastBuild.tests).toEqual({ + expect(result[0].lastBuild!.tests).toEqual({ total: 635, passed: 632, skipped: 1, diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.ts b/plugins/jenkins-backend/src/service/jenkinsApi.ts index fac8c95564..81f7806d7d 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.ts @@ -151,8 +151,11 @@ export class JenkinsApiImpl { private augmentProject(project: JenkinsProject): BackstageProject { let status: string; + if (project.inQueue) { status = 'queued'; + } else if (project.lastBuild === null) { + status = 'build not found'; } else if (project.lastBuild.building) { status = 'running'; } else if (!project.lastBuild.result) { @@ -165,7 +168,10 @@ export class JenkinsApiImpl { return { ...project, - lastBuild: this.augmentBuild(project.lastBuild, jobScmInfo), + lastBuild: + project.lastBuild === null + ? null + : this.augmentBuild(project.lastBuild, jobScmInfo), status, // actions: undefined, }; diff --git a/plugins/jenkins-backend/src/types.ts b/plugins/jenkins-backend/src/types.ts index 2a0c5ae7f9..4dceecd0cc 100644 --- a/plugins/jenkins-backend/src/types.ts +++ b/plugins/jenkins-backend/src/types.ts @@ -63,7 +63,7 @@ export interface BackstageBuild extends CommonBuild { export interface CommonProject { // standard Jenkins - lastBuild: CommonBuild; + lastBuild: CommonBuild | null; displayName: string; fullDisplayName: string; fullName: string; @@ -72,7 +72,7 @@ export interface CommonProject { export interface JenkinsProject extends CommonProject { // standard Jenkins - lastBuild: JenkinsBuild; + lastBuild: JenkinsBuild | null; // read by us from jenkins but not passed to frontend actions: object[]; @@ -80,7 +80,7 @@ export interface JenkinsProject extends CommonProject { export interface BackstageProject extends CommonProject { // standard Jenkins - lastBuild: BackstageBuild; + lastBuild: BackstageBuild | null; // added by us status: string; // == inQueue ? 'queued' : lastBuild.building ? 'running' : lastBuild.result, From 4c86555a22ab1212b5fc4be93b7c7be936ec40c5 Mon Sep 17 00:00:00 2001 From: GregoireW <24318548+GregoireW@users.noreply.github.com> Date: Sat, 21 Aug 2021 18:42:10 +0200 Subject: [PATCH 2/4] Fix case with no last build in jenkins Signed-off-by: GregoireW <24318548+GregoireW@users.noreply.github.com> --- .changeset/wise-rings-hammer.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/wise-rings-hammer.md diff --git a/.changeset/wise-rings-hammer.md b/.changeset/wise-rings-hammer.md new file mode 100644 index 0000000000..1515818116 --- /dev/null +++ b/.changeset/wise-rings-hammer.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-jenkins-backend': patch +--- + +Fix the case where lastBuild is null. From 513a3b255341a15cae558be60ecd6e62b269fcc1 Mon Sep 17 00:00:00 2001 From: gregoireW <24318548+GregoireW@users.noreply.github.com> Date: Sat, 21 Aug 2021 19:03:36 +0200 Subject: [PATCH 3/4] Update plugins/jenkins-backend/src/service/jenkinsApi.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Signed-off-by: GregoireW <24318548+GregoireW@users.noreply.github.com> --- plugins/jenkins-backend/src/service/jenkinsApi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.ts b/plugins/jenkins-backend/src/service/jenkinsApi.ts index 81f7806d7d..7f607c44c1 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.ts @@ -154,7 +154,7 @@ export class JenkinsApiImpl { if (project.inQueue) { status = 'queued'; - } else if (project.lastBuild === null) { + } else if (!project.lastBuild) { status = 'build not found'; } else if (project.lastBuild.building) { status = 'running'; From 8bf9d52416726ef46068a26199ea8a672d8dc637 Mon Sep 17 00:00:00 2001 From: GregoireW <24318548+GregoireW@users.noreply.github.com> Date: Sat, 21 Aug 2021 19:09:29 +0200 Subject: [PATCH 4/4] null test in more natural way Signed-off-by: GregoireW <24318548+GregoireW@users.noreply.github.com> --- plugins/jenkins-backend/src/service/jenkinsApi.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.ts b/plugins/jenkins-backend/src/service/jenkinsApi.ts index 7f607c44c1..13705ce049 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.ts @@ -168,10 +168,9 @@ export class JenkinsApiImpl { return { ...project, - lastBuild: - project.lastBuild === null - ? null - : this.augmentBuild(project.lastBuild, jobScmInfo), + lastBuild: project.lastBuild + ? this.augmentBuild(project.lastBuild, jobScmInfo) + : null, status, // actions: undefined, };