GitLab Project Migration

Action ID: gitlab:group:migrate
NPM Package:

@backstage/plugin-scaffolder-backend-module-gitlab

Description

Migrates a project from one GitLab instance to another using specified access tokens and URLs.

Input Schema

PropertyTypeDescriptionRequired
sourceUrlstring-
destinationUrlstring-
sourceFullPathstringFull path to the project in the source Gitlab instance
sourceAccessTokenstring-
destinationAccessTokenstring-

Output Schema

PropertyTypeDescriptionRequired
migrationIdnumberId of the migration that imports the project
importedRepoUrlstringURL to the newly imported repo

Usage Examples

Migrate from a self-managed GitLab to GitLab.com and register in the catalog

Moves an existing project from an internal GitLab instance to GitLab.com. After import, it registers the repository’s catalog-info.yaml using catalog:register.

Copy
steps:
  - id: migrate-to-gitlab-com
    action: gitlab:group:migrate
    input:
      destinationAccessToken: ${{ parameters.gitlabComToken }}
      destinationUrl: https://gitlab.com
      sourceAccessToken: ${{ parameters.internalGitlabToken }}
      sourceFullPath: platform/payments/api-service
      sourceUrl: https://gitlab.internal.acme.com

  - id: register-in-catalog
    action: catalog:register
    input:
      catalogInfoUrl: ${{ steps.migrate-to-gitlab-com.output.importedRepoUrl }}/-/blob/main/catalog-info.yaml

Migrate a project between groups within the same GitLab instance

Uses the same GitLab host for source and destination to move a project from a legacy group to a new group. After import, it registers the develop branch catalog descriptor with catalog:register.

Copy
steps:
  - id: migrate-within-instance
    action: gitlab:group:migrate
    input:
      destinationAccessToken: ${{ parameters.instanceAdminToken }}
      destinationUrl: https://gitlab.internal.acme.com
      sourceAccessToken: ${{ parameters.legacyMaintainerToken }}
      sourceFullPath: legacy-group/subgroup/service-a
      sourceUrl: https://gitlab.internal.acme.com

  - id: register-develop
    action: catalog:register
    input:
      catalogInfoUrl: ${{ steps.migrate-within-instance.output.importedRepoUrl }}/-/blob/develop/catalog-info.yaml

Migrate from GitLab.com to an on-prem staging environment

Imports a GitLab.com project into an on-prem GitLab instance on a nonstandard port. After import, it registers the catalog file using catalog:register.

Copy
steps:
  - id: migrate-to-staging
    action: gitlab:group:migrate
    input:
      destinationAccessToken: ${{ parameters.stagingGitlabToken }}
      destinationUrl: https://gitlab.staging.acme.net:8443
      sourceAccessToken: ${{ parameters.gitlabComToken }}
      sourceFullPath: acme-labs/experiments/feature-flags
      sourceUrl: https://gitlab.com

  - id: register-staging
    action: catalog:register
    input:
      catalogInfoUrl: ${{ steps.migrate-to-staging.output.importedRepoUrl }}/-/blob/main/catalog-info.yaml

Runs the migration action twice to move two repositories as part of a coordinated migration. Each imported repository is then registered with catalog:register.

Copy
steps:
  - id: migrate-orders
    action: gitlab:group:migrate
    input:
      destinationAccessToken: ${{ parameters.destToken }}
      destinationUrl: https://gitlab.com
      sourceAccessToken: ${{ parameters.srcToken }}
      sourceFullPath: commerce/legacy/orders-service
      sourceUrl: https://gitlab.internal.acme.com

  - id: register-orders
    action: catalog:register
    input:
      catalogInfoUrl: ${{ steps.migrate-orders.output.importedRepoUrl }}/-/blob/main/catalog-info.yaml

  - id: migrate-inventory
    action: gitlab:group:migrate
    input:
      destinationAccessToken: ${{ parameters.destToken }}
      destinationUrl: https://gitlab.com
      sourceAccessToken: ${{ parameters.srcToken }}
      sourceFullPath: commerce/legacy/inventory-service
      sourceUrl: https://gitlab.internal.acme.com

  - id: register-inventory
    action: catalog:register
    input:
      catalogInfoUrl: ${{ steps.migrate-inventory.output.importedRepoUrl }}/-/blob/main/catalog-info.yaml

Fully parameterized migration with dynamic source path

Collects all values from template parameters and builds the source path from a group and repo name. After migration, it registers the imported repository using catalog:register.

Copy
steps:
  - id: migrate-dynamic
    action: gitlab:group:migrate
    input:
      destinationAccessToken: ${{ parameters.destinationToken }}
      destinationUrl: ${{ parameters.destinationUrl }}
      sourceAccessToken: ${{ parameters.sourceToken }}
      sourceFullPath: ${{ parameters.sourceGroup }}/${{ parameters.repoName }}
      sourceUrl: ${{ parameters.sourceUrl }}

  - id: register-dynamic
    action: catalog:register
    input:
      catalogInfoUrl: ${{ steps.migrate-dynamic.output.importedRepoUrl }}/-/blob/${{ parameters.defaultBranch || 'main' }}/catalog-info.yaml