From cf95c5137c940470f3bda7fb91820ad5bc460a0a Mon Sep 17 00:00:00 2001 From: Tim Soslow Date: Mon, 1 May 2023 12:39:54 -0500 Subject: [PATCH 1/8] Configuration for action column in Jenkins table Signed-off-by: Tim Soslow --- .changeset/real-baboons-vanish.md | 5 +++ plugins/jenkins/README.md | 18 +++++++++++ plugins/jenkins/api-report.md | 2 +- .../src/assets/customize_action_view.png | Bin 0 -> 52575 bytes .../BuildsPage/lib/CITable/CITable.tsx | 18 +++++++++++ plugins/jenkins/src/options.ts | 29 ++++++++++++++++++ plugins/jenkins/src/plugin.ts | 9 ++++++ 7 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 .changeset/real-baboons-vanish.md create mode 100644 plugins/jenkins/src/assets/customize_action_view.png create mode 100644 plugins/jenkins/src/options.ts diff --git a/.changeset/real-baboons-vanish.md b/.changeset/real-baboons-vanish.md new file mode 100644 index 0000000000..93c30d8389 --- /dev/null +++ b/.changeset/real-baboons-vanish.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-jenkins': minor +--- + +Added configuration for the action column in Jenkins CI/CD table. It can be set to rebuild, view, or replay. diff --git a/plugins/jenkins/README.md b/plugins/jenkins/README.md index 2a0ec451c8..12c6a197da 100644 --- a/plugins/jenkins/README.md +++ b/plugins/jenkins/README.md @@ -86,6 +86,24 @@ spec: 8. Click the component in the catalog. You should now see Jenkins builds, and a last build result for your master build. +## Customize Action + +You can customize the action in the CI/CD table. + +| Action | Description | +| ----------------- | ----------------------- | +| rebuild (default) | Run new build with API | +| view | link to view build page | +| replay | link to start replay | + +```yaml +jenkinsPlugin.__experimentalReconfigure({ + tableAction: 'view', +}); +``` + +Customized action - view + ## Features - View all runs inside a folder diff --git a/plugins/jenkins/api-report.md b/plugins/jenkins/api-report.md index a2ae16988b..bcba48e4b2 100644 --- a/plugins/jenkins/api-report.md +++ b/plugins/jenkins/api-report.md @@ -98,7 +98,7 @@ const jenkinsPlugin: BackstagePlugin< entityContent: RouteRef; }, {}, - {} + JenkinsInputPluginOptions >; export { jenkinsPlugin }; export { jenkinsPlugin as plugin }; diff --git a/plugins/jenkins/src/assets/customize_action_view.png b/plugins/jenkins/src/assets/customize_action_view.png new file mode 100644 index 0000000000000000000000000000000000000000..8be43c5971e6f764abd7d0c010dd967784271828 GIT binary patch literal 52575 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 { if (count !== 0) { @@ -202,6 +204,22 @@ const generatedColumns: TableColumn[] = [ } }; + const { tableAction } = useJenkinsPluginOptions(); + + if (tableAction === 'view') { + return row.lastBuild?.url ? ( + + + + ) : null; + } else if (tableAction === 'replay') { + return row.lastBuild?.url ? ( + + + + ) : null; + } + return ( <> diff --git a/plugins/jenkins/src/options.ts b/plugins/jenkins/src/options.ts new file mode 100644 index 0000000000..f78e6a75e9 --- /dev/null +++ b/plugins/jenkins/src/options.ts @@ -0,0 +1,29 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { usePluginOptions } from '@backstage/core-plugin-api/alpha'; + +export type JenkinsPluginOptions = { + tableAction: string; +}; + +/** @ignore */ +export type JenkinsInputPluginOptions = { + tableAction: string; +}; + +export const useJenkinsPluginOptions = () => + usePluginOptions(); diff --git a/plugins/jenkins/src/plugin.ts b/plugins/jenkins/src/plugin.ts index 7dbb6bfde1..ddef0a7dfd 100644 --- a/plugins/jenkins/src/plugin.ts +++ b/plugins/jenkins/src/plugin.ts @@ -25,6 +25,7 @@ import { identityApiRef, } from '@backstage/core-plugin-api'; import { JenkinsClient, jenkinsApiRef } from './api'; +import { JenkinsInputPluginOptions, JenkinsPluginOptions } from './options'; /** @public */ export const rootRouteRef = createRouteRef({ @@ -52,6 +53,14 @@ export const jenkinsPlugin = createPlugin({ routes: { entityContent: rootRouteRef, }, + __experimentalConfigure( + options?: JenkinsInputPluginOptions, + ): JenkinsPluginOptions { + const defaultOptions = { + tableAction: 'rebuild', + }; + return { ...defaultOptions, ...options }; + }, }); /** @public */ From 17afe1a0bf0f8de7c64e5a394d0fbae84823beba Mon Sep 17 00:00:00 2001 From: Tim Soslow Date: Thu, 4 May 2023 17:27:46 -0500 Subject: [PATCH 2/8] Update action column with both view & replay icons Signed-off-by: Tim Soslow --- .changeset/real-baboons-vanish.md | 2 +- plugins/jenkins/README.md | 18 ---- plugins/jenkins/api-report.md | 2 +- .../src/assets/customize_action_view.png | Bin 52575 -> 0 bytes plugins/jenkins/src/assets/folder-results.png | Bin 61908 -> 58657 bytes .../BuildsPage/lib/CITable/CITable.tsx | 79 ++++-------------- plugins/jenkins/src/options.ts | 29 ------- plugins/jenkins/src/plugin.ts | 9 -- 8 files changed, 16 insertions(+), 123 deletions(-) delete mode 100644 plugins/jenkins/src/assets/customize_action_view.png delete mode 100644 plugins/jenkins/src/options.ts diff --git a/.changeset/real-baboons-vanish.md b/.changeset/real-baboons-vanish.md index 93c30d8389..9c4a19cd49 100644 --- a/.changeset/real-baboons-vanish.md +++ b/.changeset/real-baboons-vanish.md @@ -2,4 +2,4 @@ '@backstage/plugin-jenkins': minor --- -Added configuration for the action column in Jenkins CI/CD table. It can be set to rebuild, view, or replay. +Updated action column in Jenkins CI/CD table to include links to view and replay. The API based rebuild action was replaced because it does not work for Jenkins workflows that have parameters. diff --git a/plugins/jenkins/README.md b/plugins/jenkins/README.md index 12c6a197da..2a0ec451c8 100644 --- a/plugins/jenkins/README.md +++ b/plugins/jenkins/README.md @@ -86,24 +86,6 @@ spec: 8. Click the component in the catalog. You should now see Jenkins builds, and a last build result for your master build. -## Customize Action - -You can customize the action in the CI/CD table. - -| Action | Description | -| ----------------- | ----------------------- | -| rebuild (default) | Run new build with API | -| view | link to view build page | -| replay | link to start replay | - -```yaml -jenkinsPlugin.__experimentalReconfigure({ - tableAction: 'view', -}); -``` - -Customized action - view - ## Features - View all runs inside a folder diff --git a/plugins/jenkins/api-report.md b/plugins/jenkins/api-report.md index bcba48e4b2..a2ae16988b 100644 --- a/plugins/jenkins/api-report.md +++ b/plugins/jenkins/api-report.md @@ -98,7 +98,7 @@ const jenkinsPlugin: BackstagePlugin< entityContent: RouteRef; }, {}, - JenkinsInputPluginOptions + {} >; export { jenkinsPlugin }; export { jenkinsPlugin as plugin }; diff --git a/plugins/jenkins/src/assets/customize_action_view.png b/plugins/jenkins/src/assets/customize_action_view.png deleted file mode 100644 index 8be43c5971e6f764abd7d0c010dd967784271828..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52575 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

