diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/prepare/bitbucket.ts b/plugins/scaffolder-backend/src/scaffolder/stages/prepare/bitbucket.ts index 5bc58e34f0..b992861c57 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/prepare/bitbucket.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/prepare/bitbucket.ts @@ -63,7 +63,6 @@ export class BitbucketPreparer implements PreparerBase { ): Promise { const { protocol, location } = parseLocationAnnotation(template); const workingDirectory = opts?.workingDirectory ?? os.tmpdir(); - const { logger } = opts; if (!['bitbucket', 'url'].includes(protocol)) { throw new InputError( @@ -86,13 +85,14 @@ export class BitbucketPreparer implements PreparerBase { const checkoutLocation = path.resolve(tempDir, templateDirectory); - const git = this.privateToken + const auth = this.getAuth(repo.resource); + + const git = auth ? Git.fromAuth({ - username: this.username, - password: this.privateToken, - logger, + ...auth, + logger: this.logger, }) - : Git.fromAuth({ logger }); + : Git.fromAuth({ logger: this.logger }); await git.clone({ url: repositoryCheckoutUrl, @@ -101,4 +101,32 @@ export class BitbucketPreparer implements PreparerBase { return checkoutLocation; } + + private getAuth( + host: string, + ): { username: string; password: string } | undefined { + if (this.username && this.privateToken) { + return { username: this.username, password: this.privateToken }; + } + + const bitbucketIntegrationConfig = this.integrations.find( + c => c.host === host, + ); + + // TODO(blam): Not sure how appPassword fits in here. Just doing the most simple of + // implementations with the intergations config for now but can maybe fallback to + // appPassword instead maybe at a later stage. + if ( + !bitbucketIntegrationConfig || + !bitbucketIntegrationConfig.username || + !bitbucketIntegrationConfig.token + ) { + return undefined; + } + + return { + username: bitbucketIntegrationConfig.username, + password: bitbucketIntegrationConfig.token, + }; + } }