harness-migrate is a command line utility to help convert and migrate continuous integration pipelines from other providers to Harness CI. You can use this tool to migrate repositories following guidlines below.
Please review known conversion and migration issues before using this tool.
Migrating repositoires is a two-step process.
-
Export: Use
git-export
to export repositories with metadata from your current SCM provider. Guidlines for Bitbucket On-perm, GitHub, Gitlab, and Bitbucket. The exported data will be saved in a zip file. -
Import: Import the exported data into Harness CODE using
git-import
command as explained here.
The migrator is available as a Docker image with all required dependencies pre-installed. Follow these steps:
- Build and run the container:
docker build -t harness-migrator .
docker volume create migrator-data
docker run -it --name migrator -v migrator-data:/data harness-migrator
- Inside the container, run your export/import commands:
# Export example
migrator [SCM-Provider] git-export [flags]
# Import example
migrator git-import [flags]
Note: All data is stored in the Docker volume migrator-data
which persists even if you stop or remove the container. To clean up after you're done:
docker rm migrator
docker volume rm migrator-data
Intel CPU
curl -L https://github.com/harness/harness-migrate/releases/latest/download/harness-migrate-darwin-amd64.tar.gz | tar zx
Apple silicon (M1 or M2) CPU
curl -L https://github.com/harness/harness-migrate/releases/latest/download/harness-migrate-darwin-arm64.tar.gz | tar zx
Copy the binary into place
sudo cp harness-migrate /usr/local/bin
Verify the install
harness-migrate --help
$ git clone https://github.com/harness/harness-migrate.git
$ cd harness-migrate
$ go build
Convert a drone pipeline:
harness-migrate drone convert /path/to/.drone.yml
Export a github namespace from drone:
harness-migrate drone export \
--namespace example \
--github-token $GITHUB_TOKEN \
export.json
❗ To avoid pipelines triggering in both your Drone instance and in Harness CI, you must first deactivate the pipelines in your Drone instance.
This script uses jq and the Drone CLI to disable all pipelines defined in your export.json
:
#!/bin/bash
DRONE_NAMESPACE=$(jq -r .name export.json)
for REPO_NAME in $(jq -r .project[].name export.json); do
drone repo disable $DRONE_NAMESPACE/$REPO_NAME
done
Import a drone namespace:
harness-migrate drone import \
--harness-account $HARNESS_ACCOUNT \
--harness-org example \
--docker-connector account.harnessImage \
--github-token $GITHUB_TOKEN \
export.json
Convert a bitbucket pipeline:
harness-migrate bitbucket convert /path/to/bitbucket-pipelines.yml
Convert a circle pipeline:
harness-migrate circle convert /path/to/.circle/config.yml
Convert a github pipeline:
harness-migrate github convert /path/to/.github/workflows/main.yml
Convert a gitlab pipeline:
harness-migrate gitlab convert /path/to/.gitlab-ci.yml
Generate terraform configuration from an export, and apply it to your Harness account:
$ harness-migrate terraform \
--account $HARNESS_ACCOUNT \
--docker-connector account.harnessImage \
--org $HARNESS_ORG \
--repo-connector $HARNESS_REPO_CONNECTOR \
export.json \
output.tf
$ terraform init
$ terraform apply