G%Gf7bS0P$yaBcGYKD$3fm^*iFx?)WFG@#@{`o4 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 z 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

Anlwd% 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 diff --git a/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx b/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx index b0a8b84718..6fc5f2d35c 100644 --- a/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx @@ -13,20 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Link, Progress, Table, TableColumn } from '@backstage/core-components'; -import { alertApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api'; -import { useEntityPermission } from '@backstage/plugin-catalog-react/alpha'; -import { Box, IconButton, Tooltip, Typography } from '@material-ui/core'; +import { Link, Table, TableColumn } from '@backstage/core-components'; +import { useRouteRef } from '@backstage/core-plugin-api'; +import { Box, IconButton, Typography } from '@material-ui/core'; import RetryIcon from '@material-ui/icons/Replay'; import VisibilityIcon from '@material-ui/icons/Visibility'; -import { default as React, useState } from 'react'; +import { default as React } from 'react'; import { Project } from '../../../../api/JenkinsApi'; import JenkinsLogo from '../../../../assets/JenkinsLogo.svg'; import { buildRouteRef } from '../../../../plugin'; import { useBuilds } from '../../../useBuilds'; import { JenkinsRunStatus } from '../Status'; -import { jenkinsExecutePermission } from '@backstage/plugin-jenkins-common'; -import { useJenkinsPluginOptions } from '../../../../options'; const FailCount = ({ count }: { count: number }): JSX.Element | null => { if (count !== 0) { @@ -176,64 +173,16 @@ const generatedColumns: TableColumn[] = [ title: 'Actions', sorting: false, render: (row: Partial) => { - const ActionWrapper = () => { - const [isLoadingRebuild, setIsLoadingRebuild] = useState(false); - const { allowed, loading } = useEntityPermission( - jenkinsExecutePermission, - ); - - const alertApi = useApi(alertApiRef); - - const onRebuild = async () => { - if (row.onRestartClick) { - setIsLoadingRebuild(true); - try { - await row.onRestartClick(); - alertApi.post({ - message: 'Jenkins re-build has successfully executed', - severity: 'success', - }); - } catch (e) { - alertApi.post({ - message: `Jenkins re-build has failed. Error: ${e.message}`, - severity: 'error', - }); - } finally { - setIsLoadingRebuild(false); - } - } - }; - - const { tableAction } = useJenkinsPluginOptions(); - - if (tableAction === 'view') { - return row.lastBuild?.url ? ( - - - - ) : null; - } else if (tableAction === 'replay') { - return row.lastBuild?.url ? ( - - - - ) : null; - } - - return ( - - <> - {isLoadingRebuild && } - {!isLoadingRebuild && ( - - - - )} - - - ); - }; - return ; + return row.lastBuild?.url ? ( +

+ + + + + + +
+ ) : null; }, width: '10%', }, diff --git a/plugins/jenkins/src/options.ts b/plugins/jenkins/src/options.ts deleted file mode 100644 index f78e6a75e9..0000000000 --- a/plugins/jenkins/src/options.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { usePluginOptions } from '@backstage/core-plugin-api/alpha'; - -export type JenkinsPluginOptions = { - tableAction: string; -}; - -/** @ignore */ -export type JenkinsInputPluginOptions = { - tableAction: string; -}; - -export const useJenkinsPluginOptions = () => - usePluginOptions(); diff --git a/plugins/jenkins/src/plugin.ts b/plugins/jenkins/src/plugin.ts index ddef0a7dfd..7dbb6bfde1 100644 --- a/plugins/jenkins/src/plugin.ts +++ b/plugins/jenkins/src/plugin.ts @@ -25,7 +25,6 @@ import { identityApiRef, } from '@backstage/core-plugin-api'; import { JenkinsClient, jenkinsApiRef } from './api'; -import { JenkinsInputPluginOptions, JenkinsPluginOptions } from './options'; /** @public */ export const rootRouteRef = createRouteRef({ @@ -53,14 +52,6 @@ export const jenkinsPlugin = createPlugin({ routes: { entityContent: rootRouteRef, }, - __experimentalConfigure( - options?: JenkinsInputPluginOptions, - ): JenkinsPluginOptions { - const defaultOptions = { - tableAction: 'rebuild', - }; - return { ...defaultOptions, ...options }; - }, }); /** @public */ From 8773027ae88128c28d6f30d5752a6d080bf5a912 Mon Sep 17 00:00:00 2001 From: Tim Soslow Date: Tue, 9 May 2023 19:26:49 -0500 Subject: [PATCH 3/8] Update JenkinsAPI to replay build This uses the Jenkins API directly because Jenkins SDK does not have support for replay Signed-off-by: Tim Soslow --- .changeset/real-baboons-vanish.md | 5 +- plugins/jenkins-backend/package.json | 1 + .../src/service/jenkinsApi.test.ts | 86 ++++++++----------- .../jenkins-backend/src/service/jenkinsApi.ts | 44 +++++----- plugins/jenkins-backend/src/service/router.ts | 14 +-- 5 files changed, 72 insertions(+), 78 deletions(-) diff --git a/.changeset/real-baboons-vanish.md b/.changeset/real-baboons-vanish.md index 9c4a19cd49..ca09cc9bf3 100644 --- a/.changeset/real-baboons-vanish.md +++ b/.changeset/real-baboons-vanish.md @@ -1,5 +1,8 @@ --- +'@backstage/plugin-jenkins-backend': minor '@backstage/plugin-jenkins': minor --- -Updated action column in Jenkins CI/CD table to include links to view and replay. The API based rebuild action was replaced because it does not work for Jenkins workflows that have parameters. +Updated rebuild to use Jenkins API replay build, which works for Jenkins jobs that have required parameters. Jenkins SDK could not be used for this request because it does not have support for replay. + +Added link to view build in Jenkins CI/CD table action column. diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index 959c198661..ac6bffbec9 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -36,6 +36,7 @@ "express": "^4.17.1", "express-promise-router": "^4.1.0", "jenkins": "^1.0.0", + "node-fetch": "^2.6.7", "winston": "^3.2.1", "yn": "^4.0.0" }, diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.test.ts b/plugins/jenkins-backend/src/service/jenkinsApi.test.ts index 57ce2dbed4..956893c778 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.test.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.test.ts @@ -19,9 +19,10 @@ import jenkins from 'jenkins'; import { JenkinsInfo } from './jenkinsInfoProvider'; import { JenkinsBuild, JenkinsProject } from '../types'; import { AuthorizeResult } from '@backstage/plugin-permission-common'; -import { NotAllowedError } from '@backstage/errors'; +import fetch, { Response } from 'node-fetch'; jest.mock('jenkins'); +jest.mock('node-fetch'); const mockedJenkinsClient = { job: { get: jest.fn(), @@ -34,7 +35,6 @@ const mockedJenkinsClient = { const mockedJenkins = jenkins as jest.Mocked; mockedJenkins.mockReturnValue(mockedJenkinsClient); -const resourceRef = 'component:default/example-component'; const jobFullName = 'example-jobName/foo'; const buildNumber = 19; const jenkinsInfo: JenkinsInfo = { @@ -54,6 +54,7 @@ const fakePermissionApi = { describe('JenkinsApi', () => { const jenkinsApi = new JenkinsApiImpl(fakePermissionApi); + const mockFetch = fetch as jest.MockedFunction; describe('getProjects', () => { const project: JenkinsProject = { @@ -684,55 +685,44 @@ describe('JenkinsApi', () => { buildNumber, ); }); - it('buildProject', async () => { - await jenkinsApi.buildProject(jenkinsInfo, jobFullName, resourceRef); + it('getBuildUrl', async () => { + const jenkinsApiProto = Object.getPrototypeOf(jenkinsApi); + const buildUrl = jenkinsApiProto.getBuildUrl( + jenkinsInfo, + jobFullName, + buildNumber, + ); + expect(buildUrl).toEqual( + 'https://jenkins.example.com/job/example-jobName/job/foo/19', + ); - expect(mockedJenkins).toHaveBeenCalledWith({ - baseUrl: jenkinsInfo.baseUrl, - headers: jenkinsInfo.headers, - promisify: true, - }); - expect(mockedJenkinsClient.job.build).toHaveBeenCalledWith(jobFullName); + const buildUrlTriple = jenkinsApiProto.getBuildUrl( + jenkinsInfo, + 'example-jobName/foo/bar', + buildNumber, + ); + expect(buildUrlTriple).toEqual( + 'https://jenkins.example.com/job/example-jobName/job/foo/job/bar/19', + ); }); - - it('buildProject should fail if it does not have required permissions', async () => { - fakePermissionApi.authorize.mockResolvedValueOnce([ - { - result: AuthorizeResult.DENY, - }, - ]); - - await expect(() => - jenkinsApi.buildProject(jenkinsInfo, jobFullName, resourceRef), - ).rejects.toThrow(NotAllowedError); - }); - - it('buildProject should succeed if it have required permissions', async () => { - fakePermissionApi.authorize.mockResolvedValueOnce([ - { - result: AuthorizeResult.ALLOW, - }, - ]); - - await jenkinsApi.buildProject(jenkinsInfo, jobFullName, resourceRef); - expect(mockedJenkins).toHaveBeenCalledWith({ - baseUrl: jenkinsInfo.baseUrl, - headers: jenkinsInfo.headers, - promisify: true, + describe('rebuildProject', () => { + it('successfully rebuilds', async () => { + mockFetch.mockResolvedValue({ status: 200 } as Response); + const status = await jenkinsApi.rebuildProject( + jenkinsInfo, + jobFullName, + buildNumber, + ); + expect(status).toEqual(200); }); - expect(mockedJenkinsClient.job.build).toHaveBeenCalledWith(jobFullName); - }); - - it('buildProject with crumbIssuer option', async () => { - const info: JenkinsInfo = { ...jenkinsInfo, crumbIssuer: true }; - await jenkinsApi.buildProject(info, jobFullName, resourceRef); - - expect(mockedJenkins).toHaveBeenCalledWith({ - baseUrl: jenkinsInfo.baseUrl, - headers: jenkinsInfo.headers, - promisify: true, - crumbIssuer: true, + it('fails to rebuild', async () => { + mockFetch.mockResolvedValue({ status: 401 } as Response); + const status = await jenkinsApi.rebuildProject( + jenkinsInfo, + jobFullName, + buildNumber, + ); + expect(status).toEqual(401); }); - expect(mockedJenkinsClient.job.build).toHaveBeenCalledWith(jobFullName); }); }); diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.ts b/plugins/jenkins-backend/src/service/jenkinsApi.ts index ef4ddc47b0..de9c490ff4 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.ts @@ -29,6 +29,7 @@ import { } from '@backstage/plugin-permission-common'; import { jenkinsExecutePermission } from '@backstage/plugin-jenkins-common'; import { NotAllowedError } from '@backstage/errors'; +import fetch, { HeaderInit } from 'node-fetch'; export class JenkinsApiImpl { private static readonly lastBuildTreeSpec = `lastBuild[ @@ -144,32 +145,20 @@ export class JenkinsApiImpl { * Trigger a build of a project * @see ../../../jenkins/src/api/JenkinsApi.ts#retry */ - async buildProject( + async rebuildProject( jenkinsInfo: JenkinsInfo, jobFullName: string, - resourceRef: string, - options?: { token?: string }, - ) { - const client = await JenkinsApiImpl.getClient(jenkinsInfo); + buildNumber: number, + ): Promise { + const buildUrl = this.getBuildUrl(jenkinsInfo, jobFullName, buildNumber); - if (this.permissionApi) { - const response = await this.permissionApi.authorize( - [{ permission: jenkinsExecutePermission, resourceRef }], - { token: options?.token }, - ); - // permission api returns always at least one item, we need to check only one result since we do not expect any additional results - const { result } = response[0]; - if (result === AuthorizeResult.DENY) { - throw new NotAllowedError(); - } - } - - // looks like the current SDK only supports triggering a new build - // can't see any support for replay (re-running the specific build with the same SCM info) - - // Note Jenkins itself has concepts of rebuild and replay on a job. - // The latter should be possible to trigger with a POST to /replay/rebuild - await client.job.build(jobFullName); + // the current SDK only supports triggering a new build + // replay the job by triggering request directly from Jenkins api + const response = await fetch(`${buildUrl}/replay/rebuild`, { + method: 'post', + headers: jenkinsInfo.headers as HeaderInit, + }); + return response.status; } // private helper methods @@ -318,4 +307,13 @@ export class JenkinsApiImpl { }) .pop(); } + + private getBuildUrl( + jenkinsInfo: JenkinsInfo, + jobFullName: string, + buildId: number, + ): string { + const jobs = jobFullName.split('/'); + return `${jenkinsInfo.baseUrl}/job/${jobs.join('/job/')}/${buildId}`; + } } diff --git a/plugins/jenkins-backend/src/service/router.ts b/plugins/jenkins-backend/src/service/router.ts index df4c3b5a11..eb29d5d019 100644 --- a/plugins/jenkins-backend/src/service/router.ts +++ b/plugins/jenkins-backend/src/service/router.ts @@ -147,7 +147,8 @@ export async function createRouter( router.post( '/v1/entity/:namespace/:kind/:name/job/:jobFullName/:buildNumber::rebuild', async (request, response) => { - const { namespace, kind, name, jobFullName } = request.params; + const { namespace, kind, name, jobFullName, buildNumber } = + request.params; const token = getBearerTokenFromAuthorizationHeader( request.header('authorization'), ); @@ -161,11 +162,12 @@ export async function createRouter( backstageToken: token, }); - const resourceRef = stringifyEntityRef({ kind, namespace, name }); - await jenkinsApi.buildProject(jenkinsInfo, jobFullName, resourceRef, { - token, - }); - response.json({}); + const status = await jenkinsApi.rebuildProject( + jenkinsInfo, + jobFullName, + parseInt(buildNumber, 10), + ); + response.json({}).status(status); }, ); router.use(errorHandler()); From f6002cda1ffa0817b87fff7543807c4d4264548b Mon Sep 17 00:00:00 2001 From: Tim Soslow Date: Tue, 9 May 2023 19:30:59 -0500 Subject: [PATCH 4/8] Commit yarn.lock Signed-off-by: Tim Soslow --- yarn.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/yarn.lock b/yarn.lock index 0cd30db248..5143cd1154 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7067,6 +7067,7 @@ __metadata: express-promise-router: ^4.1.0 jenkins: ^1.0.0 msw: ^1.0.0 + node-fetch: ^2.6.7 supertest: ^6.1.6 winston: ^3.2.1 yn: ^4.0.0 From 717a49e68b3909c980529f911c34404d791dab1a Mon Sep 17 00:00:00 2001 From: Tim Soslow Date: Tue, 9 May 2023 21:28:14 -0500 Subject: [PATCH 5/8] Cleanup obsolete code Signed-off-by: Tim Soslow --- plugins/jenkins-backend/api-report.md | 4 --- .../src/service/jenkinsApi.test.ts | 12 +-------- .../jenkins-backend/src/service/jenkinsApi.ts | 8 ------ plugins/jenkins-backend/src/service/router.ts | 25 +++---------------- 4 files changed, 4 insertions(+), 45 deletions(-) diff --git a/plugins/jenkins-backend/api-report.md b/plugins/jenkins-backend/api-report.md index fd1365547d..4893592483 100644 --- a/plugins/jenkins-backend/api-report.md +++ b/plugins/jenkins-backend/api-report.md @@ -8,8 +8,6 @@ import { CompoundEntityRef } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; import express from 'express'; import { Logger } from 'winston'; -import { PermissionAuthorizer } from '@backstage/plugin-permission-common'; -import { PermissionEvaluator } from '@backstage/plugin-permission-common'; // @public (undocumented) export function createRouter(options: RouterOptions): Promise; @@ -85,7 +83,5 @@ export interface RouterOptions { jenkinsInfoProvider: JenkinsInfoProvider; // (undocumented) logger: Logger; - // (undocumented) - permissions?: PermissionEvaluator | PermissionAuthorizer; } ``` diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.test.ts b/plugins/jenkins-backend/src/service/jenkinsApi.test.ts index 956893c778..7f8703e4de 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.test.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.test.ts @@ -18,7 +18,6 @@ import { JenkinsApiImpl } from './jenkinsApi'; import jenkins from 'jenkins'; import { JenkinsInfo } from './jenkinsInfoProvider'; import { JenkinsBuild, JenkinsProject } from '../types'; -import { AuthorizeResult } from '@backstage/plugin-permission-common'; import fetch, { Response } from 'node-fetch'; jest.mock('jenkins'); @@ -43,17 +42,8 @@ const jenkinsInfo: JenkinsInfo = { jobFullName: 'example-jobName', }; -const fakePermissionApi = { - authorize: jest.fn().mockResolvedValue([ - { - result: AuthorizeResult.ALLOW, - }, - ]), - authorizeConditional: jest.fn(), -}; - describe('JenkinsApi', () => { - const jenkinsApi = new JenkinsApiImpl(fakePermissionApi); + const jenkinsApi = new JenkinsApiImpl(); const mockFetch = fetch as jest.MockedFunction; describe('getProjects', () => { diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.ts b/plugins/jenkins-backend/src/service/jenkinsApi.ts index de9c490ff4..0d5d282bf7 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.ts @@ -23,12 +23,6 @@ import type { JenkinsProject, ScmDetails, } from '../types'; -import { - AuthorizeResult, - PermissionEvaluator, -} from '@backstage/plugin-permission-common'; -import { jenkinsExecutePermission } from '@backstage/plugin-jenkins-common'; -import { NotAllowedError } from '@backstage/errors'; import fetch, { HeaderInit } from 'node-fetch'; export class JenkinsApiImpl { @@ -65,8 +59,6 @@ export class JenkinsApiImpl { ${JenkinsApiImpl.jobTreeSpec} ]{0,50}`; - constructor(private readonly permissionApi?: PermissionEvaluator) {} - /** * Get a list of projects for the given JenkinsInfo. * @see ../../../jenkins/src/api/JenkinsApi.ts#getProjects diff --git a/plugins/jenkins-backend/src/service/router.ts b/plugins/jenkins-backend/src/service/router.ts index eb29d5d019..5f82f5e933 100644 --- a/plugins/jenkins-backend/src/service/router.ts +++ b/plugins/jenkins-backend/src/service/router.ts @@ -20,41 +20,22 @@ import Router from 'express-promise-router'; import { Logger } from 'winston'; import { JenkinsInfoProvider } from './jenkinsInfoProvider'; import { JenkinsApiImpl } from './jenkinsApi'; -import { - PermissionAuthorizer, - PermissionEvaluator, - toPermissionEvaluator, -} from '@backstage/plugin-permission-common'; import { getBearerTokenFromAuthorizationHeader } from '@backstage/plugin-auth-node'; -import { stringifyEntityRef } from '@backstage/catalog-model'; import { stringifyError } from '@backstage/errors'; /** @public */ export interface RouterOptions { logger: Logger; jenkinsInfoProvider: JenkinsInfoProvider; - permissions?: PermissionEvaluator | PermissionAuthorizer; } /** @public */ export async function createRouter( options: RouterOptions, ): Promise { - const { jenkinsInfoProvider, permissions, logger } = options; + const { jenkinsInfoProvider } = options; - let permissionEvaluator: PermissionEvaluator | undefined; - if (permissions && 'authorizeConditional' in permissions) { - permissionEvaluator = permissions as PermissionEvaluator; - } else { - logger.warn( - 'PermissionAuthorizer is deprecated. Please use an instance of PermissionEvaluator instead of PermissionAuthorizer in PluginEnvironment#permissions', - ); - permissionEvaluator = permissions - ? toPermissionEvaluator(permissions) - : undefined; - } - - const jenkinsApi = new JenkinsApiImpl(permissionEvaluator); + const jenkinsApi = new JenkinsApiImpl(); const router = Router(); router.use(express.json()); @@ -145,7 +126,7 @@ export async function createRouter( ); router.post( - '/v1/entity/:namespace/:kind/:name/job/:jobFullName/:buildNumber::rebuild', + '/v1/entity/:namespace/:kind/:name/job/:jobFullName/:buildNumber', async (request, response) => { const { namespace, kind, name, jobFullName, buildNumber } = request.params; From c81333866a0416a43728ecd28e1f59b31f0f9de5 Mon Sep 17 00:00:00 2001 From: Tim Soslow Date: Tue, 9 May 2023 21:58:46 -0500 Subject: [PATCH 6/8] Restore table action rebuild Signed-off-by: Tim Soslow --- .../BuildsPage/lib/CITable/CITable.tsx | 69 +++++++++++++++---- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx b/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx index 6fc5f2d35c..f2d108eaf7 100644 --- a/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx @@ -13,17 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Link, Table, TableColumn } from '@backstage/core-components'; -import { useRouteRef } from '@backstage/core-plugin-api'; -import { Box, IconButton, Typography } from '@material-ui/core'; +import { Link, Progress, Table, TableColumn } from '@backstage/core-components'; +import { alertApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api'; +import { useEntityPermission } from '@backstage/plugin-catalog-react/alpha'; +import { Box, IconButton, Tooltip, Typography } from '@material-ui/core'; import RetryIcon from '@material-ui/icons/Replay'; import VisibilityIcon from '@material-ui/icons/Visibility'; -import { default as React } from 'react'; +import { default as React, useState } from 'react'; import { Project } from '../../../../api/JenkinsApi'; import JenkinsLogo from '../../../../assets/JenkinsLogo.svg'; import { buildRouteRef } from '../../../../plugin'; import { useBuilds } from '../../../useBuilds'; import { JenkinsRunStatus } from '../Status'; +import { jenkinsExecutePermission } from '@backstage/plugin-jenkins-common'; const FailCount = ({ count }: { count: number }): JSX.Element | null => { if (count !== 0) { @@ -173,16 +175,55 @@ const generatedColumns: TableColumn[] = [ title: 'Actions', sorting: false, render: (row: Partial) => { - return row.lastBuild?.url ? ( -
- - - - - - -
- ) : null; + const ActionWrapper = () => { + const [isLoadingRebuild, setIsLoadingRebuild] = useState(false); + const { allowed, loading } = useEntityPermission( + jenkinsExecutePermission, + ); + + const alertApi = useApi(alertApiRef); + + const onRebuild = async () => { + if (row.onRestartClick) { + setIsLoadingRebuild(true); + try { + await row.onRestartClick(); + alertApi.post({ + message: 'Jenkins re-build has successfully executed', + severity: 'success', + }); + } catch (e) { + alertApi.post({ + message: `Jenkins re-build has failed. Error: ${e.message}`, + severity: 'error', + }); + } finally { + setIsLoadingRebuild(false); + } + } + }; + + return ( +
+ {row.lastBuild?.url && ( + + + + + + )} + {isLoadingRebuild && } + {!isLoadingRebuild && ( + + + + + + )} +
+ ); + }; + return ; }, width: '10%', }, From 3e6cc3cfe959accee271ca6f19a7f2fbd856dbbf Mon Sep 17 00:00:00 2001 From: Tim Soslow Date: Wed, 10 May 2023 16:56:33 -0500 Subject: [PATCH 7/8] Re-add permission check and crumb issuer support Signed-off-by: Tim Soslow --- plugins/jenkins-backend/api-report.md | 4 + .../src/service/jenkinsApi.test.ts | 109 +++++++++++++++++- .../jenkins-backend/src/service/jenkinsApi.ts | 57 ++++++++- plugins/jenkins-backend/src/service/router.ts | 28 ++++- 4 files changed, 192 insertions(+), 6 deletions(-) diff --git a/plugins/jenkins-backend/api-report.md b/plugins/jenkins-backend/api-report.md index 4893592483..fd1365547d 100644 --- a/plugins/jenkins-backend/api-report.md +++ b/plugins/jenkins-backend/api-report.md @@ -8,6 +8,8 @@ import { CompoundEntityRef } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; import express from 'express'; import { Logger } from 'winston'; +import { PermissionAuthorizer } from '@backstage/plugin-permission-common'; +import { PermissionEvaluator } from '@backstage/plugin-permission-common'; // @public (undocumented) export function createRouter(options: RouterOptions): Promise; @@ -83,5 +85,7 @@ export interface RouterOptions { jenkinsInfoProvider: JenkinsInfoProvider; // (undocumented) logger: Logger; + // (undocumented) + permissions?: PermissionEvaluator | PermissionAuthorizer; } ``` diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.test.ts b/plugins/jenkins-backend/src/service/jenkinsApi.test.ts index 7f8703e4de..15f4bc651f 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.test.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.test.ts @@ -18,7 +18,9 @@ import { JenkinsApiImpl } from './jenkinsApi'; import jenkins from 'jenkins'; import { JenkinsInfo } from './jenkinsInfoProvider'; import { JenkinsBuild, JenkinsProject } from '../types'; +import { AuthorizeResult } from '@backstage/plugin-permission-common'; import fetch, { Response } from 'node-fetch'; +import { ResponseError } from '@backstage/errors'; jest.mock('jenkins'); jest.mock('node-fetch'); @@ -34,6 +36,7 @@ const mockedJenkinsClient = { const mockedJenkins = jenkins as jest.Mocked; mockedJenkins.mockReturnValue(mockedJenkinsClient); +const resourceRef = 'component:default/example-component'; const jobFullName = 'example-jobName/foo'; const buildNumber = 19; const jenkinsInfo: JenkinsInfo = { @@ -42,10 +45,34 @@ const jenkinsInfo: JenkinsInfo = { jobFullName: 'example-jobName', }; +const fakePermissionApi = { + authorize: jest.fn().mockResolvedValue([ + { + result: AuthorizeResult.ALLOW, + }, + ]), + authorizeConditional: jest.fn(), +}; + +class NoErrorThrownError extends Error {} + +const getError = async (call: () => unknown): Promise => { + try { + await call(); + throw new NoErrorThrownError(); + } catch (error: unknown) { + return error as TError; + } +}; + describe('JenkinsApi', () => { - const jenkinsApi = new JenkinsApiImpl(); + const jenkinsApi = new JenkinsApiImpl(fakePermissionApi); const mockFetch = fetch as jest.MockedFunction; + afterEach(() => { + jest.clearAllMocks(); + }); + describe('getProjects', () => { const project: JenkinsProject = { actions: [], @@ -695,24 +722,100 @@ describe('JenkinsApi', () => { 'https://jenkins.example.com/job/example-jobName/job/foo/job/bar/19', ); }); + describe('getHeaders', () => { + const crumb = { crumb: 'foobar', crumbRequestField: '.crumb' }; + const json = jest.fn() as jest.MockedFunction; + json.mockResolvedValue(crumb); + const jenkinsInfoCrumb: JenkinsInfo = { ...jenkinsInfo, crumbIssuer: true }; + const jenkinsApiProto = Object.getPrototypeOf(jenkinsApi); + + it('adds crumb', async () => { + mockFetch.mockResolvedValueOnce({ ok: true, json } as Response); + const response = await jenkinsApiProto.getHeaders(jenkinsInfoCrumb); + expect(response).toEqual({ ...jenkinsInfo.headers, '.crumb': 'foobar' }); + }); + it('does not add crumb', async () => { + const response = await jenkinsApiProto.getHeaders(jenkinsInfo); + expect(response).toEqual(jenkinsInfo.headers); + }); + it('fails to get crumb', async () => { + mockFetch.mockResolvedValueOnce({ ok: false } as Response); + const error = await getError(async () => + jenkinsApiProto.getHeaders(jenkinsInfoCrumb), + ); + expect(error).toBeInstanceOf(ResponseError); + }); + }); describe('rebuildProject', () => { it('successfully rebuilds', async () => { - mockFetch.mockResolvedValue({ status: 200 } as Response); + mockFetch.mockResolvedValueOnce({ status: 200 } as Response); const status = await jenkinsApi.rebuildProject( jenkinsInfo, jobFullName, buildNumber, + resourceRef, ); expect(status).toEqual(200); }); it('fails to rebuild', async () => { - mockFetch.mockResolvedValue({ status: 401 } as Response); + mockFetch.mockResolvedValueOnce({ status: 401 } as Response); const status = await jenkinsApi.rebuildProject( jenkinsInfo, jobFullName, buildNumber, + resourceRef, ); expect(status).toEqual(401); }); + + it('should fail if it does not have required permissions', async () => { + fakePermissionApi.authorize.mockResolvedValueOnce([ + { + result: AuthorizeResult.DENY, + }, + ]); + + mockFetch.mockResolvedValueOnce({ status: 200 } as Response); + const status = await jenkinsApi.rebuildProject( + jenkinsInfo, + jobFullName, + buildNumber, + resourceRef, + ); + expect(status).toEqual(401); + }); + + it('with crumbIssuer option', async () => { + const info: JenkinsInfo = { ...jenkinsInfo, crumbIssuer: true }; + mockFetch.mockResolvedValueOnce({ status: 200 } as Response); + const crumbHeaders = { headerName: 'headerValue', '.crumb': 'bar' }; + + const privateGetHeaders = jest.spyOn( + JenkinsApiImpl.prototype as any, + 'getHeaders', + ); + privateGetHeaders.mockImplementation(() => { + return crumbHeaders; + }); + + const status = await jenkinsApi.rebuildProject( + info, + jobFullName, + buildNumber, + resourceRef, + ); + expect(status).toEqual(200); + + type HeaderResponse = { + headerName: string; + '.crumb': string; + }; + type OptionResponse = { + headers: HeaderResponse; + method: string; + }; + const requestOptions: OptionResponse = mockFetch.mock.calls[0][1] as any; + expect(requestOptions.headers).toStrictEqual(crumbHeaders); + }); }); }); diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.ts b/plugins/jenkins-backend/src/service/jenkinsApi.ts index 0d5d282bf7..135d695e18 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.ts @@ -23,6 +23,12 @@ import type { JenkinsProject, ScmDetails, } from '../types'; +import { + AuthorizeResult, + PermissionEvaluator, +} from '@backstage/plugin-permission-common'; +import { jenkinsExecutePermission } from '@backstage/plugin-jenkins-common'; +import { ResponseError } from '@backstage/errors'; import fetch, { HeaderInit } from 'node-fetch'; export class JenkinsApiImpl { @@ -59,6 +65,8 @@ export class JenkinsApiImpl { ${JenkinsApiImpl.jobTreeSpec} ]{0,50}`; + constructor(private readonly permissionApi?: PermissionEvaluator) {} + /** * Get a list of projects for the given JenkinsInfo. * @see ../../../jenkins/src/api/JenkinsApi.ts#getProjects @@ -141,14 +149,29 @@ export class JenkinsApiImpl { jenkinsInfo: JenkinsInfo, jobFullName: string, buildNumber: number, + resourceRef: string, + options?: { token?: string }, ): Promise { + if (this.permissionApi) { + const response = await this.permissionApi.authorize( + [{ permission: jenkinsExecutePermission, resourceRef }], + { token: options?.token }, + ); + // permission api returns always at least one item, we need to check only one result since we do not expect any additional results + const { result } = response[0]; + if (result === AuthorizeResult.DENY) { + return 401; + } + } + const buildUrl = this.getBuildUrl(jenkinsInfo, jobFullName, buildNumber); + const headers = await this.getHeaders(jenkinsInfo); // the current SDK only supports triggering a new build // replay the job by triggering request directly from Jenkins api const response = await fetch(`${buildUrl}/replay/rebuild`, { method: 'post', - headers: jenkinsInfo.headers as HeaderInit, + headers: headers, }); return response.status; } @@ -308,4 +331,36 @@ export class JenkinsApiImpl { const jobs = jobFullName.split('/'); return `${jenkinsInfo.baseUrl}/job/${jobs.join('/job/')}/${buildId}`; } + + private async getHeaders(jenkinsInfo: JenkinsInfo): Promise { + let headers = jenkinsInfo.headers as HeaderInit; + if (!jenkinsInfo.crumbIssuer) { + return headers; + } + const response = await fetch( + `${jenkinsInfo.baseUrl}/crumbIssuer/api/json`, + { + method: 'get', + headers: headers, + }, + ); + if (!response.ok) { + throw ResponseError.fromResponse(response); + } + type CrumbResponse = { + crumb: string; + crumbRequestField: string; + }; + + const crumbJson: CrumbResponse = await response.json(); + if ('crumb' in crumbJson && 'crumbRequestField' in crumbJson) { + const headerObject = { + ...jenkinsInfo.headers, + [crumbJson.crumbRequestField]: crumbJson.crumb, + }; + headers = headerObject as HeaderInit; + } + + return headers; + } } diff --git a/plugins/jenkins-backend/src/service/router.ts b/plugins/jenkins-backend/src/service/router.ts index 5f82f5e933..484bfa273f 100644 --- a/plugins/jenkins-backend/src/service/router.ts +++ b/plugins/jenkins-backend/src/service/router.ts @@ -20,22 +20,41 @@ import Router from 'express-promise-router'; import { Logger } from 'winston'; import { JenkinsInfoProvider } from './jenkinsInfoProvider'; import { JenkinsApiImpl } from './jenkinsApi'; +import { + PermissionAuthorizer, + PermissionEvaluator, + toPermissionEvaluator, +} from '@backstage/plugin-permission-common'; import { getBearerTokenFromAuthorizationHeader } from '@backstage/plugin-auth-node'; +import { stringifyEntityRef } from '@backstage/catalog-model'; import { stringifyError } from '@backstage/errors'; /** @public */ export interface RouterOptions { logger: Logger; jenkinsInfoProvider: JenkinsInfoProvider; + permissions?: PermissionEvaluator | PermissionAuthorizer; } /** @public */ export async function createRouter( options: RouterOptions, ): Promise { - const { jenkinsInfoProvider } = options; + const { jenkinsInfoProvider, permissions, logger } = options; - const jenkinsApi = new JenkinsApiImpl(); + let permissionEvaluator: PermissionEvaluator | undefined; + if (permissions && 'authorizeConditional' in permissions) { + permissionEvaluator = permissions as PermissionEvaluator; + } else { + logger.warn( + 'PermissionAuthorizer is deprecated. Please use an instance of PermissionEvaluator instead of PermissionAuthorizer in PluginEnvironment#permissions', + ); + permissionEvaluator = permissions + ? toPermissionEvaluator(permissions) + : undefined; + } + + const jenkinsApi = new JenkinsApiImpl(permissionEvaluator); const router = Router(); router.use(express.json()); @@ -143,10 +162,15 @@ export async function createRouter( backstageToken: token, }); + const resourceRef = stringifyEntityRef({ kind, namespace, name }); const status = await jenkinsApi.rebuildProject( jenkinsInfo, jobFullName, parseInt(buildNumber, 10), + resourceRef, + { + token, + }, ); response.json({}).status(status); }, From 8f21ebe6295a739dcefaaeabac70f5e03e7158ae Mon Sep 17 00:00:00 2001 From: Tim Soslow Date: Thu, 11 May 2023 23:22:26 -0500 Subject: [PATCH 8/8] Remove crumbIssuer support in rebuildProject Crumb issuer support is not required for API calls using a token, so I am simplifying the code to remove it. Signed-off-by: Tim Soslow --- .../src/service/jenkinsApi.test.ts | 69 ------------------- .../jenkins-backend/src/service/jenkinsApi.ts | 36 +--------- 2 files changed, 1 insertion(+), 104 deletions(-) diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.test.ts b/plugins/jenkins-backend/src/service/jenkinsApi.test.ts index 15f4bc651f..76ed1e32e1 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.test.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.test.ts @@ -20,7 +20,6 @@ import { JenkinsInfo } from './jenkinsInfoProvider'; import { JenkinsBuild, JenkinsProject } from '../types'; import { AuthorizeResult } from '@backstage/plugin-permission-common'; import fetch, { Response } from 'node-fetch'; -import { ResponseError } from '@backstage/errors'; jest.mock('jenkins'); jest.mock('node-fetch'); @@ -54,17 +53,6 @@ const fakePermissionApi = { authorizeConditional: jest.fn(), }; -class NoErrorThrownError extends Error {} - -const getError = async (call: () => unknown): Promise => { - try { - await call(); - throw new NoErrorThrownError(); - } catch (error: unknown) { - return error as TError; - } -}; - describe('JenkinsApi', () => { const jenkinsApi = new JenkinsApiImpl(fakePermissionApi); const mockFetch = fetch as jest.MockedFunction; @@ -722,30 +710,6 @@ describe('JenkinsApi', () => { 'https://jenkins.example.com/job/example-jobName/job/foo/job/bar/19', ); }); - describe('getHeaders', () => { - const crumb = { crumb: 'foobar', crumbRequestField: '.crumb' }; - const json = jest.fn() as jest.MockedFunction; - json.mockResolvedValue(crumb); - const jenkinsInfoCrumb: JenkinsInfo = { ...jenkinsInfo, crumbIssuer: true }; - const jenkinsApiProto = Object.getPrototypeOf(jenkinsApi); - - it('adds crumb', async () => { - mockFetch.mockResolvedValueOnce({ ok: true, json } as Response); - const response = await jenkinsApiProto.getHeaders(jenkinsInfoCrumb); - expect(response).toEqual({ ...jenkinsInfo.headers, '.crumb': 'foobar' }); - }); - it('does not add crumb', async () => { - const response = await jenkinsApiProto.getHeaders(jenkinsInfo); - expect(response).toEqual(jenkinsInfo.headers); - }); - it('fails to get crumb', async () => { - mockFetch.mockResolvedValueOnce({ ok: false } as Response); - const error = await getError(async () => - jenkinsApiProto.getHeaders(jenkinsInfoCrumb), - ); - expect(error).toBeInstanceOf(ResponseError); - }); - }); describe('rebuildProject', () => { it('successfully rebuilds', async () => { mockFetch.mockResolvedValueOnce({ status: 200 } as Response); @@ -784,38 +748,5 @@ describe('JenkinsApi', () => { ); expect(status).toEqual(401); }); - - it('with crumbIssuer option', async () => { - const info: JenkinsInfo = { ...jenkinsInfo, crumbIssuer: true }; - mockFetch.mockResolvedValueOnce({ status: 200 } as Response); - const crumbHeaders = { headerName: 'headerValue', '.crumb': 'bar' }; - - const privateGetHeaders = jest.spyOn( - JenkinsApiImpl.prototype as any, - 'getHeaders', - ); - privateGetHeaders.mockImplementation(() => { - return crumbHeaders; - }); - - const status = await jenkinsApi.rebuildProject( - info, - jobFullName, - buildNumber, - resourceRef, - ); - expect(status).toEqual(200); - - type HeaderResponse = { - headerName: string; - '.crumb': string; - }; - type OptionResponse = { - headers: HeaderResponse; - method: string; - }; - const requestOptions: OptionResponse = mockFetch.mock.calls[0][1] as any; - expect(requestOptions.headers).toStrictEqual(crumbHeaders); - }); }); }); diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.ts b/plugins/jenkins-backend/src/service/jenkinsApi.ts index 135d695e18..53a35c974b 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.ts @@ -28,7 +28,6 @@ import { PermissionEvaluator, } from '@backstage/plugin-permission-common'; import { jenkinsExecutePermission } from '@backstage/plugin-jenkins-common'; -import { ResponseError } from '@backstage/errors'; import fetch, { HeaderInit } from 'node-fetch'; export class JenkinsApiImpl { @@ -165,13 +164,12 @@ export class JenkinsApiImpl { } const buildUrl = this.getBuildUrl(jenkinsInfo, jobFullName, buildNumber); - const headers = await this.getHeaders(jenkinsInfo); // the current SDK only supports triggering a new build // replay the job by triggering request directly from Jenkins api const response = await fetch(`${buildUrl}/replay/rebuild`, { method: 'post', - headers: headers, + headers: jenkinsInfo.headers as HeaderInit, }); return response.status; } @@ -331,36 +329,4 @@ export class JenkinsApiImpl { const jobs = jobFullName.split('/'); return `${jenkinsInfo.baseUrl}/job/${jobs.join('/job/')}/${buildId}`; } - - private async getHeaders(jenkinsInfo: JenkinsInfo): Promise { - let headers = jenkinsInfo.headers as HeaderInit; - if (!jenkinsInfo.crumbIssuer) { - return headers; - } - const response = await fetch( - `${jenkinsInfo.baseUrl}/crumbIssuer/api/json`, - { - method: 'get', - headers: headers, - }, - ); - if (!response.ok) { - throw ResponseError.fromResponse(response); - } - type CrumbResponse = { - crumb: string; - crumbRequestField: string; - }; - - const crumbJson: CrumbResponse = await response.json(); - if ('crumb' in crumbJson && 'crumbRequestField' in crumbJson) { - const headerObject = { - ...jenkinsInfo.headers, - [crumbJson.crumbRequestField]: crumbJson.crumb, - }; - headers = headerObject as HeaderInit; - } - - return headers; - } }