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); }, }); };