From 1cea434c48cf8ae63b1619c519575f55873fcf8b Mon Sep 17 00:00:00 2001 From: Bogdan Nechyporenko Date: Fri, 14 Mar 2025 21:02:11 +0100 Subject: [PATCH] Made "gitlab:projectAccessToken:create" action idempotent Signed-off-by: Bogdan Nechyporenko --- .changeset/olive-mammals-call.md | 5 ++++ .../actions/gitlabProjectAccessTokenCreate.ts | 26 ++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 .changeset/olive-mammals-call.md diff --git a/.changeset/olive-mammals-call.md b/.changeset/olive-mammals-call.md new file mode 100644 index 0000000000..1fb0e42dc4 --- /dev/null +++ b/.changeset/olive-mammals-call.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-gitlab': patch +--- + +Made "gitlab:projectAccessToken:create" action idempotent diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectAccessTokenCreate.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectAccessTokenCreate.ts index ae1e92214f..de248c56f7 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectAccessTokenCreate.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectAccessTokenCreate.ts @@ -104,21 +104,27 @@ export const createGitlabProjectAccessTokenAction = (options: { }); } - const response = await api.ProjectAccessTokens.create( - projectId, - name, - scopes as AccessTokenScopes[], - expiresAt || DateTime.now().plus({ days: 365 }).toISODate()!, - { - accessLevel, + const projectAccessToken = await ctx.checkpoint({ + key: `project.access.token.${projectId}.${name}`, + fn: async () => { + const response = await api.ProjectAccessTokens.create( + projectId, + name, + scopes as AccessTokenScopes[], + expiresAt || DateTime.now().plus({ days: 365 }).toISODate()!, + { + accessLevel, + }, + ); + return response.token; }, - ); + }); - if (!response.token) { + if (!projectAccessToken) { throw new Error('Could not create project access token'); } - ctx.output('access_token', response.token); + ctx.output('access_token', projectAccessToken); }, }); };