From 47952621dcb8fe274b74e94efefabfa01276f118 Mon Sep 17 00:00:00 2001 From: "TANGUY Antoine (SIB)" Date: Thu, 1 Sep 2022 17:00:15 +0200 Subject: [PATCH] feat(jenkins-backend): extend config to allow passing extra headers Signed-off-by: TANGUY Antoine (SIB) --- .changeset/quick-lamps-talk.md | 5 ++++ plugins/jenkins-backend/README.md | 3 ++ plugins/jenkins-backend/api-report.md | 1 + .../src/service/jenkinsInfoProvider.test.ts | 10 +++++++ .../src/service/jenkinsInfoProvider.ts | 30 +++++++++++-------- 5 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 .changeset/quick-lamps-talk.md diff --git a/.changeset/quick-lamps-talk.md b/.changeset/quick-lamps-talk.md new file mode 100644 index 0000000000..3450113520 --- /dev/null +++ b/.changeset/quick-lamps-talk.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-jenkins-backend': patch +--- + +Extend configuration so that extra headers can be sent to jenkins instance diff --git a/plugins/jenkins-backend/README.md b/plugins/jenkins-backend/README.md index 5fd3416e42..6d767c502e 100644 --- a/plugins/jenkins-backend/README.md +++ b/plugins/jenkins-backend/README.md @@ -89,6 +89,9 @@ jenkins: baseUrl: https://jenkins.example.com username: backstage-bot apiKey: 123456789abcdef0123456789abcedf012 + # optionally add extra headers + # extraRequestHeaders: + # extra-header: my-value ``` Catalog diff --git a/plugins/jenkins-backend/api-report.md b/plugins/jenkins-backend/api-report.md index 489a5e4fb2..fd1365547d 100644 --- a/plugins/jenkins-backend/api-report.md +++ b/plugins/jenkins-backend/api-report.md @@ -72,6 +72,7 @@ export interface JenkinsInstanceConfig { baseUrl: string; // (undocumented) crumbIssuer?: boolean; + extraRequestHeaders?: Record; // (undocumented) name: string; // (undocumented) diff --git a/plugins/jenkins-backend/src/service/jenkinsInfoProvider.test.ts b/plugins/jenkins-backend/src/service/jenkinsInfoProvider.test.ts index b608a9f313..8e14997fd7 100644 --- a/plugins/jenkins-backend/src/service/jenkinsInfoProvider.test.ts +++ b/plugins/jenkins-backend/src/service/jenkinsInfoProvider.test.ts @@ -55,6 +55,9 @@ describe('JenkinsConfig', () => { baseUrl: 'https://jenkins.example.com', username: 'backstage - bot', apiKey: '123456789abcdef0123456789abcedf012', + headers: { + myHeader: 'my-value', + }, }, ], }, @@ -67,6 +70,9 @@ describe('JenkinsConfig', () => { baseUrl: 'https://jenkins.example.com', username: 'backstage - bot', apiKey: '123456789abcdef0123456789abcedf012', + headers: { + myHeader: 'my-value', + }, }, ]); }); @@ -197,6 +203,9 @@ describe('DefaultJenkinsInfoProvider', () => { baseUrl: 'https://jenkins.example.com', username: 'backstage - bot', apiKey: '123456789abcdef0123456789abcedf012', + extraRequestHeaders: { + ['extra-header']: 'extra-value', + }, }, }, { @@ -218,6 +227,7 @@ describe('DefaultJenkinsInfoProvider', () => { headers: { Authorization: 'Basic YmFja3N0YWdlIC0gYm90OjEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNlZGYwMTI=', + 'extra-header': 'extra-value', }, jobFullName: 'teamA/artistLookup-build', }); diff --git a/plugins/jenkins-backend/src/service/jenkinsInfoProvider.ts b/plugins/jenkins-backend/src/service/jenkinsInfoProvider.ts index 37aae5cb1c..2ad5b60f6d 100644 --- a/plugins/jenkins-backend/src/service/jenkinsInfoProvider.ts +++ b/plugins/jenkins-backend/src/service/jenkinsInfoProvider.ts @@ -53,6 +53,10 @@ export interface JenkinsInstanceConfig { username: string; apiKey: string; crumbIssuer?: boolean; + /** + * Extra headers to send to Jenkins instance + */ + extraRequestHeaders?: Record; } /** @@ -74,12 +78,13 @@ export class JenkinsConfig { const jenkinsConfig = config.getConfig('jenkins'); // load all named instance config - const namedInstanceConfig = + const namedInstanceConfig: JenkinsInstanceConfig[] = jenkinsConfig.getOptionalConfigArray('instances')?.map(c => ({ name: c.getString('name'), baseUrl: c.getString('baseUrl'), username: c.getString('username'), apiKey: c.getString('apiKey'), + headers: c.getOptional('headers'), crumbIssuer: c.getOptionalBoolean('crumbIssuer'), })) || []; @@ -93,6 +98,9 @@ export class JenkinsConfig { const username = jenkinsConfig.getOptionalString('username'); const apiKey = jenkinsConfig.getOptionalString('apiKey'); const crumbIssuer = jenkinsConfig.getOptionalBoolean('crumbIssuer'); + const extraRequestHeaders = jenkinsConfig.getOptional< + JenkinsInstanceConfig['extraRequestHeaders'] + >('extraRequestHeaders'); if (hasNamedDefault && (baseUrl || username || apiKey)) { throw new Error( @@ -109,19 +117,16 @@ export class JenkinsConfig { } if (unnamedAllPresent) { - const unnamedInstanceConfig = [ - { name: DEFAULT_JENKINS_NAME, baseUrl, username, apiKey, crumbIssuer }, - ] as { - name: string; - baseUrl: string; - username: string; - apiKey: string; - crumbIssuer: boolean; - }[]; - return new JenkinsConfig([ ...namedInstanceConfig, - ...unnamedInstanceConfig, + { + name: DEFAULT_JENKINS_NAME, + baseUrl, + username, + apiKey, + extraRequestHeaders, + crumbIssuer, + }, ]); } @@ -243,6 +248,7 @@ export class DefaultJenkinsInfoProvider implements JenkinsInfoProvider { baseUrl: instanceConfig.baseUrl, headers: { Authorization: `Basic ${creds}`, + ...instanceConfig.extraRequestHeaders, }, jobFullName, crumbIssuer: instanceConfig.crumbIssuer,