@backstage/plugin-scaffolder-backend-module-gitlab 0.8.1-next.1 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,42 @@
1
1
  # @backstage/plugin-scaffolder-backend-module-gitlab
2
2
 
3
+ ## 0.8.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 0df33ea: fix: Creating a repository in a user namespace would always lead to an error
8
+ - 984b283: Made "gitlab:pipeline:trigger" action idempotent
9
+ - 225c733: Made gitlab:repo:push action idempotent.
10
+ - a08cb20: Remove usages of `@backstage/backend-common`
11
+ - ac58f84: Made gitlab:issue:edit action idempotent.
12
+ - f6b51a8: Made "gitlab:projectDeployToken:create" action idempotent
13
+ - a75e18f: Change the if statement in the catch block to match what the new version of Gitbeaker will return
14
+ - 36af946: Made "gitlab:projectVariable:create" action idempotent
15
+ - 1cea434: Made "gitlab:projectAccessToken:create" action idempotent
16
+ - 4f8b5b6: Allow signing git commits using configured private PGP key in scaffolder
17
+ - 83ae330: Made "gitlab:group:migrate" action idempotent
18
+ - Updated dependencies
19
+ - @backstage/integration@1.16.2
20
+ - @backstage/plugin-scaffolder-node@0.8.0
21
+ - @backstage/backend-plugin-api@1.2.1
22
+ - @backstage/config@1.3.2
23
+ - @backstage/errors@1.2.7
24
+
25
+ ## 0.8.1-next.2
26
+
27
+ ### Patch Changes
28
+
29
+ - 0df33ea: fix: Creating a repository in a user namespace would always lead to an error
30
+ - ac58f84: Made gitlab:issue:edit action idempotent.
31
+ - a75e18f: Change the if statement in the catch block to match what the new version of Gitbeaker will return
32
+ - 4f8b5b6: Allow signing git commits using configured private PGP key in scaffolder
33
+ - Updated dependencies
34
+ - @backstage/plugin-scaffolder-node@0.8.0-next.2
35
+ - @backstage/integration@1.16.2-next.0
36
+ - @backstage/backend-plugin-api@1.2.1-next.1
37
+ - @backstage/config@1.3.2
38
+ - @backstage/errors@1.2.7
39
+
3
40
  ## 0.8.1-next.1
4
41
 
5
42
  ### Patch Changes
@@ -47,6 +47,11 @@ function createPublishGitlabAction(options) {
47
47
  type: "string",
48
48
  description: `Sets the default author email for the commit.`
49
49
  },
50
+ signCommit: {
51
+ title: "Sign commit",
52
+ type: "boolean",
53
+ description: "Sign commit with configured PGP private key"
54
+ },
50
55
  sourcePath: {
51
56
  title: "Source Path",
52
57
  description: "Path within the workspace that will be used as the repository root. If omitted or set to true, the entire workspace will be published as the repository. If set to false, the created repository will be empty.",
@@ -260,7 +265,8 @@ function createPublishGitlabAction(options) {
260
265
  settings = {},
261
266
  branches = [],
262
267
  projectVariables = [],
263
- skipExisting = false
268
+ skipExisting = false,
269
+ signCommit
264
270
  } = ctx.input;
265
271
  const { owner, repo, host } = pluginScaffolderNode.parseRepoUrl(repoUrl, integrations);
266
272
  if (!owner) {
@@ -284,11 +290,13 @@ function createPublishGitlabAction(options) {
284
290
  [tokenType]: token
285
291
  });
286
292
  let targetNamespaceId;
293
+ let targetNamespaceKind;
287
294
  try {
288
295
  const namespaceResponse = await client.Namespaces.show(owner);
289
296
  targetNamespaceId = namespaceResponse.id;
297
+ targetNamespaceKind = namespaceResponse.kind;
290
298
  } catch (e) {
291
- if (e.response && e.response.statusCode === 404) {
299
+ if (e.cause?.response?.status === 404) {
292
300
  throw new errors.InputError(
293
301
  `The namespace ${owner} is not found or the user doesn't have permissions to access it`
294
302
  );
@@ -298,12 +306,11 @@ function createPublishGitlabAction(options) {
298
306
  const { id: userId } = await client.Users.showCurrentUser();
299
307
  if (!targetNamespaceId) {
300
308
  targetNamespaceId = userId;
309
+ targetNamespaceKind = "user";
301
310
  }
302
- const existingProjects = await client.Groups.allProjects(owner, {
303
- search: repo
304
- });
311
+ const existingProjects = targetNamespaceKind === "user" ? await client.Users.allProjects(owner, { search: repo }) : await client.Groups.allProjects(owner, { search: repo });
305
312
  const existingProject = existingProjects.find(
306
- (searchPathElem) => searchPathElem.path === repo
313
+ (project) => project.path === repo
307
314
  );
308
315
  if (!skipExisting || skipExisting && !existingProject) {
309
316
  ctx.logger.info(`Creating repo ${repo} in namespace ${owner}.`);
@@ -327,6 +334,12 @@ function createPublishGitlabAction(options) {
327
334
  name: gitAuthorName ? gitAuthorName : config.getOptionalString("scaffolder.defaultAuthor.name"),
328
335
  email: gitAuthorEmail ? gitAuthorEmail : config.getOptionalString("scaffolder.defaultAuthor.email")
329
336
  };
337
+ const signingKey = integrationConfig.config.commitSigningKey ?? config.getOptionalString("scaffolder.defaultCommitSigningKey");
338
+ if (signCommit && !signingKey) {
339
+ throw new Error(
340
+ "Signing commits is enabled but no signing key is provided in the configuration"
341
+ );
342
+ }
330
343
  const shouldSkipPublish = typeof ctx.input.sourcePath === "boolean" && !ctx.input.sourcePath;
331
344
  if (!shouldSkipPublish) {
332
345
  const commitResult = await pluginScaffolderNode.initRepoAndPush({
@@ -342,7 +355,8 @@ function createPublishGitlabAction(options) {
342
355
  },
343
356
  logger: ctx.logger,
344
357
  commitMessage: gitCommitMessage ? gitCommitMessage : config.getOptionalString("scaffolder.defaultCommitMessage"),
345
- gitAuthorInfo
358
+ gitAuthorInfo,
359
+ signingKey: signCommit ? signingKey : void 0
346
360
  });
347
361
  if (branches) {
348
362
  for (const branch of branches) {
@@ -1 +1 @@
1
- {"version":3,"file":"gitlab.cjs.js","sources":["../../src/actions/gitlab.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { Gitlab, VariableType } from '@gitbeaker/rest';\nimport {\n initRepoAndPush,\n getRepoSourceDirectory,\n parseRepoUrl,\n} from '@backstage/plugin-scaffolder-node';\nimport { Config } from '@backstage/config';\nimport { examples } from './gitlab.examples';\n\n/**\n * Creates a new action that initializes a git repository of the content in the workspace\n * and publishes it to GitLab.\n *\n * @public\n */\nexport function createPublishGitlabAction(options: {\n integrations: ScmIntegrationRegistry;\n config: Config;\n}) {\n const { integrations, config } = options;\n\n return createTemplateAction<{\n repoUrl: string;\n defaultBranch?: string;\n /** @deprecated in favour of settings.visibility field */\n repoVisibility?: 'private' | 'internal' | 'public';\n sourcePath?: string | boolean;\n skipExisting?: boolean;\n token?: string;\n gitCommitMessage?: string;\n gitAuthorName?: string;\n gitAuthorEmail?: string;\n setUserAsOwner?: boolean;\n /** @deprecated in favour of settings.topics field */\n topics?: string[];\n settings?: {\n path?: string;\n auto_devops_enabled?: boolean;\n ci_config_path?: string;\n description?: string;\n merge_method?: 'merge' | 'rebase_merge' | 'ff';\n squash_option?: 'default_off' | 'default_on' | 'never' | 'always';\n topics?: string[];\n visibility?: 'private' | 'internal' | 'public';\n only_allow_merge_if_all_discussions_are_resolved?: boolean;\n only_allow_merge_if_pipeline_succeeds?: boolean;\n allow_merge_on_skipped_pipeline?: boolean;\n };\n branches?: Array<{\n name: string;\n protect?: boolean;\n create?: boolean;\n ref?: string;\n }>;\n projectVariables?: Array<{\n key: string;\n value: string;\n description?: string;\n variable_type?: string;\n protected?: boolean;\n masked?: boolean;\n raw?: boolean;\n environment_scope?: string;\n }>;\n }>({\n id: 'publish:gitlab',\n description:\n 'Initializes a git repository of the content in the workspace, and publishes it to GitLab.',\n examples,\n schema: {\n input: {\n type: 'object',\n required: ['repoUrl'],\n properties: {\n repoUrl: {\n title: 'Repository Location',\n type: 'string',\n description: `Accepts the format 'gitlab.com?repo=project_name&owner=group_name' where 'project_name' is the repository name and 'group_name' is a group or username`,\n },\n repoVisibility: {\n title: 'Repository Visibility',\n description: `Sets the visibility of the repository. The default value is 'private'. (deprecated, use settings.visibility instead)`,\n type: 'string',\n enum: ['private', 'public', 'internal'],\n },\n defaultBranch: {\n title: 'Default Branch',\n type: 'string',\n description: `Sets the default branch on the repository. The default value is 'master'`,\n },\n gitCommitMessage: {\n title: 'Git Commit Message',\n type: 'string',\n description: `Sets the commit message on the repository. The default value is 'initial commit'`,\n },\n gitAuthorName: {\n title: 'Default Author Name',\n type: 'string',\n description: `Sets the default author name for the commit. The default value is 'Scaffolder'`,\n },\n gitAuthorEmail: {\n title: 'Default Author Email',\n type: 'string',\n description: `Sets the default author email for the commit.`,\n },\n sourcePath: {\n title: 'Source Path',\n description:\n 'Path within the workspace that will be used as the repository root. If omitted or set to true, the entire workspace will be published as the repository. If set to false, the created repository will be empty.',\n type: ['string', 'boolean'],\n },\n skipExisting: {\n title: 'Skip if repository exists',\n description:\n 'Do not publish the repository if it already exists. The default value is false.',\n type: ['boolean'],\n },\n token: {\n title: 'Authentication Token',\n type: 'string',\n description: 'The token to use for authorization to GitLab',\n },\n setUserAsOwner: {\n title: 'Set User As Owner',\n type: 'boolean',\n description:\n 'Set the token user as owner of the newly created repository. Requires a token authorized to do the edit in the integration configuration for the matching host',\n },\n topics: {\n title: 'Topic labels',\n description:\n 'Topic labels to apply on the repository. (deprecated, use settings.topics instead)',\n type: 'array',\n items: {\n type: 'string',\n },\n },\n settings: {\n title: 'Project settings',\n description:\n 'Additional project settings, based on https://docs.gitlab.com/ee/api/projects.html#create-project attributes',\n type: 'object',\n properties: {\n path: {\n title: 'Project path',\n description:\n 'Repository name for new project. Generated based on name if not provided (generated as lowercase with dashes).',\n type: 'string',\n },\n auto_devops_enabled: {\n title: 'Auto DevOps enabled',\n description: 'Enable Auto DevOps for this project',\n type: 'boolean',\n },\n ci_config_path: {\n title: 'CI config path',\n description: 'Custom CI config path for this project',\n type: 'string',\n },\n description: {\n title: 'Project description',\n description: 'Short project description',\n type: 'string',\n },\n merge_method: {\n title: 'Merge Method to use',\n description: 'Merge Methods (merge, rebase_merge, ff)',\n type: 'string',\n enum: ['merge', 'rebase_merge', 'ff'],\n },\n squash_option: {\n title: 'Squash option',\n description:\n 'Set squash option for the project (never, always, default_on, default_off)',\n type: 'string',\n enum: ['default_off', 'default_on', 'never', 'always'],\n },\n topics: {\n title: 'Topic labels',\n description: 'Topic labels to apply on the repository',\n type: 'array',\n items: {\n type: 'string',\n },\n },\n visibility: {\n title: 'Project visibility',\n description:\n 'The visibility of the project. Can be private, internal, or public. The default value is private.',\n type: 'string',\n enum: ['private', 'public', 'internal'],\n },\n only_allow_merge_if_all_discussions_are_resolved: {\n title: 'All threads must be resolved',\n description:\n 'Set whether merge requests can only be merged when all the discussions are resolved.',\n type: 'boolean',\n },\n only_allow_merge_if_pipeline_succeeds: {\n title: 'Pipelines must succeed',\n description:\n 'Set whether merge requests can only be merged with successful pipelines. This setting is named Pipelines must succeed in the project settings.',\n type: 'boolean',\n },\n allow_merge_on_skipped_pipeline: {\n title: 'Skipped pipelines are considered successful',\n description:\n 'Set whether or not merge requests can be merged with skipped jobs.',\n type: 'boolean',\n },\n },\n },\n branches: {\n title: 'Project branches settings',\n type: 'array',\n items: {\n type: 'object',\n required: ['name'],\n properties: {\n name: {\n title: 'Branch name',\n type: 'string',\n },\n protect: {\n title: 'Should branch be protected',\n description: `Will mark branch as protected. The default value is 'false'`,\n type: 'boolean',\n },\n create: {\n title: 'Should branch be created',\n description: `If branch does not exist, it will be created from provided ref. The default value is 'false'`,\n type: 'boolean',\n },\n ref: {\n title: 'Branch reference',\n description: `Branch reference to create branch from. The default value is 'master'`,\n type: 'string',\n },\n },\n },\n },\n projectVariables: {\n title: 'Project variables',\n description:\n 'Project variables settings based on Gitlab Project Environments API - https://docs.gitlab.com/ee/api/project_level_variables.html#create-a-variable',\n type: 'array',\n items: {\n type: 'object',\n required: ['key', 'value'],\n properties: {\n key: {\n title: 'Variable key',\n description:\n 'The key of a variable; must have no more than 255 characters; only A-Z, a-z, 0-9, and _ are allowed',\n type: 'string',\n },\n value: {\n title: 'Variable value',\n description: 'The value of a variable',\n type: 'string',\n },\n description: {\n title: 'Variable description',\n description: `The description of the variable. The default value is 'null'`,\n type: 'string',\n },\n variable_type: {\n title: 'Variable type',\n description: `The type of a variable. The default value is 'env_var'`,\n type: 'string',\n enum: ['env_var', 'file'],\n },\n protected: {\n title: 'Variable protection',\n description: `Whether the variable is protected. The default value is 'false'`,\n type: 'boolean',\n },\n raw: {\n title: 'Variable raw',\n description: `Whether the variable is in raw format. The default value is 'false'`,\n type: 'boolean',\n },\n environment_scope: {\n title: 'Variable environment scope',\n description: `The environment_scope of the variable. The default value is '*'`,\n type: 'string',\n },\n },\n },\n },\n },\n },\n output: {\n type: 'object',\n properties: {\n remoteUrl: {\n title: 'A URL to the repository with the provider',\n type: 'string',\n },\n repoContentsUrl: {\n title: 'A URL to the root of the repository',\n type: 'string',\n },\n projectId: {\n title: 'The ID of the project',\n type: 'number',\n },\n commitHash: {\n title: 'The git commit hash of the initial commit',\n type: 'string',\n },\n created: {\n title: 'Whether the repository was created or not',\n type: 'boolean',\n },\n },\n },\n },\n async handler(ctx) {\n const {\n repoUrl,\n repoVisibility = 'private',\n defaultBranch = 'master',\n gitCommitMessage = 'initial commit',\n gitAuthorName,\n gitAuthorEmail,\n setUserAsOwner = false,\n topics = [],\n settings = {},\n branches = [],\n projectVariables = [],\n skipExisting = false,\n } = ctx.input;\n const { owner, repo, host } = parseRepoUrl(repoUrl, integrations);\n\n if (!owner) {\n throw new InputError(\n `No owner provided for host: ${host}, and repo ${repo}`,\n );\n }\n\n const integrationConfig = integrations.gitlab.byHost(host);\n\n if (!integrationConfig) {\n throw new InputError(\n `No matching integration configuration for host ${host}, please check your integrations config`,\n );\n }\n\n if (!integrationConfig.config.token && !ctx.input.token) {\n throw new InputError(`No token available for host ${host}`);\n }\n\n const token = ctx.input.token || integrationConfig.config.token!;\n const tokenType = ctx.input.token ? 'oauthToken' : 'token';\n\n const client = new Gitlab({\n host: integrationConfig.config.baseUrl,\n [tokenType]: token,\n });\n\n let targetNamespaceId;\n\n try {\n const namespaceResponse = (await client.Namespaces.show(owner)) as {\n id: number;\n };\n\n targetNamespaceId = namespaceResponse.id;\n } catch (e) {\n if (e.response && e.response.statusCode === 404) {\n throw new InputError(\n `The namespace ${owner} is not found or the user doesn't have permissions to access it`,\n );\n }\n throw e;\n }\n\n const { id: userId } = (await client.Users.showCurrentUser()) as {\n id: number;\n };\n\n if (!targetNamespaceId) {\n targetNamespaceId = userId;\n }\n\n const existingProjects = await client.Groups.allProjects(owner, {\n search: repo,\n });\n const existingProject = existingProjects.find(\n searchPathElem => searchPathElem.path === repo,\n );\n\n if (!skipExisting || (skipExisting && !existingProject)) {\n ctx.logger.info(`Creating repo ${repo} in namespace ${owner}.`);\n const { id: projectId, http_url_to_repo } =\n await client.Projects.create({\n namespaceId: targetNamespaceId,\n name: repo,\n visibility: repoVisibility,\n ...(topics.length ? { topics } : {}),\n ...(Object.keys(settings).length ? { ...settings } : {}),\n });\n\n // When setUserAsOwner is true the input token is expected to come from an unprivileged user GitLab\n // OAuth flow. In this case GitLab works in a way that allows the unprivileged user to\n // create the repository, but not to push the default protected branch (e.g. master).\n // In order to set the user as owner of the newly created repository we need to check that the\n // GitLab integration configuration for the matching host contains a token and use\n // such token to bootstrap a new privileged client.\n if (setUserAsOwner && integrationConfig.config.token) {\n const adminClient = new Gitlab({\n host: integrationConfig.config.baseUrl,\n token: integrationConfig.config.token,\n });\n\n await adminClient.ProjectMembers.add(projectId, userId, 50);\n }\n\n const remoteUrl = (http_url_to_repo as string).replace(/\\.git$/, '');\n const repoContentsUrl = `${remoteUrl}/-/blob/${defaultBranch}`;\n\n const gitAuthorInfo = {\n name: gitAuthorName\n ? gitAuthorName\n : config.getOptionalString('scaffolder.defaultAuthor.name'),\n email: gitAuthorEmail\n ? gitAuthorEmail\n : config.getOptionalString('scaffolder.defaultAuthor.email'),\n };\n const shouldSkipPublish =\n typeof ctx.input.sourcePath === 'boolean' && !ctx.input.sourcePath;\n if (!shouldSkipPublish) {\n const commitResult = await initRepoAndPush({\n dir:\n typeof ctx.input.sourcePath === 'boolean'\n ? ctx.workspacePath\n : getRepoSourceDirectory(\n ctx.workspacePath,\n ctx.input.sourcePath,\n ),\n remoteUrl: http_url_to_repo as string,\n defaultBranch,\n auth: {\n username: 'oauth2',\n password: token,\n },\n logger: ctx.logger,\n commitMessage: gitCommitMessage\n ? gitCommitMessage\n : config.getOptionalString('scaffolder.defaultCommitMessage'),\n gitAuthorInfo,\n });\n\n if (branches) {\n for (const branch of branches) {\n const {\n name,\n protect = false,\n create = false,\n ref = 'master',\n } = branch;\n\n if (create) {\n try {\n await client.Branches.create(projectId, name, ref);\n } catch (e) {\n throw new InputError(\n `Branch creation failed for ${name}. ${printGitlabError(\n e,\n )}`,\n );\n }\n ctx.logger.info(\n `Branch ${name} created for ${projectId} with ref ${ref}`,\n );\n }\n\n if (protect) {\n try {\n await client.ProtectedBranches.protect(projectId, name);\n } catch (e) {\n throw new InputError(\n `Branch protection failed for ${name}. ${printGitlabError(\n e,\n )}`,\n );\n }\n ctx.logger.info(`Branch ${name} protected for ${projectId}`);\n }\n }\n }\n ctx.output('commitHash', commitResult?.commitHash);\n }\n\n if (projectVariables) {\n for (const variable of projectVariables) {\n const variableWithDefaults = Object.assign(variable, {\n variable_type: (variable.variable_type ??\n 'env_var') as VariableType,\n protected: variable.protected ?? false,\n masked: variable.masked ?? false,\n raw: variable.raw ?? false,\n environment_scope: variable.environment_scope ?? '*',\n });\n\n try {\n await client.ProjectVariables.create(\n projectId,\n variableWithDefaults.key,\n variableWithDefaults.value,\n {\n variableType: variableWithDefaults.variable_type,\n protected: variableWithDefaults.protected,\n masked: variableWithDefaults.masked,\n environmentScope: variableWithDefaults.environment_scope,\n description: variableWithDefaults.description,\n raw: variableWithDefaults.raw,\n },\n );\n } catch (e) {\n throw new InputError(\n `Environment variable creation failed for ${\n variableWithDefaults.key\n }. ${printGitlabError(e)}`,\n );\n }\n }\n }\n ctx.output('remoteUrl', remoteUrl);\n ctx.output('repoContentsUrl', repoContentsUrl);\n ctx.output('projectId', projectId);\n ctx.output('created', true);\n } else if (existingProject) {\n ctx.logger.info(`Repo ${repo} already exists in namespace ${owner}.`);\n const {\n id: projectId,\n http_url_to_repo,\n default_branch,\n } = existingProject;\n const remoteUrl = (http_url_to_repo as string).replace(/\\.git$/, '');\n ctx.output('remoteUrl', remoteUrl);\n ctx.output('repoContentsUrl', `${remoteUrl}/-/blob/${default_branch}`);\n ctx.output('projectId', projectId);\n ctx.output('created', false);\n }\n },\n });\n}\n\nfunction printGitlabError(error: any): string {\n return JSON.stringify({ code: error.code, message: error.description });\n}\n"],"names":["createTemplateAction","examples","parseRepoUrl","InputError","Gitlab","initRepoAndPush","getRepoSourceDirectory"],"mappings":"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"}
1
+ {"version":3,"file":"gitlab.cjs.js","sources":["../../src/actions/gitlab.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport {\n createTemplateAction,\n getRepoSourceDirectory,\n initRepoAndPush,\n parseRepoUrl,\n} from '@backstage/plugin-scaffolder-node';\nimport { Gitlab, VariableType } from '@gitbeaker/rest';\nimport { Config } from '@backstage/config';\nimport { examples } from './gitlab.examples';\n\n/**\n * Creates a new action that initializes a git repository of the content in the workspace\n * and publishes it to GitLab.\n *\n * @public\n */\nexport function createPublishGitlabAction(options: {\n integrations: ScmIntegrationRegistry;\n config: Config;\n}) {\n const { integrations, config } = options;\n\n return createTemplateAction<{\n repoUrl: string;\n defaultBranch?: string;\n /** @deprecated in favour of settings.visibility field */\n repoVisibility?: 'private' | 'internal' | 'public';\n sourcePath?: string | boolean;\n skipExisting?: boolean;\n token?: string;\n gitCommitMessage?: string;\n gitAuthorName?: string;\n gitAuthorEmail?: string;\n signCommit?: boolean;\n setUserAsOwner?: boolean;\n /** @deprecated in favour of settings.topics field */\n topics?: string[];\n settings?: {\n path?: string;\n auto_devops_enabled?: boolean;\n ci_config_path?: string;\n description?: string;\n merge_method?: 'merge' | 'rebase_merge' | 'ff';\n squash_option?: 'default_off' | 'default_on' | 'never' | 'always';\n topics?: string[];\n visibility?: 'private' | 'internal' | 'public';\n only_allow_merge_if_all_discussions_are_resolved?: boolean;\n only_allow_merge_if_pipeline_succeeds?: boolean;\n allow_merge_on_skipped_pipeline?: boolean;\n };\n branches?: Array<{\n name: string;\n protect?: boolean;\n create?: boolean;\n ref?: string;\n }>;\n projectVariables?: Array<{\n key: string;\n value: string;\n description?: string;\n variable_type?: string;\n protected?: boolean;\n masked?: boolean;\n raw?: boolean;\n environment_scope?: string;\n }>;\n }>({\n id: 'publish:gitlab',\n description:\n 'Initializes a git repository of the content in the workspace, and publishes it to GitLab.',\n examples,\n schema: {\n input: {\n type: 'object',\n required: ['repoUrl'],\n properties: {\n repoUrl: {\n title: 'Repository Location',\n type: 'string',\n description: `Accepts the format 'gitlab.com?repo=project_name&owner=group_name' where 'project_name' is the repository name and 'group_name' is a group or username`,\n },\n repoVisibility: {\n title: 'Repository Visibility',\n description: `Sets the visibility of the repository. The default value is 'private'. (deprecated, use settings.visibility instead)`,\n type: 'string',\n enum: ['private', 'public', 'internal'],\n },\n defaultBranch: {\n title: 'Default Branch',\n type: 'string',\n description: `Sets the default branch on the repository. The default value is 'master'`,\n },\n gitCommitMessage: {\n title: 'Git Commit Message',\n type: 'string',\n description: `Sets the commit message on the repository. The default value is 'initial commit'`,\n },\n gitAuthorName: {\n title: 'Default Author Name',\n type: 'string',\n description: `Sets the default author name for the commit. The default value is 'Scaffolder'`,\n },\n gitAuthorEmail: {\n title: 'Default Author Email',\n type: 'string',\n description: `Sets the default author email for the commit.`,\n },\n signCommit: {\n title: 'Sign commit',\n type: 'boolean',\n description: 'Sign commit with configured PGP private key',\n },\n sourcePath: {\n title: 'Source Path',\n description:\n 'Path within the workspace that will be used as the repository root. If omitted or set to true, the entire workspace will be published as the repository. If set to false, the created repository will be empty.',\n type: ['string', 'boolean'],\n },\n skipExisting: {\n title: 'Skip if repository exists',\n description:\n 'Do not publish the repository if it already exists. The default value is false.',\n type: ['boolean'],\n },\n token: {\n title: 'Authentication Token',\n type: 'string',\n description: 'The token to use for authorization to GitLab',\n },\n setUserAsOwner: {\n title: 'Set User As Owner',\n type: 'boolean',\n description:\n 'Set the token user as owner of the newly created repository. Requires a token authorized to do the edit in the integration configuration for the matching host',\n },\n topics: {\n title: 'Topic labels',\n description:\n 'Topic labels to apply on the repository. (deprecated, use settings.topics instead)',\n type: 'array',\n items: {\n type: 'string',\n },\n },\n settings: {\n title: 'Project settings',\n description:\n 'Additional project settings, based on https://docs.gitlab.com/ee/api/projects.html#create-project attributes',\n type: 'object',\n properties: {\n path: {\n title: 'Project path',\n description:\n 'Repository name for new project. Generated based on name if not provided (generated as lowercase with dashes).',\n type: 'string',\n },\n auto_devops_enabled: {\n title: 'Auto DevOps enabled',\n description: 'Enable Auto DevOps for this project',\n type: 'boolean',\n },\n ci_config_path: {\n title: 'CI config path',\n description: 'Custom CI config path for this project',\n type: 'string',\n },\n description: {\n title: 'Project description',\n description: 'Short project description',\n type: 'string',\n },\n merge_method: {\n title: 'Merge Method to use',\n description: 'Merge Methods (merge, rebase_merge, ff)',\n type: 'string',\n enum: ['merge', 'rebase_merge', 'ff'],\n },\n squash_option: {\n title: 'Squash option',\n description:\n 'Set squash option for the project (never, always, default_on, default_off)',\n type: 'string',\n enum: ['default_off', 'default_on', 'never', 'always'],\n },\n topics: {\n title: 'Topic labels',\n description: 'Topic labels to apply on the repository',\n type: 'array',\n items: {\n type: 'string',\n },\n },\n visibility: {\n title: 'Project visibility',\n description:\n 'The visibility of the project. Can be private, internal, or public. The default value is private.',\n type: 'string',\n enum: ['private', 'public', 'internal'],\n },\n only_allow_merge_if_all_discussions_are_resolved: {\n title: 'All threads must be resolved',\n description:\n 'Set whether merge requests can only be merged when all the discussions are resolved.',\n type: 'boolean',\n },\n only_allow_merge_if_pipeline_succeeds: {\n title: 'Pipelines must succeed',\n description:\n 'Set whether merge requests can only be merged with successful pipelines. This setting is named Pipelines must succeed in the project settings.',\n type: 'boolean',\n },\n allow_merge_on_skipped_pipeline: {\n title: 'Skipped pipelines are considered successful',\n description:\n 'Set whether or not merge requests can be merged with skipped jobs.',\n type: 'boolean',\n },\n },\n },\n branches: {\n title: 'Project branches settings',\n type: 'array',\n items: {\n type: 'object',\n required: ['name'],\n properties: {\n name: {\n title: 'Branch name',\n type: 'string',\n },\n protect: {\n title: 'Should branch be protected',\n description: `Will mark branch as protected. The default value is 'false'`,\n type: 'boolean',\n },\n create: {\n title: 'Should branch be created',\n description: `If branch does not exist, it will be created from provided ref. The default value is 'false'`,\n type: 'boolean',\n },\n ref: {\n title: 'Branch reference',\n description: `Branch reference to create branch from. The default value is 'master'`,\n type: 'string',\n },\n },\n },\n },\n projectVariables: {\n title: 'Project variables',\n description:\n 'Project variables settings based on Gitlab Project Environments API - https://docs.gitlab.com/ee/api/project_level_variables.html#create-a-variable',\n type: 'array',\n items: {\n type: 'object',\n required: ['key', 'value'],\n properties: {\n key: {\n title: 'Variable key',\n description:\n 'The key of a variable; must have no more than 255 characters; only A-Z, a-z, 0-9, and _ are allowed',\n type: 'string',\n },\n value: {\n title: 'Variable value',\n description: 'The value of a variable',\n type: 'string',\n },\n description: {\n title: 'Variable description',\n description: `The description of the variable. The default value is 'null'`,\n type: 'string',\n },\n variable_type: {\n title: 'Variable type',\n description: `The type of a variable. The default value is 'env_var'`,\n type: 'string',\n enum: ['env_var', 'file'],\n },\n protected: {\n title: 'Variable protection',\n description: `Whether the variable is protected. The default value is 'false'`,\n type: 'boolean',\n },\n raw: {\n title: 'Variable raw',\n description: `Whether the variable is in raw format. The default value is 'false'`,\n type: 'boolean',\n },\n environment_scope: {\n title: 'Variable environment scope',\n description: `The environment_scope of the variable. The default value is '*'`,\n type: 'string',\n },\n },\n },\n },\n },\n },\n output: {\n type: 'object',\n properties: {\n remoteUrl: {\n title: 'A URL to the repository with the provider',\n type: 'string',\n },\n repoContentsUrl: {\n title: 'A URL to the root of the repository',\n type: 'string',\n },\n projectId: {\n title: 'The ID of the project',\n type: 'number',\n },\n commitHash: {\n title: 'The git commit hash of the initial commit',\n type: 'string',\n },\n created: {\n title: 'Whether the repository was created or not',\n type: 'boolean',\n },\n },\n },\n },\n async handler(ctx) {\n const {\n repoUrl,\n repoVisibility = 'private',\n defaultBranch = 'master',\n gitCommitMessage = 'initial commit',\n gitAuthorName,\n gitAuthorEmail,\n setUserAsOwner = false,\n topics = [],\n settings = {},\n branches = [],\n projectVariables = [],\n skipExisting = false,\n signCommit,\n } = ctx.input;\n const { owner, repo, host } = parseRepoUrl(repoUrl, integrations);\n\n if (!owner) {\n throw new InputError(\n `No owner provided for host: ${host}, and repo ${repo}`,\n );\n }\n\n const integrationConfig = integrations.gitlab.byHost(host);\n\n if (!integrationConfig) {\n throw new InputError(\n `No matching integration configuration for host ${host}, please check your integrations config`,\n );\n }\n\n if (!integrationConfig.config.token && !ctx.input.token) {\n throw new InputError(`No token available for host ${host}`);\n }\n\n const token = ctx.input.token || integrationConfig.config.token!;\n const tokenType = ctx.input.token ? 'oauthToken' : 'token';\n\n const client = new Gitlab({\n host: integrationConfig.config.baseUrl,\n [tokenType]: token,\n });\n\n let targetNamespaceId;\n let targetNamespaceKind;\n try {\n const namespaceResponse = (await client.Namespaces.show(owner)) as {\n id: number;\n kind: string;\n };\n\n targetNamespaceId = namespaceResponse.id;\n targetNamespaceKind = namespaceResponse.kind;\n } catch (e) {\n if (e.cause?.response?.status === 404) {\n throw new InputError(\n `The namespace ${owner} is not found or the user doesn't have permissions to access it`,\n );\n }\n throw e;\n }\n\n const { id: userId } = (await client.Users.showCurrentUser()) as {\n id: number;\n };\n\n if (!targetNamespaceId) {\n targetNamespaceId = userId;\n targetNamespaceKind = 'user';\n }\n\n const existingProjects =\n targetNamespaceKind === 'user'\n ? await client.Users.allProjects(owner, { search: repo })\n : await client.Groups.allProjects(owner, { search: repo });\n\n const existingProject = existingProjects.find(\n project => project.path === repo,\n );\n\n if (!skipExisting || (skipExisting && !existingProject)) {\n ctx.logger.info(`Creating repo ${repo} in namespace ${owner}.`);\n const { id: projectId, http_url_to_repo } =\n await client.Projects.create({\n namespaceId: targetNamespaceId,\n name: repo,\n visibility: repoVisibility,\n ...(topics.length ? { topics } : {}),\n ...(Object.keys(settings).length ? { ...settings } : {}),\n });\n\n // When setUserAsOwner is true the input token is expected to come from an unprivileged user GitLab\n // OAuth flow. In this case GitLab works in a way that allows the unprivileged user to\n // create the repository, but not to push the default protected branch (e.g. master).\n // In order to set the user as owner of the newly created repository we need to check that the\n // GitLab integration configuration for the matching host contains a token and use\n // such token to bootstrap a new privileged client.\n if (setUserAsOwner && integrationConfig.config.token) {\n const adminClient = new Gitlab({\n host: integrationConfig.config.baseUrl,\n token: integrationConfig.config.token,\n });\n\n await adminClient.ProjectMembers.add(projectId, userId, 50);\n }\n\n const remoteUrl = (http_url_to_repo as string).replace(/\\.git$/, '');\n const repoContentsUrl = `${remoteUrl}/-/blob/${defaultBranch}`;\n\n const gitAuthorInfo = {\n name: gitAuthorName\n ? gitAuthorName\n : config.getOptionalString('scaffolder.defaultAuthor.name'),\n email: gitAuthorEmail\n ? gitAuthorEmail\n : config.getOptionalString('scaffolder.defaultAuthor.email'),\n };\n const signingKey =\n integrationConfig.config.commitSigningKey ??\n config.getOptionalString('scaffolder.defaultCommitSigningKey');\n if (signCommit && !signingKey) {\n throw new Error(\n 'Signing commits is enabled but no signing key is provided in the configuration',\n );\n }\n\n const shouldSkipPublish =\n typeof ctx.input.sourcePath === 'boolean' && !ctx.input.sourcePath;\n if (!shouldSkipPublish) {\n const commitResult = await initRepoAndPush({\n dir:\n typeof ctx.input.sourcePath === 'boolean'\n ? ctx.workspacePath\n : getRepoSourceDirectory(\n ctx.workspacePath,\n ctx.input.sourcePath,\n ),\n remoteUrl: http_url_to_repo as string,\n defaultBranch,\n auth: {\n username: 'oauth2',\n password: token,\n },\n logger: ctx.logger,\n commitMessage: gitCommitMessage\n ? gitCommitMessage\n : config.getOptionalString('scaffolder.defaultCommitMessage'),\n gitAuthorInfo,\n signingKey: signCommit ? signingKey : undefined,\n });\n\n if (branches) {\n for (const branch of branches) {\n const {\n name,\n protect = false,\n create = false,\n ref = 'master',\n } = branch;\n\n if (create) {\n try {\n await client.Branches.create(projectId, name, ref);\n } catch (e) {\n throw new InputError(\n `Branch creation failed for ${name}. ${printGitlabError(\n e,\n )}`,\n );\n }\n ctx.logger.info(\n `Branch ${name} created for ${projectId} with ref ${ref}`,\n );\n }\n\n if (protect) {\n try {\n await client.ProtectedBranches.protect(projectId, name);\n } catch (e) {\n throw new InputError(\n `Branch protection failed for ${name}. ${printGitlabError(\n e,\n )}`,\n );\n }\n ctx.logger.info(`Branch ${name} protected for ${projectId}`);\n }\n }\n }\n ctx.output('commitHash', commitResult?.commitHash);\n }\n\n if (projectVariables) {\n for (const variable of projectVariables) {\n const variableWithDefaults = Object.assign(variable, {\n variable_type: (variable.variable_type ??\n 'env_var') as VariableType,\n protected: variable.protected ?? false,\n masked: variable.masked ?? false,\n raw: variable.raw ?? false,\n environment_scope: variable.environment_scope ?? '*',\n });\n\n try {\n await client.ProjectVariables.create(\n projectId,\n variableWithDefaults.key,\n variableWithDefaults.value,\n {\n variableType: variableWithDefaults.variable_type,\n protected: variableWithDefaults.protected,\n masked: variableWithDefaults.masked,\n environmentScope: variableWithDefaults.environment_scope,\n description: variableWithDefaults.description,\n raw: variableWithDefaults.raw,\n },\n );\n } catch (e) {\n throw new InputError(\n `Environment variable creation failed for ${\n variableWithDefaults.key\n }. ${printGitlabError(e)}`,\n );\n }\n }\n }\n ctx.output('remoteUrl', remoteUrl);\n ctx.output('repoContentsUrl', repoContentsUrl);\n ctx.output('projectId', projectId);\n ctx.output('created', true);\n } else if (existingProject) {\n ctx.logger.info(`Repo ${repo} already exists in namespace ${owner}.`);\n const {\n id: projectId,\n http_url_to_repo,\n default_branch,\n } = existingProject;\n const remoteUrl = (http_url_to_repo as string).replace(/\\.git$/, '');\n ctx.output('remoteUrl', remoteUrl);\n ctx.output('repoContentsUrl', `${remoteUrl}/-/blob/${default_branch}`);\n ctx.output('projectId', projectId);\n ctx.output('created', false);\n }\n },\n });\n}\n\nfunction printGitlabError(error: any): string {\n return JSON.stringify({ code: error.code, message: error.description });\n}\n"],"names":["createTemplateAction","examples","parseRepoUrl","InputError","Gitlab","initRepoAndPush","getRepoSourceDirectory"],"mappings":"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"}
@@ -103,16 +103,23 @@ const editGitlabIssueAction = (options) => {
103
103
  const { host } = util.parseRepoUrl(repoUrl, integrations);
104
104
  const api = util.getClient({ host, integrations, token });
105
105
  let isEpicScoped = false;
106
- if (epicId) {
107
- isEpicScoped = await util.checkEpicScope(api, projectId, epicId);
108
- if (isEpicScoped) {
109
- ctx.logger.info("Epic is within Project Scope");
110
- } else {
111
- ctx.logger.warn(
112
- "Chosen epic is not within the Project Scope. The issue will be created without an associated epic."
113
- );
106
+ isEpicScoped = await ctx.checkpoint({
107
+ key: `issue.edit.is.scoped.${projectId}.${epicId}`,
108
+ fn: async () => {
109
+ if (epicId) {
110
+ const scoped = await util.checkEpicScope(api, projectId, epicId);
111
+ if (scoped) {
112
+ ctx.logger.info("Epic is within Project Scope");
113
+ } else {
114
+ ctx.logger.warn(
115
+ "Chosen epic is not within the Project Scope. The issue will be created without an associated epic."
116
+ );
117
+ }
118
+ return scoped;
119
+ }
120
+ return false;
114
121
  }
115
- }
122
+ });
116
123
  const mappedUpdatedAt = util.convertDate(
117
124
  String(updatedAt),
118
125
  (/* @__PURE__ */ new Date()).toISOString()
@@ -134,18 +141,32 @@ const editGitlabIssueAction = (options) => {
134
141
  updatedAt: mappedUpdatedAt,
135
142
  weight
136
143
  };
137
- const response = await api.Issues.edit(
138
- projectId,
139
- issueIid,
140
- editIssueOptions
141
- );
142
- ctx.output("issueId", response.id);
143
- ctx.output("projectId", response.project_id);
144
- ctx.output("issueUrl", response.web_url);
145
- ctx.output("issueIid", response.iid);
146
- ctx.output("title", response.title);
147
- ctx.output("state", response.state);
148
- ctx.output("updatedAt", response.updated_at);
144
+ const editedIssue = await ctx.checkpoint({
145
+ key: `issue.edit.${projectId}.${issueIid}`,
146
+ fn: async () => {
147
+ const response = await api.Issues.edit(
148
+ projectId,
149
+ issueIid,
150
+ editIssueOptions
151
+ );
152
+ return {
153
+ issueId: response.id,
154
+ issueUrl: response.web_url,
155
+ projectId: response.project_id,
156
+ issueIid: response.iid,
157
+ title: response.title,
158
+ state: response.state,
159
+ updatedAt: response.updated_at
160
+ };
161
+ }
162
+ });
163
+ ctx.output("issueId", editedIssue.issueId);
164
+ ctx.output("projectId", editedIssue.projectId);
165
+ ctx.output("issueUrl", editedIssue.issueUrl);
166
+ ctx.output("issueIid", editedIssue.issueIid);
167
+ ctx.output("title", editedIssue.title);
168
+ ctx.output("state", editedIssue.state);
169
+ ctx.output("updatedAt", editedIssue.updatedAt);
149
170
  } catch (error) {
150
171
  if (error instanceof zod.z.ZodError) {
151
172
  throw new errors.InputError(`Validation error: ${error.message}`, {
@@ -1 +1 @@
1
- {"version":3,"file":"gitlabIssueEdit.cjs.js","sources":["../../src/actions/gitlabIssueEdit.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport commonGitlabConfig, {\n IssueType,\n IssueStateEvent,\n} from '../commonGitlabConfig';\nimport { examples } from './gitlabIssueEdit.examples';\nimport { z } from 'zod';\nimport { checkEpicScope, convertDate, getClient, parseRepoUrl } from '../util';\nimport { IssueSchema, EditIssueOptions } from '@gitbeaker/rest';\nimport { getErrorMessage } from './helpers';\n\nconst editIssueInputProperties = z.object({\n projectId: z\n .number()\n .describe(\n 'The global ID or URL-encoded path of the project owned by the authenticated user.',\n ),\n issueIid: z.number().describe(\"The internal ID of a project's issue\"),\n addLabels: z\n .string({\n description:\n 'Comma-separated label names to add to an issue. If a label does not already exist, this creates a new project label and assigns it to the issue.',\n })\n .optional(),\n assignees: z\n .array(z.number(), {\n description: 'IDs of the users to assign the issue to.',\n })\n .optional(),\n confidential: z\n .boolean({ description: 'Updates an issue to be confidential.' })\n .optional(),\n description: z\n .string()\n .describe('The description of an issue. Limited to 1,048,576 characters.')\n .max(1048576)\n .optional(),\n discussionLocked: z\n .boolean({\n description:\n 'Flag indicating if the issue’s discussion is locked. If the discussion is locked only project members can add or edit comments.',\n })\n .optional(),\n dueDate: z\n .string()\n .describe(\n 'The due date. Date time string in the format YYYY-MM-DD, for example 2016-03-11.',\n )\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Invalid date format. Use YYYY-MM-DD')\n .optional(),\n epicId: z\n .number({\n description:\n 'ID of the epic to add the issue to. Valid values are greater than or equal to 0.',\n })\n .min(0, 'Valid values should be equal or greater than zero')\n .optional(),\n issueType: z\n .nativeEnum(IssueType, {\n description:\n 'Updates the type of issue. One of issue, incident, test_case or task.',\n })\n .optional(),\n labels: z\n .string({\n description:\n 'Comma-separated label names for an issue. Set to an empty string to unassign all labels. If a label does not already exist, this creates a new project label and assigns it to the issue.',\n })\n .optional(),\n milestoneId: z\n .number({\n description:\n 'The global ID of a milestone to assign the issue to. Set to 0 or provide an empty value to unassign a milestone',\n })\n .optional(),\n removeLabels: z\n .string({\n description: 'Comma-separated label names to remove from an issue.',\n })\n .optional(),\n stateEvent: z\n .nativeEnum(IssueStateEvent, {\n description:\n 'The state event of an issue. To close the issue, use close, and to reopen it, use reopen.',\n })\n .optional(),\n title: z.string().describe('The title of an issue.').optional(),\n updatedAt: z\n .string()\n .describe(\n 'When the issue was updated. Date time string, ISO 8601 formatted',\n )\n .regex(\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$/,\n 'Invalid date format. Use YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ',\n )\n .optional(),\n weight: z\n .number({ description: 'The issue weight' })\n .min(0, 'Valid values should be equal or greater than zero')\n .max(10, 'Valid values should be equal or less than 10')\n .optional(),\n});\n\nconst editIssueOutputProperties = z.object({\n issueUrl: z.string({ description: 'Issue WebUrl' }),\n projectId: z.number({\n description: 'The project id the issue belongs to WebUrl',\n }),\n issueId: z.number({ description: 'The issues Id' }),\n issueIid: z.number({\n description: \"The issues internal ID of a project's issue\",\n }),\n state: z.string({ description: 'The state event of an issue' }),\n title: z.string({ description: 'The title of an issue.' }),\n updatedAt: z.string({ description: 'The last updated time of the issue.' }),\n});\n\n/**\n * Creates a `gitlab:issue:edit` Scaffolder action.\n *\n * @param options - Templating configuration.\n * @public\n */\nexport const editGitlabIssueAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n return createTemplateAction({\n id: 'gitlab:issue:edit',\n description: 'Edit a Gitlab issue.',\n examples,\n schema: {\n input: commonGitlabConfig.merge(editIssueInputProperties),\n output: editIssueOutputProperties,\n },\n async handler(ctx) {\n try {\n const {\n repoUrl,\n projectId,\n title,\n addLabels,\n removeLabels,\n issueIid,\n description,\n confidential = false,\n assignees = [],\n updatedAt = '',\n dueDate,\n discussionLocked = false,\n epicId,\n labels,\n issueType,\n milestoneId,\n stateEvent,\n weight,\n token,\n } = commonGitlabConfig.merge(editIssueInputProperties).parse(ctx.input);\n\n const { host } = parseRepoUrl(repoUrl, integrations);\n const api = getClient({ host, integrations, token });\n\n let isEpicScoped = false;\n\n if (epicId) {\n isEpicScoped = await checkEpicScope(api, projectId, epicId);\n\n if (isEpicScoped) {\n ctx.logger.info('Epic is within Project Scope');\n } else {\n ctx.logger.warn(\n 'Chosen epic is not within the Project Scope. The issue will be created without an associated epic.',\n );\n }\n }\n\n const mappedUpdatedAt = convertDate(\n String(updatedAt),\n new Date().toISOString(),\n );\n\n const editIssueOptions: EditIssueOptions = {\n addLabels,\n assigneeIds: assignees,\n confidential,\n description,\n discussionLocked,\n dueDate,\n epicId: isEpicScoped ? epicId : undefined,\n issueType,\n labels,\n milestoneId,\n removeLabels,\n stateEvent,\n title,\n updatedAt: mappedUpdatedAt,\n weight,\n };\n\n const response = (await api.Issues.edit(\n projectId,\n issueIid,\n editIssueOptions,\n )) as IssueSchema;\n\n ctx.output('issueId', response.id);\n ctx.output('projectId', response.project_id);\n ctx.output('issueUrl', response.web_url);\n ctx.output('issueIid', response.iid);\n ctx.output('title', response.title);\n ctx.output('state', response.state);\n ctx.output('updatedAt', response.updated_at);\n } catch (error: any) {\n if (error instanceof z.ZodError) {\n // Handling Zod validation errors\n throw new InputError(`Validation error: ${error.message}`, {\n validationErrors: error.errors,\n });\n }\n // Handling other errors\n throw new InputError(\n `Failed to edit/modify GitLab issue: ${getErrorMessage(error)}`,\n );\n }\n },\n });\n};\n"],"names":["z","IssueType","IssueStateEvent","createTemplateAction","examples","commonGitlabConfig","parseRepoUrl","getClient","checkEpicScope","convertDate","InputError","getErrorMessage"],"mappings":"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"}
1
+ {"version":3,"file":"gitlabIssueEdit.cjs.js","sources":["../../src/actions/gitlabIssueEdit.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport commonGitlabConfig, {\n IssueStateEvent,\n IssueType,\n} from '../commonGitlabConfig';\nimport { examples } from './gitlabIssueEdit.examples';\nimport { z } from 'zod';\nimport { checkEpicScope, convertDate, getClient, parseRepoUrl } from '../util';\nimport { EditIssueOptions, IssueSchema } from '@gitbeaker/rest';\nimport { getErrorMessage } from './helpers';\n\nconst editIssueInputProperties = z.object({\n projectId: z\n .number()\n .describe(\n 'The global ID or URL-encoded path of the project owned by the authenticated user.',\n ),\n issueIid: z.number().describe(\"The internal ID of a project's issue\"),\n addLabels: z\n .string({\n description:\n 'Comma-separated label names to add to an issue. If a label does not already exist, this creates a new project label and assigns it to the issue.',\n })\n .optional(),\n assignees: z\n .array(z.number(), {\n description: 'IDs of the users to assign the issue to.',\n })\n .optional(),\n confidential: z\n .boolean({ description: 'Updates an issue to be confidential.' })\n .optional(),\n description: z\n .string()\n .describe('The description of an issue. Limited to 1,048,576 characters.')\n .max(1048576)\n .optional(),\n discussionLocked: z\n .boolean({\n description:\n 'Flag indicating if the issue’s discussion is locked. If the discussion is locked only project members can add or edit comments.',\n })\n .optional(),\n dueDate: z\n .string()\n .describe(\n 'The due date. Date time string in the format YYYY-MM-DD, for example 2016-03-11.',\n )\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Invalid date format. Use YYYY-MM-DD')\n .optional(),\n epicId: z\n .number({\n description:\n 'ID of the epic to add the issue to. Valid values are greater than or equal to 0.',\n })\n .min(0, 'Valid values should be equal or greater than zero')\n .optional(),\n issueType: z\n .nativeEnum(IssueType, {\n description:\n 'Updates the type of issue. One of issue, incident, test_case or task.',\n })\n .optional(),\n labels: z\n .string({\n description:\n 'Comma-separated label names for an issue. Set to an empty string to unassign all labels. If a label does not already exist, this creates a new project label and assigns it to the issue.',\n })\n .optional(),\n milestoneId: z\n .number({\n description:\n 'The global ID of a milestone to assign the issue to. Set to 0 or provide an empty value to unassign a milestone',\n })\n .optional(),\n removeLabels: z\n .string({\n description: 'Comma-separated label names to remove from an issue.',\n })\n .optional(),\n stateEvent: z\n .nativeEnum(IssueStateEvent, {\n description:\n 'The state event of an issue. To close the issue, use close, and to reopen it, use reopen.',\n })\n .optional(),\n title: z.string().describe('The title of an issue.').optional(),\n updatedAt: z\n .string()\n .describe(\n 'When the issue was updated. Date time string, ISO 8601 formatted',\n )\n .regex(\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$/,\n 'Invalid date format. Use YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ',\n )\n .optional(),\n weight: z\n .number({ description: 'The issue weight' })\n .min(0, 'Valid values should be equal or greater than zero')\n .max(10, 'Valid values should be equal or less than 10')\n .optional(),\n});\n\nconst editIssueOutputProperties = z.object({\n issueUrl: z.string({ description: 'Issue WebUrl' }),\n projectId: z.number({\n description: 'The project id the issue belongs to WebUrl',\n }),\n issueId: z.number({ description: 'The issues Id' }),\n issueIid: z.number({\n description: \"The issues internal ID of a project's issue\",\n }),\n state: z.string({ description: 'The state event of an issue' }),\n title: z.string({ description: 'The title of an issue.' }),\n updatedAt: z.string({ description: 'The last updated time of the issue.' }),\n});\n\n/**\n * Creates a `gitlab:issue:edit` Scaffolder action.\n *\n * @param options - Templating configuration.\n * @public\n */\nexport const editGitlabIssueAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n return createTemplateAction({\n id: 'gitlab:issue:edit',\n description: 'Edit a Gitlab issue.',\n examples,\n schema: {\n input: commonGitlabConfig.merge(editIssueInputProperties),\n output: editIssueOutputProperties,\n },\n async handler(ctx) {\n try {\n const {\n repoUrl,\n projectId,\n title,\n addLabels,\n removeLabels,\n issueIid,\n description,\n confidential = false,\n assignees = [],\n updatedAt = '',\n dueDate,\n discussionLocked = false,\n epicId,\n labels,\n issueType,\n milestoneId,\n stateEvent,\n weight,\n token,\n } = commonGitlabConfig.merge(editIssueInputProperties).parse(ctx.input);\n\n const { host } = parseRepoUrl(repoUrl, integrations);\n const api = getClient({ host, integrations, token });\n\n let isEpicScoped = false;\n\n isEpicScoped = await ctx.checkpoint({\n key: `issue.edit.is.scoped.${projectId}.${epicId}`,\n fn: async () => {\n if (epicId) {\n const scoped = await checkEpicScope(api, projectId, epicId);\n\n if (scoped) {\n ctx.logger.info('Epic is within Project Scope');\n } else {\n ctx.logger.warn(\n 'Chosen epic is not within the Project Scope. The issue will be created without an associated epic.',\n );\n }\n return scoped;\n }\n return false;\n },\n });\n\n const mappedUpdatedAt = convertDate(\n String(updatedAt),\n new Date().toISOString(),\n );\n\n const editIssueOptions: EditIssueOptions = {\n addLabels,\n assigneeIds: assignees,\n confidential,\n description,\n discussionLocked,\n dueDate,\n epicId: isEpicScoped ? epicId : undefined,\n issueType,\n labels,\n milestoneId,\n removeLabels,\n stateEvent,\n title,\n updatedAt: mappedUpdatedAt,\n weight,\n };\n\n const editedIssue = await ctx.checkpoint({\n key: `issue.edit.${projectId}.${issueIid}`,\n fn: async () => {\n const response = (await api.Issues.edit(\n projectId,\n issueIid,\n editIssueOptions,\n )) as IssueSchema;\n\n return {\n issueId: response.id,\n issueUrl: response.web_url,\n projectId: response.project_id,\n issueIid: response.iid,\n title: response.title,\n state: response.state,\n updatedAt: response.updated_at,\n };\n },\n });\n\n ctx.output('issueId', editedIssue.issueId);\n ctx.output('projectId', editedIssue.projectId);\n ctx.output('issueUrl', editedIssue.issueUrl);\n ctx.output('issueIid', editedIssue.issueIid);\n ctx.output('title', editedIssue.title);\n ctx.output('state', editedIssue.state);\n ctx.output('updatedAt', editedIssue.updatedAt);\n } catch (error: any) {\n if (error instanceof z.ZodError) {\n // Handling Zod validation errors\n throw new InputError(`Validation error: ${error.message}`, {\n validationErrors: error.errors,\n });\n }\n // Handling other errors\n throw new InputError(\n `Failed to edit/modify GitLab issue: ${getErrorMessage(error)}`,\n );\n }\n },\n });\n};\n"],"names":["z","IssueType","IssueStateEvent","createTemplateAction","examples","commonGitlabConfig","parseRepoUrl","getClient","checkEpicScope","convertDate","InputError","getErrorMessage"],"mappings":"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"}
@@ -30,33 +30,49 @@ const createTriggerGitlabPipelineAction = (options) => {
30
30
  output: pipelineOutputProperties
31
31
  },
32
32
  async handler(ctx) {
33
- let pipelineTokenResponse = null;
33
+ let pipelineTriggerToken = void 0;
34
+ let pipelineTriggerId = void 0;
34
35
  const { repoUrl, projectId, tokenDescription, token, branch, variables } = commonGitlabConfig.default.merge(pipelineInputProperties).parse(ctx.input);
35
36
  const { host } = util.parseRepoUrl(repoUrl, integrations);
36
37
  const api = util.getClient({ host, integrations, token });
37
38
  try {
38
- pipelineTokenResponse = await api.PipelineTriggerTokens.create(
39
- projectId,
40
- tokenDescription
41
- );
42
- if (!pipelineTokenResponse.token) {
43
- ctx.logger.error("Failed to create pipeline token.");
39
+ ({ pipelineTriggerToken, pipelineTriggerId } = await ctx.checkpoint({
40
+ key: `create.pipeline.token.${projectId}`,
41
+ fn: async () => {
42
+ const res = await api.PipelineTriggerTokens.create(
43
+ projectId,
44
+ tokenDescription
45
+ );
46
+ return {
47
+ pipelineTriggerToken: res.token,
48
+ pipelineTriggerId: res.id
49
+ };
50
+ }
51
+ }));
52
+ if (!pipelineTriggerToken) {
53
+ ctx.logger.error(
54
+ `Failed to create pipeline token for project ${projectId}.`
55
+ );
44
56
  return;
45
57
  }
46
58
  ctx.logger.info(
47
- `Pipeline token id ${pipelineTokenResponse.id} created.`
59
+ `Pipeline token id ${pipelineTriggerId} created for project ${projectId}.`
48
60
  );
49
61
  const pipelineTriggerResponse = await api.PipelineTriggerTokens.trigger(
50
62
  projectId,
51
63
  branch,
52
- pipelineTokenResponse.token,
64
+ pipelineTriggerToken,
53
65
  { variables }
54
66
  );
55
67
  if (!pipelineTriggerResponse.id) {
56
- ctx.logger.error("Failed to trigger pipeline.");
68
+ ctx.logger.error(
69
+ `Failed to trigger pipeline for project ${projectId}.`
70
+ );
57
71
  return;
58
72
  }
59
- ctx.logger.info(`Pipeline id ${pipelineTriggerResponse.id} triggered.`);
73
+ ctx.logger.info(
74
+ `Pipeline id ${pipelineTriggerResponse.id} for project ${projectId} triggered.`
75
+ );
60
76
  ctx.output("pipelineUrl", pipelineTriggerResponse.web_url);
61
77
  } catch (error) {
62
78
  if (error instanceof zod.z.ZodError) {
@@ -68,18 +84,25 @@ const createTriggerGitlabPipelineAction = (options) => {
68
84
  `Failed to trigger Pipeline: ${helpers.getErrorMessage(error)}`
69
85
  );
70
86
  } finally {
71
- if (pipelineTokenResponse && pipelineTokenResponse.id) {
87
+ if (pipelineTriggerId) {
72
88
  try {
73
- await api.PipelineTriggerTokens.remove(
74
- projectId,
75
- pipelineTokenResponse.id
76
- );
89
+ await ctx.checkpoint({
90
+ key: `create.delete.token.${projectId}`,
91
+ fn: async () => {
92
+ if (pipelineTriggerId) {
93
+ await api.PipelineTriggerTokens.remove(
94
+ projectId,
95
+ pipelineTriggerId
96
+ );
97
+ }
98
+ }
99
+ });
77
100
  ctx.logger.info(
78
- `Deleted pipeline token ${pipelineTokenResponse.id}.`
101
+ `Deleted pipeline with token id ${pipelineTriggerId}.`
79
102
  );
80
103
  } catch (error) {
81
104
  ctx.logger.error(
82
- `Failed to delete pipeline token id ${pipelineTokenResponse.id}.`
105
+ `Failed to delete pipeline with token id ${pipelineTriggerId}.`
83
106
  );
84
107
  }
85
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gitlabPipelineTrigger.cjs.js","sources":["../../src/actions/gitlabPipelineTrigger.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport {\n ExpandedPipelineSchema,\n PipelineTriggerTokenSchema,\n} from '@gitbeaker/rest';\nimport { z } from 'zod';\nimport commonGitlabConfig from '../commonGitlabConfig';\nimport { getClient, parseRepoUrl } from '../util';\nimport { examples } from './gitlabPipelineTrigger.examples';\nimport { getErrorMessage } from './helpers';\n\nconst pipelineInputProperties = z.object({\n projectId: z.number().describe('Project Id'),\n tokenDescription: z.string().describe('Pipeline token description'),\n branch: z.string().describe('Project branch'),\n variables: z\n .record(z.string(), z.string())\n .optional()\n .describe(\n 'A object/record of key-valued strings containing the pipeline variables.',\n ),\n});\n\nconst pipelineOutputProperties = z.object({\n pipelineUrl: z.string({ description: 'Pipeline Url' }),\n});\n\n/**\n * Creates a `gitlab:pipeline:trigger` Scaffolder action.\n *\n * @param options - Templating configuration.\n * @public\n */\nexport const createTriggerGitlabPipelineAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n return createTemplateAction({\n id: 'gitlab:pipeline:trigger',\n description: 'Triggers a GitLab Pipeline.',\n examples,\n schema: {\n input: commonGitlabConfig.merge(pipelineInputProperties),\n output: pipelineOutputProperties,\n },\n async handler(ctx) {\n let pipelineTokenResponse: PipelineTriggerTokenSchema | null = null;\n\n const { repoUrl, projectId, tokenDescription, token, branch, variables } =\n commonGitlabConfig.merge(pipelineInputProperties).parse(ctx.input);\n\n const { host } = parseRepoUrl(repoUrl, integrations);\n const api = getClient({ host, integrations, token });\n\n try {\n // Create a pipeline token\n pipelineTokenResponse = (await api.PipelineTriggerTokens.create(\n projectId,\n tokenDescription,\n )) as PipelineTriggerTokenSchema;\n\n if (!pipelineTokenResponse.token) {\n ctx.logger.error('Failed to create pipeline token.');\n return;\n }\n ctx.logger.info(\n `Pipeline token id ${pipelineTokenResponse.id} created.`,\n );\n\n // Use the pipeline token to trigger the pipeline in the project\n const pipelineTriggerResponse =\n (await api.PipelineTriggerTokens.trigger(\n projectId,\n branch,\n pipelineTokenResponse.token,\n { variables },\n )) as ExpandedPipelineSchema;\n\n if (!pipelineTriggerResponse.id) {\n ctx.logger.error('Failed to trigger pipeline.');\n return;\n }\n\n ctx.logger.info(`Pipeline id ${pipelineTriggerResponse.id} triggered.`);\n\n ctx.output('pipelineUrl', pipelineTriggerResponse.web_url);\n } catch (error: any) {\n if (error instanceof z.ZodError) {\n // Handling Zod validation errors\n throw new InputError(`Validation error: ${error.message}`, {\n validationErrors: error.errors,\n });\n }\n // Handling other errors\n throw new InputError(\n `Failed to trigger Pipeline: ${getErrorMessage(error)}`,\n );\n } finally {\n // Delete the pipeline token if it was created\n if (pipelineTokenResponse && pipelineTokenResponse.id) {\n try {\n await api.PipelineTriggerTokens.remove(\n projectId,\n pipelineTokenResponse.id,\n );\n ctx.logger.info(\n `Deleted pipeline token ${pipelineTokenResponse.id}.`,\n );\n } catch (error: any) {\n ctx.logger.error(\n `Failed to delete pipeline token id ${pipelineTokenResponse.id}.`,\n );\n }\n }\n }\n },\n });\n};\n"],"names":["z","createTemplateAction","examples","commonGitlabConfig","parseRepoUrl","getClient","InputError","getErrorMessage"],"mappings":"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"}
1
+ {"version":3,"file":"gitlabPipelineTrigger.cjs.js","sources":["../../src/actions/gitlabPipelineTrigger.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport {\n ExpandedPipelineSchema,\n PipelineTriggerTokenSchema,\n} from '@gitbeaker/rest';\nimport { z } from 'zod';\nimport commonGitlabConfig from '../commonGitlabConfig';\nimport { getClient, parseRepoUrl } from '../util';\nimport { examples } from './gitlabPipelineTrigger.examples';\nimport { getErrorMessage } from './helpers';\n\nconst pipelineInputProperties = z.object({\n projectId: z.number().describe('Project Id'),\n tokenDescription: z.string().describe('Pipeline token description'),\n branch: z.string().describe('Project branch'),\n variables: z\n .record(z.string(), z.string())\n .optional()\n .describe(\n 'A object/record of key-valued strings containing the pipeline variables.',\n ),\n});\n\nconst pipelineOutputProperties = z.object({\n pipelineUrl: z.string({ description: 'Pipeline Url' }),\n});\n\n/**\n * Creates a `gitlab:pipeline:trigger` Scaffolder action.\n *\n * @param options - Templating configuration.\n * @public\n */\nexport const createTriggerGitlabPipelineAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n return createTemplateAction({\n id: 'gitlab:pipeline:trigger',\n description: 'Triggers a GitLab Pipeline.',\n examples,\n schema: {\n input: commonGitlabConfig.merge(pipelineInputProperties),\n output: pipelineOutputProperties,\n },\n async handler(ctx) {\n let pipelineTriggerToken: string | undefined = undefined;\n let pipelineTriggerId: number | undefined = undefined;\n\n const { repoUrl, projectId, tokenDescription, token, branch, variables } =\n commonGitlabConfig.merge(pipelineInputProperties).parse(ctx.input);\n\n const { host } = parseRepoUrl(repoUrl, integrations);\n const api = getClient({ host, integrations, token });\n\n try {\n ({ pipelineTriggerToken, pipelineTriggerId } = await ctx.checkpoint({\n key: `create.pipeline.token.${projectId}`,\n fn: async () => {\n const res = (await api.PipelineTriggerTokens.create(\n projectId,\n tokenDescription,\n )) as PipelineTriggerTokenSchema;\n return {\n pipelineTriggerToken: res.token,\n pipelineTriggerId: res.id,\n };\n },\n }));\n\n if (!pipelineTriggerToken) {\n ctx.logger.error(\n `Failed to create pipeline token for project ${projectId}.`,\n );\n return;\n }\n ctx.logger.info(\n `Pipeline token id ${pipelineTriggerId} created for project ${projectId}.`,\n );\n\n // Use the pipeline token to trigger the pipeline in the project\n const pipelineTriggerResponse =\n (await api.PipelineTriggerTokens.trigger(\n projectId,\n branch,\n pipelineTriggerToken,\n { variables },\n )) as ExpandedPipelineSchema;\n\n if (!pipelineTriggerResponse.id) {\n ctx.logger.error(\n `Failed to trigger pipeline for project ${projectId}.`,\n );\n return;\n }\n\n ctx.logger.info(\n `Pipeline id ${pipelineTriggerResponse.id} for project ${projectId} triggered.`,\n );\n\n ctx.output('pipelineUrl', pipelineTriggerResponse.web_url);\n } catch (error: any) {\n if (error instanceof z.ZodError) {\n // Handling Zod validation errors\n throw new InputError(`Validation error: ${error.message}`, {\n validationErrors: error.errors,\n });\n }\n // Handling other errors\n throw new InputError(\n `Failed to trigger Pipeline: ${getErrorMessage(error)}`,\n );\n } finally {\n // Delete the pipeline token if it was created\n if (pipelineTriggerId) {\n try {\n await ctx.checkpoint({\n key: `create.delete.token.${projectId}`,\n fn: async () => {\n if (pipelineTriggerId) {\n // to make the current version of TypeScript happy\n await api.PipelineTriggerTokens.remove(\n projectId,\n pipelineTriggerId,\n );\n }\n },\n });\n ctx.logger.info(\n `Deleted pipeline with token id ${pipelineTriggerId}.`,\n );\n } catch (error: any) {\n ctx.logger.error(\n `Failed to delete pipeline with token id ${pipelineTriggerId}.`,\n );\n }\n }\n }\n },\n });\n};\n"],"names":["z","createTemplateAction","examples","commonGitlabConfig","parseRepoUrl","getClient","InputError","getErrorMessage"],"mappings":"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"}
@@ -64,19 +64,25 @@ const createGitlabProjectAccessTokenAction = (options) => {
64
64
  oauthToken: token
65
65
  });
66
66
  }
67
- const response = await api.ProjectAccessTokens.create(
68
- projectId,
69
- name,
70
- scopes,
71
- expiresAt || luxon.DateTime.now().plus({ days: 365 }).toISODate(),
72
- {
73
- accessLevel
67
+ const projectAccessToken = await ctx.checkpoint({
68
+ key: `project.access.token.${projectId}.${name}`,
69
+ fn: async () => {
70
+ const response = await api.ProjectAccessTokens.create(
71
+ projectId,
72
+ name,
73
+ scopes,
74
+ expiresAt || luxon.DateTime.now().plus({ days: 365 }).toISODate(),
75
+ {
76
+ accessLevel
77
+ }
78
+ );
79
+ return response.token;
74
80
  }
75
- );
76
- if (!response.token) {
81
+ });
82
+ if (!projectAccessToken) {
77
83
  throw new Error("Could not create project access token");
78
84
  }
79
- ctx.output("access_token", response.token);
85
+ ctx.output("access_token", projectAccessToken);
80
86
  }
81
87
  });
82
88
  };
@@ -1 +1 @@
1
- {"version":3,"file":"gitlabProjectAccessTokenCreate.cjs.js","sources":["../../src/actions/gitlabProjectAccessTokenCreate.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { AccessTokenScopes, Gitlab } from '@gitbeaker/rest';\nimport { DateTime } from 'luxon';\nimport { z } from 'zod';\nimport { getToken } from '../util';\nimport { examples } from './gitlabProjectAccessTokenCreate.examples';\n\n/**\n * Creates a `gitlab:projectAccessToken:create` Scaffolder action.\n *\n * @param options - Templating configuration.\n * @public\n */\n\nexport const createGitlabProjectAccessTokenAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n return createTemplateAction({\n id: 'gitlab:projectAccessToken:create',\n examples,\n schema: {\n input: z.object({\n projectId: z.union([z.number(), z.string()], {\n description: 'Project ID/Name(slug) of the Gitlab Project',\n }),\n token: z\n .string({\n description: 'The token to use for authorization to GitLab',\n })\n .optional(),\n name: z.string({ description: 'Name of Access Key' }).optional(),\n repoUrl: z.string({ description: 'URL to gitlab instance' }),\n accessLevel: z\n .number({\n description:\n 'Access Level of the Token, 10 (Guest), 20 (Reporter), 30 (Developer), 40 (Maintainer), and 50 (Owner)',\n })\n .optional(),\n scopes: z\n .string({\n description: 'Scopes for a project access token',\n })\n .array()\n .optional(),\n expiresAt: z\n .string({\n description:\n 'Expiration date of the access token in ISO format (YYYY-MM-DD). If Empty, it will set to the maximum of 365 days.',\n })\n .optional(),\n }),\n output: z.object({\n access_token: z.string({ description: 'Access Token' }),\n }),\n },\n async handler(ctx) {\n ctx.logger.info(`Creating Token for Project \"${ctx.input.projectId}\"`);\n const {\n projectId,\n name = 'tokenname',\n accessLevel = 40,\n scopes = ['read_repository'],\n expiresAt,\n } = ctx.input;\n\n const { token, integrationConfig } = getToken(ctx.input, integrations);\n\n if (!integrationConfig.config.token && token) {\n throw new InputError(\n `No token available for host ${integrationConfig.config.baseUrl}`,\n );\n }\n\n let api;\n\n if (!ctx.input.token) {\n api = new Gitlab({\n host: integrationConfig.config.baseUrl,\n token: token,\n });\n } else {\n api = new Gitlab({\n host: integrationConfig.config.baseUrl,\n oauthToken: token,\n });\n }\n\n const response = await api.ProjectAccessTokens.create(\n projectId,\n name,\n scopes as AccessTokenScopes[],\n expiresAt || DateTime.now().plus({ days: 365 }).toISODate()!,\n {\n accessLevel,\n },\n );\n\n if (!response.token) {\n throw new Error('Could not create project access token');\n }\n\n ctx.output('access_token', response.token);\n },\n });\n};\n"],"names":["createTemplateAction","examples","z","getToken","InputError","Gitlab","DateTime"],"mappings":"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"}
1
+ {"version":3,"file":"gitlabProjectAccessTokenCreate.cjs.js","sources":["../../src/actions/gitlabProjectAccessTokenCreate.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { AccessTokenScopes, Gitlab } from '@gitbeaker/rest';\nimport { DateTime } from 'luxon';\nimport { z } from 'zod';\nimport { getToken } from '../util';\nimport { examples } from './gitlabProjectAccessTokenCreate.examples';\n\n/**\n * Creates a `gitlab:projectAccessToken:create` Scaffolder action.\n *\n * @param options - Templating configuration.\n * @public\n */\n\nexport const createGitlabProjectAccessTokenAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n return createTemplateAction({\n id: 'gitlab:projectAccessToken:create',\n examples,\n schema: {\n input: z.object({\n projectId: z.union([z.number(), z.string()], {\n description: 'Project ID/Name(slug) of the Gitlab Project',\n }),\n token: z\n .string({\n description: 'The token to use for authorization to GitLab',\n })\n .optional(),\n name: z.string({ description: 'Name of Access Key' }).optional(),\n repoUrl: z.string({ description: 'URL to gitlab instance' }),\n accessLevel: z\n .number({\n description:\n 'Access Level of the Token, 10 (Guest), 20 (Reporter), 30 (Developer), 40 (Maintainer), and 50 (Owner)',\n })\n .optional(),\n scopes: z\n .string({\n description: 'Scopes for a project access token',\n })\n .array()\n .optional(),\n expiresAt: z\n .string({\n description:\n 'Expiration date of the access token in ISO format (YYYY-MM-DD). If Empty, it will set to the maximum of 365 days.',\n })\n .optional(),\n }),\n output: z.object({\n access_token: z.string({ description: 'Access Token' }),\n }),\n },\n async handler(ctx) {\n ctx.logger.info(`Creating Token for Project \"${ctx.input.projectId}\"`);\n const {\n projectId,\n name = 'tokenname',\n accessLevel = 40,\n scopes = ['read_repository'],\n expiresAt,\n } = ctx.input;\n\n const { token, integrationConfig } = getToken(ctx.input, integrations);\n\n if (!integrationConfig.config.token && token) {\n throw new InputError(\n `No token available for host ${integrationConfig.config.baseUrl}`,\n );\n }\n\n let api;\n\n if (!ctx.input.token) {\n api = new Gitlab({\n host: integrationConfig.config.baseUrl,\n token: token,\n });\n } else {\n api = new Gitlab({\n host: integrationConfig.config.baseUrl,\n oauthToken: token,\n });\n }\n\n const projectAccessToken = await ctx.checkpoint({\n key: `project.access.token.${projectId}.${name}`,\n fn: async () => {\n const response = await api.ProjectAccessTokens.create(\n projectId,\n name,\n scopes as AccessTokenScopes[],\n expiresAt || DateTime.now().plus({ days: 365 }).toISODate()!,\n {\n accessLevel,\n },\n );\n return response.token;\n },\n });\n\n if (!projectAccessToken) {\n throw new Error('Could not create project access token');\n }\n\n ctx.output('access_token', projectAccessToken);\n },\n });\n};\n"],"names":["createTemplateAction","examples","z","getToken","InputError","Gitlab","DateTime"],"mappings":"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"}
@@ -42,19 +42,28 @@ const createGitlabProjectDeployTokenAction = (options) => {
42
42
  host: integrationConfig.config.baseUrl,
43
43
  token
44
44
  });
45
- const deployToken = await api.DeployTokens.create(
46
- name,
47
- scopes,
48
- {
49
- projectId,
50
- username
45
+ const { deployToken, deployUsername } = await ctx.checkpoint({
46
+ key: `create.deploy.token.${projectId}.${name}`,
47
+ fn: async () => {
48
+ const res = await api.DeployTokens.create(
49
+ name,
50
+ scopes,
51
+ {
52
+ projectId,
53
+ username
54
+ }
55
+ );
56
+ if (!res.hasOwnProperty("token")) {
57
+ throw new errors.InputError(`No deploy_token given from gitlab instance`);
58
+ }
59
+ return {
60
+ deployToken: res.token,
61
+ deployUsername: res.username
62
+ };
51
63
  }
52
- );
53
- if (!deployToken.hasOwnProperty("token")) {
54
- throw new errors.InputError(`No deploy_token given from gitlab instance`);
55
- }
56
- ctx.output("deploy_token", deployToken.token);
57
- ctx.output("user", deployToken.username);
64
+ });
65
+ ctx.output("deploy_token", deployToken);
66
+ ctx.output("user", deployUsername);
58
67
  }
59
68
  });
60
69
  };
@@ -1 +1 @@
1
- {"version":3,"file":"gitlabProjectDeployTokenCreate.cjs.js","sources":["../../src/actions/gitlabProjectDeployTokenCreate.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { DeployTokenScope, Gitlab } from '@gitbeaker/rest';\nimport { z } from 'zod';\nimport commonGitlabConfig from '../commonGitlabConfig';\nimport { getToken } from '../util';\nimport { examples } from './gitlabProjectDeployTokenCreate.examples';\n\n/**\n * Creates a `gitlab:projectDeployToken:create` Scaffolder action.\n *\n * @param options - Templating configuration.\n * @public\n */\nexport const createGitlabProjectDeployTokenAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n return createTemplateAction({\n id: 'gitlab:projectDeployToken:create',\n examples,\n schema: {\n input: commonGitlabConfig.merge(\n z.object({\n projectId: z.union([z.number(), z.string()], {\n description: 'Project ID',\n }),\n name: z.string({ description: 'Deploy Token Name' }),\n username: z\n .string({ description: 'Deploy Token Username' })\n .optional(),\n scopes: z.array(z.string(), { description: 'Scopes' }),\n }),\n ),\n output: z.object({\n deploy_token: z.string({ description: 'Deploy Token' }),\n user: z.string({ description: 'User' }),\n }),\n },\n async handler(ctx) {\n ctx.logger.info(`Creating Token for Project \"${ctx.input.projectId}\"`);\n const { projectId, name, username, scopes } = ctx.input;\n const { token, integrationConfig } = getToken(ctx.input, integrations);\n\n if (scopes.length === 0) {\n throw new InputError(\n `Could not create token for project \"${ctx.input.projectId}\": scopes cannot be empty.`,\n );\n }\n\n const api = new Gitlab({\n host: integrationConfig.config.baseUrl,\n token: token,\n });\n\n const deployToken = await api.DeployTokens.create(\n name,\n scopes as DeployTokenScope[],\n {\n projectId,\n username,\n },\n );\n\n if (!deployToken.hasOwnProperty('token')) {\n throw new InputError(`No deploy_token given from gitlab instance`);\n }\n\n ctx.output('deploy_token', deployToken.token as string);\n ctx.output('user', deployToken.username);\n },\n });\n};\n"],"names":["createTemplateAction","examples","commonGitlabConfig","z","getToken","InputError","Gitlab"],"mappings":";;;;;;;;;;AA+Ba,MAAA,oCAAA,GAAuC,CAAC,OAE/C,KAAA;AACJ,EAAM,MAAA,EAAE,cAAiB,GAAA,OAAA;AACzB,EAAA,OAAOA,yCAAqB,CAAA;AAAA,IAC1B,EAAI,EAAA,kCAAA;AAAA,cACJC,gDAAA;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,OAAOC,0BAAmB,CAAA,KAAA;AAAA,QACxBC,MAAE,MAAO,CAAA;AAAA,UACP,SAAA,EAAWA,KAAE,CAAA,KAAA,CAAM,CAACA,KAAA,CAAE,QAAU,EAAAA,KAAA,CAAE,MAAO,EAAC,CAAG,EAAA;AAAA,YAC3C,WAAa,EAAA;AAAA,WACd,CAAA;AAAA,UACD,MAAMA,KAAE,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,qBAAqB,CAAA;AAAA,UACnD,QAAA,EAAUA,MACP,MAAO,CAAA,EAAE,aAAa,uBAAwB,EAAC,EAC/C,QAAS,EAAA;AAAA,UACZ,MAAA,EAAQA,MAAE,KAAM,CAAAA,KAAA,CAAE,QAAU,EAAA,EAAE,WAAa,EAAA,QAAA,EAAU;AAAA,SACtD;AAAA,OACH;AAAA,MACA,MAAA,EAAQA,MAAE,MAAO,CAAA;AAAA,QACf,cAAcA,KAAE,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,gBAAgB,CAAA;AAAA,QACtD,MAAMA,KAAE,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,QAAQ;AAAA,OACvC;AAAA,KACH;AAAA,IACA,MAAM,QAAQ,GAAK,EAAA;AACjB,MAAA,GAAA,CAAI,OAAO,IAAK,CAAA,CAAA,4BAAA,EAA+B,GAAI,CAAA,KAAA,CAAM,SAAS,CAAG,CAAA,CAAA,CAAA;AACrE,MAAA,MAAM,EAAE,SAAW,EAAA,IAAA,EAAM,QAAU,EAAA,MAAA,KAAW,GAAI,CAAA,KAAA;AAClD,MAAA,MAAM,EAAE,KAAO,EAAA,iBAAA,KAAsBC,aAAS,CAAA,GAAA,CAAI,OAAO,YAAY,CAAA;AAErE,MAAI,IAAA,MAAA,CAAO,WAAW,CAAG,EAAA;AACvB,QAAA,MAAM,IAAIC,iBAAA;AAAA,UACR,CAAA,oCAAA,EAAuC,GAAI,CAAA,KAAA,CAAM,SAAS,CAAA,0BAAA;AAAA,SAC5D;AAAA;AAGF,MAAM,MAAA,GAAA,GAAM,IAAIC,WAAO,CAAA;AAAA,QACrB,IAAA,EAAM,kBAAkB,MAAO,CAAA,OAAA;AAAA,QAC/B;AAAA,OACD,CAAA;AAED,MAAM,MAAA,WAAA,GAAc,MAAM,GAAA,CAAI,YAAa,CAAA,MAAA;AAAA,QACzC,IAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,UACE,SAAA;AAAA,UACA;AAAA;AACF,OACF;AAEA,MAAA,IAAI,CAAC,WAAA,CAAY,cAAe,CAAA,OAAO,CAAG,EAAA;AACxC,QAAM,MAAA,IAAID,kBAAW,CAA4C,0CAAA,CAAA,CAAA;AAAA;AAGnE,MAAI,GAAA,CAAA,MAAA,CAAO,cAAgB,EAAA,WAAA,CAAY,KAAe,CAAA;AACtD,MAAI,GAAA,CAAA,MAAA,CAAO,MAAQ,EAAA,WAAA,CAAY,QAAQ,CAAA;AAAA;AACzC,GACD,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"gitlabProjectDeployTokenCreate.cjs.js","sources":["../../src/actions/gitlabProjectDeployTokenCreate.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { DeployTokenScope, Gitlab } from '@gitbeaker/rest';\nimport { z } from 'zod';\nimport commonGitlabConfig from '../commonGitlabConfig';\nimport { getToken } from '../util';\nimport { examples } from './gitlabProjectDeployTokenCreate.examples';\n\n/**\n * Creates a `gitlab:projectDeployToken:create` Scaffolder action.\n *\n * @param options - Templating configuration.\n * @public\n */\nexport const createGitlabProjectDeployTokenAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n return createTemplateAction({\n id: 'gitlab:projectDeployToken:create',\n examples,\n schema: {\n input: commonGitlabConfig.merge(\n z.object({\n projectId: z.union([z.number(), z.string()], {\n description: 'Project ID',\n }),\n name: z.string({ description: 'Deploy Token Name' }),\n username: z\n .string({ description: 'Deploy Token Username' })\n .optional(),\n scopes: z.array(z.string(), { description: 'Scopes' }),\n }),\n ),\n output: z.object({\n deploy_token: z.string({ description: 'Deploy Token' }),\n user: z.string({ description: 'User' }),\n }),\n },\n async handler(ctx) {\n ctx.logger.info(`Creating Token for Project \"${ctx.input.projectId}\"`);\n const { projectId, name, username, scopes } = ctx.input;\n const { token, integrationConfig } = getToken(ctx.input, integrations);\n\n if (scopes.length === 0) {\n throw new InputError(\n `Could not create token for project \"${ctx.input.projectId}\": scopes cannot be empty.`,\n );\n }\n\n const api = new Gitlab({\n host: integrationConfig.config.baseUrl,\n token: token,\n });\n\n const { deployToken, deployUsername } = await ctx.checkpoint({\n key: `create.deploy.token.${projectId}.${name}`,\n fn: async () => {\n const res = await api.DeployTokens.create(\n name,\n scopes as DeployTokenScope[],\n {\n projectId,\n username,\n },\n );\n\n if (!res.hasOwnProperty('token')) {\n throw new InputError(`No deploy_token given from gitlab instance`);\n }\n\n return {\n deployToken: res.token as string,\n deployUsername: res.username,\n };\n },\n });\n\n ctx.output('deploy_token', deployToken);\n ctx.output('user', deployUsername);\n },\n });\n};\n"],"names":["createTemplateAction","examples","commonGitlabConfig","z","getToken","InputError","Gitlab"],"mappings":";;;;;;;;;;AA+Ba,MAAA,oCAAA,GAAuC,CAAC,OAE/C,KAAA;AACJ,EAAM,MAAA,EAAE,cAAiB,GAAA,OAAA;AACzB,EAAA,OAAOA,yCAAqB,CAAA;AAAA,IAC1B,EAAI,EAAA,kCAAA;AAAA,cACJC,gDAAA;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,OAAOC,0BAAmB,CAAA,KAAA;AAAA,QACxBC,MAAE,MAAO,CAAA;AAAA,UACP,SAAA,EAAWA,KAAE,CAAA,KAAA,CAAM,CAACA,KAAA,CAAE,QAAU,EAAAA,KAAA,CAAE,MAAO,EAAC,CAAG,EAAA;AAAA,YAC3C,WAAa,EAAA;AAAA,WACd,CAAA;AAAA,UACD,MAAMA,KAAE,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,qBAAqB,CAAA;AAAA,UACnD,QAAA,EAAUA,MACP,MAAO,CAAA,EAAE,aAAa,uBAAwB,EAAC,EAC/C,QAAS,EAAA;AAAA,UACZ,MAAA,EAAQA,MAAE,KAAM,CAAAA,KAAA,CAAE,QAAU,EAAA,EAAE,WAAa,EAAA,QAAA,EAAU;AAAA,SACtD;AAAA,OACH;AAAA,MACA,MAAA,EAAQA,MAAE,MAAO,CAAA;AAAA,QACf,cAAcA,KAAE,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,gBAAgB,CAAA;AAAA,QACtD,MAAMA,KAAE,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,QAAQ;AAAA,OACvC;AAAA,KACH;AAAA,IACA,MAAM,QAAQ,GAAK,EAAA;AACjB,MAAA,GAAA,CAAI,OAAO,IAAK,CAAA,CAAA,4BAAA,EAA+B,GAAI,CAAA,KAAA,CAAM,SAAS,CAAG,CAAA,CAAA,CAAA;AACrE,MAAA,MAAM,EAAE,SAAW,EAAA,IAAA,EAAM,QAAU,EAAA,MAAA,KAAW,GAAI,CAAA,KAAA;AAClD,MAAA,MAAM,EAAE,KAAO,EAAA,iBAAA,KAAsBC,aAAS,CAAA,GAAA,CAAI,OAAO,YAAY,CAAA;AAErE,MAAI,IAAA,MAAA,CAAO,WAAW,CAAG,EAAA;AACvB,QAAA,MAAM,IAAIC,iBAAA;AAAA,UACR,CAAA,oCAAA,EAAuC,GAAI,CAAA,KAAA,CAAM,SAAS,CAAA,0BAAA;AAAA,SAC5D;AAAA;AAGF,MAAM,MAAA,GAAA,GAAM,IAAIC,WAAO,CAAA;AAAA,QACrB,IAAA,EAAM,kBAAkB,MAAO,CAAA,OAAA;AAAA,QAC/B;AAAA,OACD,CAAA;AAED,MAAA,MAAM,EAAE,WAAa,EAAA,cAAA,EAAmB,GAAA,MAAM,IAAI,UAAW,CAAA;AAAA,QAC3D,GAAK,EAAA,CAAA,oBAAA,EAAuB,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,QAC7C,IAAI,YAAY;AACd,UAAM,MAAA,GAAA,GAAM,MAAM,GAAA,CAAI,YAAa,CAAA,MAAA;AAAA,YACjC,IAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA,cACE,SAAA;AAAA,cACA;AAAA;AACF,WACF;AAEA,UAAA,IAAI,CAAC,GAAA,CAAI,cAAe,CAAA,OAAO,CAAG,EAAA;AAChC,YAAM,MAAA,IAAID,kBAAW,CAA4C,0CAAA,CAAA,CAAA;AAAA;AAGnE,UAAO,OAAA;AAAA,YACL,aAAa,GAAI,CAAA,KAAA;AAAA,YACjB,gBAAgB,GAAI,CAAA;AAAA,WACtB;AAAA;AACF,OACD,CAAA;AAED,MAAI,GAAA,CAAA,MAAA,CAAO,gBAAgB,WAAW,CAAA;AACtC,MAAI,GAAA,CAAA,MAAA,CAAO,QAAQ,cAAc,CAAA;AAAA;AACnC,GACD,CAAA;AACH;;;;"}
@@ -98,10 +98,16 @@ const createGitlabProjectMigrateAction = (options) => {
98
98
  access_token: sourceAccessToken
99
99
  };
100
100
  try {
101
- const { id: migrationId } = await api.Migrations.create(
102
- sourceConfig,
103
- migrationEntity
104
- );
101
+ const migrationId = await ctx.checkpoint({
102
+ key: `create.migration.${sourceUrl}`,
103
+ fn: async () => {
104
+ const migrationStatus = await api.Migrations.create(
105
+ sourceConfig,
106
+ migrationEntity
107
+ );
108
+ return migrationStatus.id;
109
+ }
110
+ });
105
111
  ctx.output(
106
112
  "importedRepoUrl",
107
113
  `${destinationHost}/${destinationNamespace}/${destinationSlug}`
@@ -1 +1 @@
1
- {"version":3,"file":"gitlabProjectMigrate.cjs.js","sources":["../../src/actions/gitlabProjectMigrate.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createTemplateAction,\n parseRepoUrl,\n} from '@backstage/plugin-scaffolder-node';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { InputError } from '@backstage/errors';\nimport { createGitlabApi } from './helpers';\nimport { examples } from './gitlabRepoPush.examples';\nimport { MigrationEntityOptions } from '@gitbeaker/rest';\n\n/**\n * Create a new action that imports a gitlab project into another gitlab project (potentially from another gitlab instance).\n *\n * @public\n */\nexport const createGitlabProjectMigrateAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n\n return createTemplateAction<{\n destinationAccessToken: string;\n destinationUrl: string;\n sourceAccessToken: string;\n sourceFullPath: string;\n sourceUrl: string;\n }>({\n id: 'gitlab:group:migrate',\n examples,\n schema: {\n input: {\n required: [\n 'destinationAccessToken',\n 'destinationUrl',\n 'sourceAccessToken',\n 'sourceFullPath',\n 'sourceUrl',\n ],\n type: 'object',\n properties: {\n destinationAccessToken: {\n type: 'string',\n title: 'Target Repository Access Token',\n description: `The token to use for authorization to the target GitLab'`,\n },\n destinationUrl: {\n type: 'string',\n title: 'Target Project Location',\n description: `Accepts the format 'gitlab.com?repo=project_name&owner=group_name' where 'project_name' is the repository name and 'group_name' is a group or username`,\n },\n sourceAccessToken: {\n type: 'string',\n title: 'Source Group Access Token',\n description: `The token to use for authorization to the source GitLab'`,\n },\n sourceFullPath: {\n type: 'string',\n title: 'Group Full Path',\n description:\n 'Full path to the project in the source Gitlab instance',\n },\n sourceUrl: {\n type: 'string',\n title: 'Source URL Location',\n description: `Accepts the format 'https://gitlab.com/'`,\n },\n },\n },\n output: {\n type: 'object',\n properties: {\n importedRepoUrl: {\n title: 'URL to the newly imported repo',\n type: 'string',\n },\n migrationId: {\n title: 'Id of the migration that imports the project',\n type: 'number',\n },\n },\n },\n },\n\n async handler(ctx) {\n const {\n destinationAccessToken,\n destinationUrl,\n sourceAccessToken,\n sourceFullPath,\n sourceUrl,\n } = ctx.input;\n\n const {\n host: destinationHost,\n repo: destinationSlug,\n owner: destinationNamespace,\n } = parseRepoUrl(destinationUrl, integrations);\n\n if (!destinationNamespace) {\n throw new InputError(\n `Failed to determine target repository to migrate to. Make sure destinationUrl matches the format 'gitlab.myorg.com?repo=project_name&owner=group_name'`,\n );\n }\n\n const api = createGitlabApi({\n integrations,\n token: destinationAccessToken,\n repoUrl: destinationUrl,\n });\n\n const migrationEntity: MigrationEntityOptions[] = [\n {\n sourceType: 'project_entity',\n sourceFullPath: sourceFullPath,\n destinationSlug: destinationSlug,\n destinationNamespace: destinationNamespace,\n },\n ];\n\n const sourceConfig = {\n url: sourceUrl,\n access_token: sourceAccessToken,\n };\n\n try {\n const { id: migrationId } = await api.Migrations.create(\n sourceConfig,\n migrationEntity,\n );\n\n ctx.output(\n 'importedRepoUrl',\n `${destinationHost}/${destinationNamespace}/${destinationSlug}`,\n );\n ctx.output('migrationId', migrationId);\n } catch (e: any) {\n throw new InputError(\n `Failed to transfer repo ${sourceFullPath}. Make sure that ${sourceFullPath} exists in ${sourceUrl}, and token has enough rights.\\nError: ${e}`,\n );\n }\n },\n });\n};\n"],"names":["createTemplateAction","examples","parseRepoUrl","InputError","createGitlabApi"],"mappings":"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"}
1
+ {"version":3,"file":"gitlabProjectMigrate.cjs.js","sources":["../../src/actions/gitlabProjectMigrate.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createTemplateAction,\n parseRepoUrl,\n} from '@backstage/plugin-scaffolder-node';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { InputError } from '@backstage/errors';\nimport { createGitlabApi } from './helpers';\nimport { examples } from './gitlabRepoPush.examples';\nimport { MigrationEntityOptions } from '@gitbeaker/rest';\n\n/**\n * Create a new action that imports a gitlab project into another gitlab project (potentially from another gitlab instance).\n *\n * @public\n */\nexport const createGitlabProjectMigrateAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n\n return createTemplateAction<{\n destinationAccessToken: string;\n destinationUrl: string;\n sourceAccessToken: string;\n sourceFullPath: string;\n sourceUrl: string;\n }>({\n id: 'gitlab:group:migrate',\n examples,\n schema: {\n input: {\n required: [\n 'destinationAccessToken',\n 'destinationUrl',\n 'sourceAccessToken',\n 'sourceFullPath',\n 'sourceUrl',\n ],\n type: 'object',\n properties: {\n destinationAccessToken: {\n type: 'string',\n title: 'Target Repository Access Token',\n description: `The token to use for authorization to the target GitLab'`,\n },\n destinationUrl: {\n type: 'string',\n title: 'Target Project Location',\n description: `Accepts the format 'gitlab.com?repo=project_name&owner=group_name' where 'project_name' is the repository name and 'group_name' is a group or username`,\n },\n sourceAccessToken: {\n type: 'string',\n title: 'Source Group Access Token',\n description: `The token to use for authorization to the source GitLab'`,\n },\n sourceFullPath: {\n type: 'string',\n title: 'Group Full Path',\n description:\n 'Full path to the project in the source Gitlab instance',\n },\n sourceUrl: {\n type: 'string',\n title: 'Source URL Location',\n description: `Accepts the format 'https://gitlab.com/'`,\n },\n },\n },\n output: {\n type: 'object',\n properties: {\n importedRepoUrl: {\n title: 'URL to the newly imported repo',\n type: 'string',\n },\n migrationId: {\n title: 'Id of the migration that imports the project',\n type: 'number',\n },\n },\n },\n },\n\n async handler(ctx) {\n const {\n destinationAccessToken,\n destinationUrl,\n sourceAccessToken,\n sourceFullPath,\n sourceUrl,\n } = ctx.input;\n\n const {\n host: destinationHost,\n repo: destinationSlug,\n owner: destinationNamespace,\n } = parseRepoUrl(destinationUrl, integrations);\n\n if (!destinationNamespace) {\n throw new InputError(\n `Failed to determine target repository to migrate to. Make sure destinationUrl matches the format 'gitlab.myorg.com?repo=project_name&owner=group_name'`,\n );\n }\n\n const api = createGitlabApi({\n integrations,\n token: destinationAccessToken,\n repoUrl: destinationUrl,\n });\n\n const migrationEntity: MigrationEntityOptions[] = [\n {\n sourceType: 'project_entity',\n sourceFullPath: sourceFullPath,\n destinationSlug: destinationSlug,\n destinationNamespace: destinationNamespace,\n },\n ];\n\n const sourceConfig = {\n url: sourceUrl,\n access_token: sourceAccessToken,\n };\n\n try {\n const migrationId = await ctx.checkpoint({\n key: `create.migration.${sourceUrl}`,\n fn: async () => {\n const migrationStatus = await api.Migrations.create(\n sourceConfig,\n migrationEntity,\n );\n return migrationStatus.id;\n },\n });\n\n ctx.output(\n 'importedRepoUrl',\n `${destinationHost}/${destinationNamespace}/${destinationSlug}`,\n );\n ctx.output('migrationId', migrationId);\n } catch (e: any) {\n throw new InputError(\n `Failed to transfer repo ${sourceFullPath}. Make sure that ${sourceFullPath} exists in ${sourceUrl}, and token has enough rights.\\nError: ${e}`,\n );\n }\n },\n });\n};\n"],"names":["createTemplateAction","examples","parseRepoUrl","InputError","createGitlabApi"],"mappings":"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"}
@@ -46,12 +46,17 @@ const createGitlabProjectVariableAction = (options) => {
46
46
  } = ctx.input;
47
47
  const { host } = util.parseRepoUrl(repoUrl, integrations);
48
48
  const api = util.getClient({ host, integrations, token });
49
- await api.ProjectVariables.create(projectId, key, value, {
50
- variableType,
51
- protected: variableProtected,
52
- masked,
53
- raw,
54
- environmentScope
49
+ await ctx.checkpoint({
50
+ key: `create.project.variables.${projectId}.${key}.${value}`,
51
+ fn: async () => {
52
+ await api.ProjectVariables.create(projectId, key, value, {
53
+ variableType,
54
+ protected: variableProtected,
55
+ masked,
56
+ raw,
57
+ environmentScope
58
+ });
59
+ }
55
60
  });
56
61
  }
57
62
  });
@@ -1 +1 @@
1
- {"version":3,"file":"gitlabProjectVariableCreate.cjs.js","sources":["../../src/actions/gitlabProjectVariableCreate.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { VariableType } from '@gitbeaker/rest';\nimport { z } from 'zod';\nimport commonGitlabConfig from '../commonGitlabConfig';\nimport { getClient, parseRepoUrl } from '../util';\nimport { examples } from './gitlabProjectVariableCreate.examples';\n\n/**\n * Creates a `gitlab:projectVariable:create` Scaffolder action.\n *\n * @param options - Templating configuration.\n * @public\n */\nexport const createGitlabProjectVariableAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n return createTemplateAction({\n id: 'gitlab:projectVariable:create',\n examples,\n schema: {\n input: commonGitlabConfig.merge(\n z.object({\n projectId: z.union([z.number(), z.string()], {\n description: 'Project ID',\n }),\n key: z\n .string({\n description:\n 'The key of a variable; must have no more than 255 characters; only A-Z, a-z, 0-9, and _ are allowed',\n })\n .regex(/^[A-Za-z0-9_]{1,255}$/),\n value: z.string({ description: 'The value of a variable' }),\n variableType: z.string({\n description: 'Variable Type (env_var or file)',\n }),\n variableProtected: z\n .boolean({ description: 'Whether the variable is protected' })\n .default(false)\n .optional(),\n masked: z\n .boolean({ description: 'Whether the variable is masked' })\n .default(false)\n .optional(),\n raw: z\n .boolean({ description: 'Whether the variable is expandable' })\n .default(false)\n .optional(),\n environmentScope: z\n .string({ description: 'The environment_scope of the variable' })\n .default('*')\n .optional(),\n }),\n ),\n },\n async handler(ctx) {\n const {\n repoUrl,\n projectId,\n key,\n value,\n variableType,\n variableProtected = false,\n masked = false,\n raw = false,\n environmentScope = '*',\n token,\n } = ctx.input;\n\n const { host } = parseRepoUrl(repoUrl, integrations);\n\n const api = getClient({ host, integrations, token });\n\n await api.ProjectVariables.create(projectId, key, value, {\n variableType: variableType as VariableType,\n protected: variableProtected,\n masked,\n raw,\n environmentScope,\n });\n },\n });\n};\n"],"names":["createTemplateAction","examples","commonGitlabConfig","z","parseRepoUrl","getClient"],"mappings":";;;;;;;;AA8Ba,MAAA,iCAAA,GAAoC,CAAC,OAE5C,KAAA;AACJ,EAAM,MAAA,EAAE,cAAiB,GAAA,OAAA;AACzB,EAAA,OAAOA,yCAAqB,CAAA;AAAA,IAC1B,EAAI,EAAA,+BAAA;AAAA,cACJC,6CAAA;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,OAAOC,0BAAmB,CAAA,KAAA;AAAA,QACxBC,MAAE,MAAO,CAAA;AAAA,UACP,SAAA,EAAWA,KAAE,CAAA,KAAA,CAAM,CAACA,KAAA,CAAE,QAAU,EAAAA,KAAA,CAAE,MAAO,EAAC,CAAG,EAAA;AAAA,YAC3C,WAAa,EAAA;AAAA,WACd,CAAA;AAAA,UACD,GAAA,EAAKA,MACF,MAAO,CAAA;AAAA,YACN,WACE,EAAA;AAAA,WACH,CACA,CAAA,KAAA,CAAM,uBAAuB,CAAA;AAAA,UAChC,OAAOA,KAAE,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,2BAA2B,CAAA;AAAA,UAC1D,YAAA,EAAcA,MAAE,MAAO,CAAA;AAAA,YACrB,WAAa,EAAA;AAAA,WACd,CAAA;AAAA,UACD,iBAAA,EAAmBA,KAChB,CAAA,OAAA,CAAQ,EAAE,WAAA,EAAa,mCAAoC,EAAC,CAC5D,CAAA,OAAA,CAAQ,KAAK,CAAA,CACb,QAAS,EAAA;AAAA,UACZ,MAAA,EAAQA,KACL,CAAA,OAAA,CAAQ,EAAE,WAAA,EAAa,gCAAiC,EAAC,CACzD,CAAA,OAAA,CAAQ,KAAK,CAAA,CACb,QAAS,EAAA;AAAA,UACZ,GAAA,EAAKA,KACF,CAAA,OAAA,CAAQ,EAAE,WAAA,EAAa,oCAAqC,EAAC,CAC7D,CAAA,OAAA,CAAQ,KAAK,CAAA,CACb,QAAS,EAAA;AAAA,UACZ,gBAAA,EAAkBA,KACf,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,uCAAwC,EAAC,CAC/D,CAAA,OAAA,CAAQ,GAAG,CAAA,CACX,QAAS;AAAA,SACb;AAAA;AACH,KACF;AAAA,IACA,MAAM,QAAQ,GAAK,EAAA;AACjB,MAAM,MAAA;AAAA,QACJ,OAAA;AAAA,QACA,SAAA;AAAA,QACA,GAAA;AAAA,QACA,KAAA;AAAA,QACA,YAAA;AAAA,QACA,iBAAoB,GAAA,KAAA;AAAA,QACpB,MAAS,GAAA,KAAA;AAAA,QACT,GAAM,GAAA,KAAA;AAAA,QACN,gBAAmB,GAAA,GAAA;AAAA,QACnB;AAAA,UACE,GAAI,CAAA,KAAA;AAER,MAAA,MAAM,EAAE,IAAA,EAAS,GAAAC,iBAAA,CAAa,SAAS,YAAY,CAAA;AAEnD,MAAA,MAAM,MAAMC,cAAU,CAAA,EAAE,IAAM,EAAA,YAAA,EAAc,OAAO,CAAA;AAEnD,MAAA,MAAM,GAAI,CAAA,gBAAA,CAAiB,MAAO,CAAA,SAAA,EAAW,KAAK,KAAO,EAAA;AAAA,QACvD,YAAA;AAAA,QACA,SAAW,EAAA,iBAAA;AAAA,QACX,MAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA;AACH,GACD,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"gitlabProjectVariableCreate.cjs.js","sources":["../../src/actions/gitlabProjectVariableCreate.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { VariableType } from '@gitbeaker/rest';\nimport { z } from 'zod';\nimport commonGitlabConfig from '../commonGitlabConfig';\nimport { getClient, parseRepoUrl } from '../util';\nimport { examples } from './gitlabProjectVariableCreate.examples';\n\n/**\n * Creates a `gitlab:projectVariable:create` Scaffolder action.\n *\n * @param options - Templating configuration.\n * @public\n */\nexport const createGitlabProjectVariableAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n return createTemplateAction({\n id: 'gitlab:projectVariable:create',\n examples,\n schema: {\n input: commonGitlabConfig.merge(\n z.object({\n projectId: z.union([z.number(), z.string()], {\n description: 'Project ID',\n }),\n key: z\n .string({\n description:\n 'The key of a variable; must have no more than 255 characters; only A-Z, a-z, 0-9, and _ are allowed',\n })\n .regex(/^[A-Za-z0-9_]{1,255}$/),\n value: z.string({ description: 'The value of a variable' }),\n variableType: z.string({\n description: 'Variable Type (env_var or file)',\n }),\n variableProtected: z\n .boolean({ description: 'Whether the variable is protected' })\n .default(false)\n .optional(),\n masked: z\n .boolean({ description: 'Whether the variable is masked' })\n .default(false)\n .optional(),\n raw: z\n .boolean({ description: 'Whether the variable is expandable' })\n .default(false)\n .optional(),\n environmentScope: z\n .string({ description: 'The environment_scope of the variable' })\n .default('*')\n .optional(),\n }),\n ),\n },\n async handler(ctx) {\n const {\n repoUrl,\n projectId,\n key,\n value,\n variableType,\n variableProtected = false,\n masked = false,\n raw = false,\n environmentScope = '*',\n token,\n } = ctx.input;\n\n const { host } = parseRepoUrl(repoUrl, integrations);\n\n const api = getClient({ host, integrations, token });\n\n await ctx.checkpoint({\n key: `create.project.variables.${projectId}.${key}.${value}`,\n fn: async () => {\n await api.ProjectVariables.create(projectId, key, value, {\n variableType: variableType as VariableType,\n protected: variableProtected,\n masked,\n raw,\n environmentScope,\n });\n },\n });\n },\n });\n};\n"],"names":["createTemplateAction","examples","commonGitlabConfig","z","parseRepoUrl","getClient"],"mappings":";;;;;;;;AA8Ba,MAAA,iCAAA,GAAoC,CAAC,OAE5C,KAAA;AACJ,EAAM,MAAA,EAAE,cAAiB,GAAA,OAAA;AACzB,EAAA,OAAOA,yCAAqB,CAAA;AAAA,IAC1B,EAAI,EAAA,+BAAA;AAAA,cACJC,6CAAA;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,OAAOC,0BAAmB,CAAA,KAAA;AAAA,QACxBC,MAAE,MAAO,CAAA;AAAA,UACP,SAAA,EAAWA,KAAE,CAAA,KAAA,CAAM,CAACA,KAAA,CAAE,QAAU,EAAAA,KAAA,CAAE,MAAO,EAAC,CAAG,EAAA;AAAA,YAC3C,WAAa,EAAA;AAAA,WACd,CAAA;AAAA,UACD,GAAA,EAAKA,MACF,MAAO,CAAA;AAAA,YACN,WACE,EAAA;AAAA,WACH,CACA,CAAA,KAAA,CAAM,uBAAuB,CAAA;AAAA,UAChC,OAAOA,KAAE,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,2BAA2B,CAAA;AAAA,UAC1D,YAAA,EAAcA,MAAE,MAAO,CAAA;AAAA,YACrB,WAAa,EAAA;AAAA,WACd,CAAA;AAAA,UACD,iBAAA,EAAmBA,KAChB,CAAA,OAAA,CAAQ,EAAE,WAAA,EAAa,mCAAoC,EAAC,CAC5D,CAAA,OAAA,CAAQ,KAAK,CAAA,CACb,QAAS,EAAA;AAAA,UACZ,MAAA,EAAQA,KACL,CAAA,OAAA,CAAQ,EAAE,WAAA,EAAa,gCAAiC,EAAC,CACzD,CAAA,OAAA,CAAQ,KAAK,CAAA,CACb,QAAS,EAAA;AAAA,UACZ,GAAA,EAAKA,KACF,CAAA,OAAA,CAAQ,EAAE,WAAA,EAAa,oCAAqC,EAAC,CAC7D,CAAA,OAAA,CAAQ,KAAK,CAAA,CACb,QAAS,EAAA;AAAA,UACZ,gBAAA,EAAkBA,KACf,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,uCAAwC,EAAC,CAC/D,CAAA,OAAA,CAAQ,GAAG,CAAA,CACX,QAAS;AAAA,SACb;AAAA;AACH,KACF;AAAA,IACA,MAAM,QAAQ,GAAK,EAAA;AACjB,MAAM,MAAA;AAAA,QACJ,OAAA;AAAA,QACA,SAAA;AAAA,QACA,GAAA;AAAA,QACA,KAAA;AAAA,QACA,YAAA;AAAA,QACA,iBAAoB,GAAA,KAAA;AAAA,QACpB,MAAS,GAAA,KAAA;AAAA,QACT,GAAM,GAAA,KAAA;AAAA,QACN,gBAAmB,GAAA,GAAA;AAAA,QACnB;AAAA,UACE,GAAI,CAAA,KAAA;AAER,MAAA,MAAM,EAAE,IAAA,EAAS,GAAAC,iBAAA,CAAa,SAAS,YAAY,CAAA;AAEnD,MAAA,MAAM,MAAMC,cAAU,CAAA,EAAE,IAAM,EAAA,YAAA,EAAc,OAAO,CAAA;AAEnD,MAAA,MAAM,IAAI,UAAW,CAAA;AAAA,QACnB,KAAK,CAA4B,yBAAA,EAAA,SAAS,CAAI,CAAA,EAAA,GAAG,IAAI,KAAK,CAAA,CAAA;AAAA,QAC1D,IAAI,YAAY;AACd,UAAA,MAAM,GAAI,CAAA,gBAAA,CAAiB,MAAO,CAAA,SAAA,EAAW,KAAK,KAAO,EAAA;AAAA,YACvD,YAAA;AAAA,YACA,SAAW,EAAA,iBAAA;AAAA,YACX,MAAA;AAAA,YACA,GAAA;AAAA,YACA;AAAA,WACD,CAAA;AAAA;AACH,OACD,CAAA;AAAA;AACH,GACD,CAAA;AACH;;;;"}
@@ -109,19 +109,24 @@ const createGitlabRepoPushAction = (options) => {
109
109
  content: file.content.toString("base64"),
110
110
  execute_filemode: file.executable
111
111
  }));
112
- let branchExists = false;
113
- try {
114
- await api.Branches.show(repoID, branchName);
115
- branchExists = true;
116
- } catch (e) {
117
- if (e.cause?.response?.status !== 404) {
118
- throw new errors.InputError(
119
- `Failed to check status of branch '${branchName}'. Please make sure that branch already exists or Backstage has permissions to create one. ${helpers.getErrorMessage(
120
- e
121
- )}`
122
- );
112
+ const branchExists = await ctx.checkpoint({
113
+ key: `branch.exists.${repoID}.${branchName}`,
114
+ fn: async () => {
115
+ try {
116
+ await api.Branches.show(repoID, branchName);
117
+ return true;
118
+ } catch (e) {
119
+ if (e.cause?.response?.status !== 404) {
120
+ throw new errors.InputError(
121
+ `Failed to check status of branch '${branchName}'. Please make sure that branch already exists or Backstage has permissions to create one. ${helpers.getErrorMessage(
122
+ e
123
+ )}`
124
+ );
125
+ }
126
+ }
127
+ return false;
123
128
  }
124
- }
129
+ });
125
130
  if (!branchExists) {
126
131
  try {
127
132
  const projects = await api.Projects.show(repoID);
@@ -136,15 +141,21 @@ const createGitlabRepoPushAction = (options) => {
136
141
  }
137
142
  }
138
143
  try {
139
- const commit = await api.Commits.create(
140
- repoID,
141
- branchName,
142
- ctx.input.commitMessage,
143
- actions
144
- );
144
+ const commitId = await ctx.checkpoint({
145
+ key: `commit.create.${repoID}.${branchName}`,
146
+ fn: async () => {
147
+ const commit = await api.Commits.create(
148
+ repoID,
149
+ branchName,
150
+ ctx.input.commitMessage,
151
+ actions
152
+ );
153
+ return commit.id;
154
+ }
155
+ });
145
156
  ctx.output("projectid", repoID);
146
157
  ctx.output("projectPath", repoID);
147
- ctx.output("commitHash", commit.id);
158
+ ctx.output("commitHash", commitId);
148
159
  } catch (e) {
149
160
  throw new errors.InputError(
150
161
  `Committing the changes to ${branchName} failed. Please check that none of the files created by the template already exists. ${helpers.getErrorMessage(
@@ -1 +1 @@
1
- {"version":3,"file":"gitlabRepoPush.cjs.js","sources":["../../src/actions/gitlabRepoPush.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createTemplateAction,\n parseRepoUrl,\n serializeDirectoryContents,\n} from '@backstage/plugin-scaffolder-node';\nimport { CommitAction } from '@gitbeaker/rest';\nimport path from 'path';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { InputError } from '@backstage/errors';\nimport { resolveSafeChildPath } from '@backstage/backend-plugin-api';\nimport { createGitlabApi, getErrorMessage } from './helpers';\nimport { examples } from './gitlabRepoPush.examples';\n\n/**\n * Create a new action that commits into a gitlab repository.\n *\n * @public\n */\nexport const createGitlabRepoPushAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n\n return createTemplateAction<{\n repoUrl: string;\n branchName: string;\n commitMessage: string;\n sourcePath?: string;\n targetPath?: string;\n token?: string;\n commitAction?: 'create' | 'delete' | 'update';\n }>({\n id: 'gitlab:repo:push',\n examples,\n schema: {\n input: {\n required: ['repoUrl', 'branchName', 'commitMessage'],\n type: 'object',\n properties: {\n repoUrl: {\n type: 'string',\n title: 'Repository Location',\n description: `Accepts the format 'gitlab.com?repo=project_name&owner=group_name' where 'project_name' is the repository name and 'group_name' is a group or username`,\n },\n branchName: {\n type: 'string',\n title: 'Source Branch Name',\n description: 'The branch name for the commit',\n },\n commitMessage: {\n type: 'string',\n title: 'Commit Message',\n description: `The commit message`,\n },\n sourcePath: {\n type: 'string',\n title: 'Working Subdirectory',\n description:\n 'Subdirectory of working directory to copy changes from',\n },\n targetPath: {\n type: 'string',\n title: 'Repository Subdirectory',\n description: 'Subdirectory of repository to apply changes to',\n },\n token: {\n title: 'Authentication Token',\n type: 'string',\n description: 'The token to use for authorization to GitLab',\n },\n commitAction: {\n title: 'Commit action',\n type: 'string',\n enum: ['create', 'update', 'delete'],\n description:\n 'The action to be used for git commit. Defaults to create.',\n },\n },\n },\n output: {\n type: 'object',\n properties: {\n projectid: {\n title: 'Gitlab Project id/Name(slug)',\n type: 'string',\n },\n projectPath: {\n title: 'Gitlab Project path',\n type: 'string',\n },\n commitHash: {\n title: 'The git commit hash of the commit',\n type: 'string',\n },\n },\n },\n },\n async handler(ctx) {\n const {\n branchName,\n repoUrl,\n targetPath,\n sourcePath,\n token,\n commitAction,\n } = ctx.input;\n\n const { owner, repo, project } = parseRepoUrl(repoUrl, integrations);\n const repoID = project ? project : `${owner}/${repo}`;\n\n const api = createGitlabApi({\n integrations,\n token,\n repoUrl,\n });\n\n let fileRoot: string;\n if (sourcePath) {\n fileRoot = resolveSafeChildPath(ctx.workspacePath, sourcePath);\n } else {\n fileRoot = ctx.workspacePath;\n }\n\n const fileContents = await serializeDirectoryContents(fileRoot, {\n gitignore: true,\n });\n\n const actions: CommitAction[] = fileContents.map(file => ({\n action: commitAction ?? 'create',\n filePath: targetPath\n ? path.posix.join(targetPath, file.path)\n : file.path,\n encoding: 'base64',\n content: file.content.toString('base64'),\n execute_filemode: file.executable,\n }));\n\n let branchExists = false;\n try {\n await api.Branches.show(repoID, branchName);\n branchExists = true;\n } catch (e: any) {\n if (e.cause?.response?.status !== 404) {\n throw new InputError(\n `Failed to check status of branch '${branchName}'. Please make sure that branch already exists or Backstage has permissions to create one. ${getErrorMessage(\n e,\n )}`,\n );\n }\n }\n\n if (!branchExists) {\n // create a branch using the default branch as ref\n try {\n const projects = await api.Projects.show(repoID);\n const { default_branch: defaultBranch } = projects;\n await api.Branches.create(repoID, branchName, String(defaultBranch));\n } catch (e) {\n throw new InputError(\n `The branch '${branchName}' was not found and creation failed with error. Please make sure that branch already exists or Backstage has permissions to create one. ${getErrorMessage(\n e,\n )}`,\n );\n }\n }\n\n try {\n const commit = await api.Commits.create(\n repoID,\n branchName,\n ctx.input.commitMessage,\n actions,\n );\n ctx.output('projectid', repoID);\n ctx.output('projectPath', repoID);\n ctx.output('commitHash', commit.id);\n } catch (e) {\n throw new InputError(\n `Committing the changes to ${branchName} failed. Please check that none of the files created by the template already exists. ${getErrorMessage(\n e,\n )}`,\n );\n }\n },\n });\n};\n"],"names":["createTemplateAction","examples","parseRepoUrl","createGitlabApi","resolveSafeChildPath","serializeDirectoryContents","path","InputError","getErrorMessage"],"mappings":"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"}
1
+ {"version":3,"file":"gitlabRepoPush.cjs.js","sources":["../../src/actions/gitlabRepoPush.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createTemplateAction,\n parseRepoUrl,\n serializeDirectoryContents,\n} from '@backstage/plugin-scaffolder-node';\nimport { CommitAction } from '@gitbeaker/rest';\nimport path from 'path';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { InputError } from '@backstage/errors';\nimport { resolveSafeChildPath } from '@backstage/backend-plugin-api';\nimport { createGitlabApi, getErrorMessage } from './helpers';\nimport { examples } from './gitlabRepoPush.examples';\n\n/**\n * Create a new action that commits into a gitlab repository.\n *\n * @public\n */\nexport const createGitlabRepoPushAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n\n return createTemplateAction<{\n repoUrl: string;\n branchName: string;\n commitMessage: string;\n sourcePath?: string;\n targetPath?: string;\n token?: string;\n commitAction?: 'create' | 'delete' | 'update';\n }>({\n id: 'gitlab:repo:push',\n examples,\n schema: {\n input: {\n required: ['repoUrl', 'branchName', 'commitMessage'],\n type: 'object',\n properties: {\n repoUrl: {\n type: 'string',\n title: 'Repository Location',\n description: `Accepts the format 'gitlab.com?repo=project_name&owner=group_name' where 'project_name' is the repository name and 'group_name' is a group or username`,\n },\n branchName: {\n type: 'string',\n title: 'Source Branch Name',\n description: 'The branch name for the commit',\n },\n commitMessage: {\n type: 'string',\n title: 'Commit Message',\n description: `The commit message`,\n },\n sourcePath: {\n type: 'string',\n title: 'Working Subdirectory',\n description:\n 'Subdirectory of working directory to copy changes from',\n },\n targetPath: {\n type: 'string',\n title: 'Repository Subdirectory',\n description: 'Subdirectory of repository to apply changes to',\n },\n token: {\n title: 'Authentication Token',\n type: 'string',\n description: 'The token to use for authorization to GitLab',\n },\n commitAction: {\n title: 'Commit action',\n type: 'string',\n enum: ['create', 'update', 'delete'],\n description:\n 'The action to be used for git commit. Defaults to create.',\n },\n },\n },\n output: {\n type: 'object',\n properties: {\n projectid: {\n title: 'Gitlab Project id/Name(slug)',\n type: 'string',\n },\n projectPath: {\n title: 'Gitlab Project path',\n type: 'string',\n },\n commitHash: {\n title: 'The git commit hash of the commit',\n type: 'string',\n },\n },\n },\n },\n async handler(ctx) {\n const {\n branchName,\n repoUrl,\n targetPath,\n sourcePath,\n token,\n commitAction,\n } = ctx.input;\n\n const { owner, repo, project } = parseRepoUrl(repoUrl, integrations);\n const repoID = project ? project : `${owner}/${repo}`;\n\n const api = createGitlabApi({\n integrations,\n token,\n repoUrl,\n });\n\n let fileRoot: string;\n if (sourcePath) {\n fileRoot = resolveSafeChildPath(ctx.workspacePath, sourcePath);\n } else {\n fileRoot = ctx.workspacePath;\n }\n\n const fileContents = await serializeDirectoryContents(fileRoot, {\n gitignore: true,\n });\n\n const actions: CommitAction[] = fileContents.map(file => ({\n action: commitAction ?? 'create',\n filePath: targetPath\n ? path.posix.join(targetPath, file.path)\n : file.path,\n encoding: 'base64',\n content: file.content.toString('base64'),\n execute_filemode: file.executable,\n }));\n\n const branchExists = await ctx.checkpoint({\n key: `branch.exists.${repoID}.${branchName}`,\n fn: async () => {\n try {\n await api.Branches.show(repoID, branchName);\n return true;\n } catch (e: any) {\n if (e.cause?.response?.status !== 404) {\n throw new InputError(\n `Failed to check status of branch '${branchName}'. Please make sure that branch already exists or Backstage has permissions to create one. ${getErrorMessage(\n e,\n )}`,\n );\n }\n }\n return false;\n },\n });\n\n if (!branchExists) {\n // create a branch using the default branch as ref\n try {\n const projects = await api.Projects.show(repoID);\n const { default_branch: defaultBranch } = projects;\n await api.Branches.create(repoID, branchName, String(defaultBranch));\n } catch (e) {\n throw new InputError(\n `The branch '${branchName}' was not found and creation failed with error. Please make sure that branch already exists or Backstage has permissions to create one. ${getErrorMessage(\n e,\n )}`,\n );\n }\n }\n\n try {\n const commitId = await ctx.checkpoint({\n key: `commit.create.${repoID}.${branchName}`,\n fn: async () => {\n const commit = await api.Commits.create(\n repoID,\n branchName,\n ctx.input.commitMessage,\n actions,\n );\n return commit.id;\n },\n });\n\n ctx.output('projectid', repoID);\n ctx.output('projectPath', repoID);\n ctx.output('commitHash', commitId);\n } catch (e) {\n throw new InputError(\n `Committing the changes to ${branchName} failed. Please check that none of the files created by the template already exists. ${getErrorMessage(\n e,\n )}`,\n );\n }\n },\n });\n};\n"],"names":["createTemplateAction","examples","parseRepoUrl","createGitlabApi","resolveSafeChildPath","serializeDirectoryContents","path","InputError","getErrorMessage"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -15,48 +15,49 @@ declare function createPublishGitlabAction(options: {
15
15
  config: Config;
16
16
  }): _backstage_plugin_scaffolder_node.TemplateAction<{
17
17
  repoUrl: string;
18
- defaultBranch?: string | undefined;
18
+ defaultBranch?: string;
19
19
  /** @deprecated in favour of settings.visibility field */
20
- repoVisibility?: "internal" | "private" | "public" | undefined;
21
- sourcePath?: string | boolean | undefined;
22
- skipExisting?: boolean | undefined;
23
- token?: string | undefined;
24
- gitCommitMessage?: string | undefined;
25
- gitAuthorName?: string | undefined;
26
- gitAuthorEmail?: string | undefined;
27
- setUserAsOwner?: boolean | undefined;
20
+ repoVisibility?: "private" | "internal" | "public";
21
+ sourcePath?: string | boolean;
22
+ skipExisting?: boolean;
23
+ token?: string;
24
+ gitCommitMessage?: string;
25
+ gitAuthorName?: string;
26
+ gitAuthorEmail?: string;
27
+ signCommit?: boolean;
28
+ setUserAsOwner?: boolean;
28
29
  /** @deprecated in favour of settings.topics field */
29
- topics?: string[] | undefined;
30
+ topics?: string[];
30
31
  settings?: {
31
- path?: string | undefined;
32
- auto_devops_enabled?: boolean | undefined;
33
- ci_config_path?: string | undefined;
34
- description?: string | undefined;
35
- merge_method?: "merge" | "ff" | "rebase_merge" | undefined;
36
- squash_option?: "always" | "never" | "default_on" | "default_off" | undefined;
37
- topics?: string[] | undefined;
38
- visibility?: "internal" | "private" | "public" | undefined;
39
- only_allow_merge_if_all_discussions_are_resolved?: boolean | undefined;
40
- only_allow_merge_if_pipeline_succeeds?: boolean | undefined;
41
- allow_merge_on_skipped_pipeline?: boolean | undefined;
42
- } | undefined;
43
- branches?: {
32
+ path?: string;
33
+ auto_devops_enabled?: boolean;
34
+ ci_config_path?: string;
35
+ description?: string;
36
+ merge_method?: "merge" | "rebase_merge" | "ff";
37
+ squash_option?: "default_off" | "default_on" | "never" | "always";
38
+ topics?: string[];
39
+ visibility?: "private" | "internal" | "public";
40
+ only_allow_merge_if_all_discussions_are_resolved?: boolean;
41
+ only_allow_merge_if_pipeline_succeeds?: boolean;
42
+ allow_merge_on_skipped_pipeline?: boolean;
43
+ };
44
+ branches?: Array<{
44
45
  name: string;
45
- protect?: boolean | undefined;
46
- create?: boolean | undefined;
47
- ref?: string | undefined;
48
- }[] | undefined;
49
- projectVariables?: {
46
+ protect?: boolean;
47
+ create?: boolean;
48
+ ref?: string;
49
+ }>;
50
+ projectVariables?: Array<{
50
51
  key: string;
51
52
  value: string;
52
- description?: string | undefined;
53
- variable_type?: string | undefined;
54
- protected?: boolean | undefined;
55
- masked?: boolean | undefined;
56
- raw?: boolean | undefined;
57
- environment_scope?: string | undefined;
58
- }[] | undefined;
59
- }, _backstage_types.JsonObject>;
53
+ description?: string;
54
+ variable_type?: string;
55
+ protected?: boolean;
56
+ masked?: boolean;
57
+ raw?: boolean;
58
+ environment_scope?: string;
59
+ }>;
60
+ }, _backstage_types.JsonObject, "v1">;
60
61
 
61
62
  /**
62
63
  * Creates an `gitlab:group:ensureExists` Scaffolder action.
@@ -74,7 +75,7 @@ declare const createGitlabGroupEnsureExistsAction: (options: {
74
75
  token?: string | undefined;
75
76
  }, {
76
77
  groupId?: number | undefined;
77
- }>;
78
+ }, "v1">;
78
79
 
79
80
  /**
80
81
  * Gitlab issue types as specified by gitlab api
@@ -126,7 +127,7 @@ declare const createGitlabIssueAction: (options: {
126
127
  issueUrl: string;
127
128
  issueId: number;
128
129
  issueIid: number;
129
- }>;
130
+ }, "v1">;
130
131
 
131
132
  /**
132
133
  * Creates a `gitlab:issue:edit` Scaffolder action.
@@ -164,7 +165,7 @@ declare const editGitlabIssueAction: (options: {
164
165
  issueUrl: string;
165
166
  issueId: number;
166
167
  issueIid: number;
167
- }>;
168
+ }, "v1">;
168
169
 
169
170
  /**
170
171
  * Create a new action that creates a gitlab merge request.
@@ -178,18 +179,18 @@ declare const createPublishGitlabMergeRequestAction: (options: {
178
179
  title: string;
179
180
  description: string;
180
181
  branchName: string;
181
- targetBranchName?: string | undefined;
182
- sourcePath?: string | undefined;
183
- targetPath?: string | undefined;
184
- token?: string | undefined;
185
- commitAction?: "auto" | "update" | "delete" | "create" | "skip" | undefined;
182
+ targetBranchName?: string;
183
+ sourcePath?: string;
184
+ targetPath?: string;
185
+ token?: string;
186
+ commitAction?: "create" | "delete" | "update" | "skip" | "auto";
186
187
  /** @deprecated projectID passed as query parameters in the repoUrl */
187
- projectid?: string | undefined;
188
- removeSourceBranch?: boolean | undefined;
189
- assignee?: string | undefined;
190
- reviewers?: string[] | undefined;
191
- assignReviewersFromApprovalRules?: boolean | undefined;
192
- }, _backstage_types.JsonObject>;
188
+ projectid?: string;
189
+ removeSourceBranch?: boolean;
190
+ assignee?: string;
191
+ reviewers?: string[];
192
+ assignReviewersFromApprovalRules?: boolean;
193
+ }, _backstage_types.JsonObject, "v1">;
193
194
 
194
195
  /**
195
196
  * Creates a `gitlab:pipeline:trigger` Scaffolder action.
@@ -208,7 +209,7 @@ declare const createTriggerGitlabPipelineAction: (options: {
208
209
  variables?: Record<string, string> | undefined;
209
210
  }, {
210
211
  pipelineUrl: string;
211
- }>;
212
+ }, "v1">;
212
213
 
213
214
  /**
214
215
  * Creates a `gitlab:projectAccessToken:create` Scaffolder action.
@@ -228,7 +229,7 @@ declare const createGitlabProjectAccessTokenAction: (options: {
228
229
  accessLevel?: number | undefined;
229
230
  }, {
230
231
  access_token: string;
231
- }>;
232
+ }, "v1">;
232
233
 
233
234
  /**
234
235
  * Creates a `gitlab:projectDeployToken:create` Scaffolder action.
@@ -248,7 +249,7 @@ declare const createGitlabProjectDeployTokenAction: (options: {
248
249
  }, {
249
250
  user: string;
250
251
  deploy_token: string;
251
- }>;
252
+ }, "v1">;
252
253
 
253
254
  /**
254
255
  * Creates a `gitlab:projectVariable:create` Scaffolder action.
@@ -269,7 +270,7 @@ declare const createGitlabProjectVariableAction: (options: {
269
270
  masked?: boolean | undefined;
270
271
  environmentScope?: string | undefined;
271
272
  variableProtected?: boolean | undefined;
272
- }, _backstage_types.JsonObject>;
273
+ }, any, "v1">;
273
274
 
274
275
  /**
275
276
  * Create a new action that commits into a gitlab repository.
@@ -282,11 +283,11 @@ declare const createGitlabRepoPushAction: (options: {
282
283
  repoUrl: string;
283
284
  branchName: string;
284
285
  commitMessage: string;
285
- sourcePath?: string | undefined;
286
- targetPath?: string | undefined;
287
- token?: string | undefined;
288
- commitAction?: "update" | "delete" | "create" | undefined;
289
- }, _backstage_types.JsonObject>;
286
+ sourcePath?: string;
287
+ targetPath?: string;
288
+ token?: string;
289
+ commitAction?: "create" | "delete" | "update";
290
+ }, _backstage_types.JsonObject, "v1">;
290
291
 
291
292
  /**
292
293
  * @public
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-scaffolder-backend-module-gitlab",
3
- "version": "0.8.1-next.1",
3
+ "version": "0.8.1",
4
4
  "backstage": {
5
5
  "role": "backend-plugin-module",
6
6
  "pluginId": "scaffolder",
@@ -33,13 +33,6 @@
33
33
  },
34
34
  "main": "./dist/index.cjs.js",
35
35
  "types": "./dist/index.d.ts",
36
- "typesVersions": {
37
- "*": {
38
- "index": [
39
- "dist/index.d.ts"
40
- ]
41
- }
42
- },
43
36
  "files": [
44
37
  "dist"
45
38
  ],
@@ -53,11 +46,11 @@
53
46
  "test": "backstage-cli package test"
54
47
  },
55
48
  "dependencies": {
56
- "@backstage/backend-plugin-api": "1.2.1-next.1",
57
- "@backstage/config": "1.3.2",
58
- "@backstage/errors": "1.2.7",
59
- "@backstage/integration": "1.16.1",
60
- "@backstage/plugin-scaffolder-node": "0.7.1-next.1",
49
+ "@backstage/backend-plugin-api": "^1.2.1",
50
+ "@backstage/config": "^1.3.2",
51
+ "@backstage/errors": "^1.2.7",
52
+ "@backstage/integration": "^1.16.2",
53
+ "@backstage/plugin-scaffolder-node": "^0.8.0",
61
54
  "@gitbeaker/rest": "^41.2.0",
62
55
  "luxon": "^3.0.0",
63
56
  "winston": "^3.2.1",
@@ -65,9 +58,9 @@
65
58
  "zod": "^3.22.4"
66
59
  },
67
60
  "devDependencies": {
68
- "@backstage/backend-test-utils": "1.3.1-next.1",
69
- "@backstage/cli": "0.30.1-next.0",
70
- "@backstage/core-app-api": "1.15.5",
71
- "@backstage/plugin-scaffolder-node-test-utils": "0.1.20-next.1"
61
+ "@backstage/backend-test-utils": "^1.3.1",
62
+ "@backstage/cli": "^0.31.0",
63
+ "@backstage/core-app-api": "^1.16.0",
64
+ "@backstage/plugin-scaffolder-node-test-utils": "^0.2.0"
72
65
  }
73
66
  }