Рубрики
Uncategorized

Мигрирующие репос из Атласского Stash для Azure Devops

Вот руководство по тому, как я помог клиенту перейти от внутреннего, On-Prem установки Atlassian STA … Помечено с атлассом, дежоптом, Git, PowerShell.

Вот руководство по тому, как я помог клиенту перейти от внутреннего, на премию установки Атласского Stash для Azure DEVOPS с использованием PowerShell и Azure CLI. Не уверены, если это полезно для других, но это может в свете последнего объявления Atlassians на Прекратите свои серверные продукты к началу 2024 года. Я не уверен, что система Stash является частью этого, но вот иначе поправка.

Чтобы использовать это, вам понадобится PowerShell, Git и Azure CLI. Кроме того, нужно добавить расширение Azure DEVOPS на Azure CLI

d:\repos>az extension add --name azure-devops

Далее вам нужно сделать, это войти в свою организацию Azure DevOps и генерировать личный токен доступа (PAT). Вы можете найти это здесь: https://dev.azure.com/{your_organization}/_usersSettings/tokens

d:\repos>az devops login
Token:

Вставить в PAT в подсказке «Токен», и вы вошли в DevOps через CLI.

Организация, с которой я работал, имел много проектов в Stash, с несколькими репозиториями в каждом проекте. Мне нужно только сделать это для одного проекта, поэтому не было необходимости делать это на более высоком уровне, но расширяя это, чтобы добавить функцию для обработки всех проектов в Stash, а затем добавить функцию для создания новых проектов в Azure DEVOPS Сопоставить проекты Stash должны быть незначительными изменениями. Кроме того, я не добавил никакой обработки ошибок, так что это все счастливый кодирующий путь Поэтому, если вы не уверены в вашей среде, вы, вероятно, должны добавить некоторую обработку ошибок и проверять код.

Моя первая функция предназначена для получения списка всех REPOS для проекта в Stash, используя встроенные в Stash API. Я не уверен, как это работает на разных версиях Stash, поэтому может потребоваться изменения, если у вас есть новые/старые версии. Кроме того, если у вас более 50 REPOS в проекте увеличивайте количество с предельным параметром в URL.

function GetStashReposForProject($user, $pass, $stashHost, $projectKey)
{
    $pair = "$($user):$($pass)"
    $encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))
    $basicAuthValue = "Basic $encodedCreds"
    $Headers = @{
        Authorization = $basicAuthValue
    }
    $uri = $stashHost + "/rest/api/1.0/projects/"+ $projectKey + "/repos?limit=50"
    $request = Invoke-WebRequest -Uri $uri -Headers $Headers
    $repos = $request.Content | ConvertFrom-Json
    return $repos.values
}

С помощью этого метода мы получим полную полезную нагрузку со всеми REPOS, перечисленными в рамках возвращаемой стоимости @ REPOS.Values.

Следующая функция клонирует stash Repo на рабочую станцию и устанавливает Stash $ Clone_uri в качестве пульты/начала по умолчанию. Функция создает папку для репо. Он основан на том, где вы выполняете код, поэтому убедитесь, что вы находятся на диске с достаточным количеством пространства и имеют чистую папку «root» для работы.

function CloneStashRepository($clone_url, $repo_name)
{
    mkdir $repo_name
    cd $repo_name
    $gitclone = "/c git clone " + $clone_url + " ."
    Start-Process cmd -Argument $gitclone -Wait
}

Далее нам нужна функция, которая проверяет все филиалы в репозитории, чтобы позже она может быть подтолкнута к DEVOPS.

function CheckoutAllBranches() 
{
    $branches = git branch --all
    foreach($branch in $branches)
    {
        if ($branch -like "*remotes/*") 
        {
            $branchName = $branch -replace "remotes/origin/" -replace ""
            $gitCheckout = "/c git checkout " + $branchName
            Start-Process cmd -Argument $gitCheckout -Wait
            Write-Host('checkedout branch: '+ $branchName )
       }
    }
}

Теперь, когда у меня есть все филиалы для репо, локально на моей машине, мне нужно выбрать, какой проект в Azure DevOps их следует оттолкнуть.

function SelectAzureDevOpsProject($devOpsOrg)
{
    $projects = $(az devops project list --org $devOpsOrg -o json) | ConvertFrom-Json

    $count = 1
    foreach($p in $projects.value)
    {
        Write-Host $count ") " $p.name
        $count++
    }
    $index = Read-Host "Chooose project (enter number)"
    #Write-Host "Selected inde is: " $index
    $sp = $projects.value[$index-1]
    $arr = @($sp.id, $sp.name)
    Write-Host "Selected Project name: " $arr[1]
    return $arr
}

Эта функция возвращает массив, который имеет GUID и имя проекта, который мы хотим использовать.

Небольшая функция обрабатывает создание нового репо в Azure DevOps

function CreateRepoInDevOpsProject($slug, $projectId, $devOpsOrg) 
{
    az repos create --name $slug --project $projectId --organization $devOpsOrg
}

Функция последней рабочей силы добавляет DEVOPS REPO в качестве дистанционного названия DEVOPS в локальном репозитории. Затем петли через все локальные ветви и подталкивает их к дистанционному репопсу.

function PushToDevops($orgPath, $project_name, $repo_name) 
{
    $projectName = [uri]::EscapeDataString($project_name)
    $slug = [uri]::EscapeDataString($repo_name)
    $remoteUrl = "https://$orgPath@dev.azure.com/$orgPath/$projectName/_git/$slug"
    $makeRemote = git remote add devops $remoteUrl

    $branches = git branch
    foreach($branch in $branches)
    {
        $gitCheckout = "/c git push devops " + $branch 
        Start-Process cmd -Argument $gitCheckout -Wait
        Write-Host('pushed branch: '+ $branch )
    }
}

Наконец, блок кода выполняется при выполнении файла PS1.

$user = Read-Host "Enter Stash Username"
$pass = Read-Host -AsSecureString "Enter Stash Password "
$stashHost = Read-Host "http://domain:port"
$projectKey = Read-Host "Enter stash project key"
$devOpsOrg = Read-Host "https://dev.azure.com/"
$orgUri = "https://dev.azure.com/" + $devOpsOrg

$selectedDevOpsProject = SelectAzureDevOpsProject $orgUri
$selectedDevOpsProjectId = $selectedDevOpsProject[0]
$selectedDevOpsProjectName = $selectedDevOpsProject[1]

foreach($repos in GetStashReposForProject $user $pass $stashHost $projectKey -Wait)
{
    $slug = $repos.slug
    CloneStashRepository $repos.cloneUrl $slug -Wait
    CheckoutAllBranches -Wait
    CreateRepoInDevOpsProject $slug $selectedDevOpsProjectId $orgUri -Wait
    PushToDevops $devOpsOrg $selectedDevOpsProjectName $slug -Wait
    #Jump out of working folder and back to root so the loop know where to start.
    cd ..
}
Write-Host "*********************************** IMPORT COMPLETE ***********************************"

Полный скрипт должен выглядеть что-то подобное. Вы можете скопировать код и сохранить его в файл PS1. Чтобы запустить его, вам, вероятно, нужно изменить свою политику выполнения или подписать сценарий.

function CheckoutAllBranches() 
{
    $branches = git branch --all
    foreach($branch in $branches)
    {
        if ($branch -like "*remotes/*") 
        {
            $branchName = $branch -replace "remotes/origin/" -replace ""
            $gitCheckout = "/c git checkout " + $branchName
            Start-Process cmd -Argument $gitCheckout -Wait
            Write-Host('checkedout branch: '+ $branchName )
       }
    }
}
function CloneStashRepository($clone_url, $repo_name)
{
    mkdir $repo_name
    cd $repo_name
    $gitclone = "/c git clone " + $clone_url + " ."
    Start-Process cmd -Argument $gitclone -Wait
}
function PushToDevops($orgPath, $project_name, $repo_name) 
{
    $projectName = [uri]::EscapeDataString($project_name)
    $slug = [uri]::EscapeDataString($repo_name)
    $remoteUrl = "https://$orgPath@dev.azure.com/$orgPath/$projectName/_git/$slug"
    $makeRemote = git remote add devops $remoteUrl
    $branches = git branch
    foreach($branch in $branches)
    {
        $gitCheckout = "/c git push devops " + $branch 
        Start-Process cmd -Argument $gitCheckout -Wait
        Write-Host('pushed branch: '+ $branch )
    }
}
function GetStashReposForProject($user, $pass, $stashHost, $projectKey)
{
    $pair = "$($user):$($pass)"
    $encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))
    $basicAuthValue = "Basic $encodedCreds"
    $Headers = @{
        Authorization = $basicAuthValue
    }
    $uri = $stashHost + "/rest/api/1.0/projects/"+ $projectKey + "/repos?limit=50"
    $request = Invoke-WebRequest -Uri $uri -Headers $Headers
    $repos = $request.Content | ConvertFrom-Json
    return $repos.values
}
function SelectAzureDevOpsProject($devOpsOrg)
{
    $projects = $(az devops project list --org $devOpsOrg -o json) | ConvertFrom-Json
    $count = 1
    foreach($p in $projects.value)
    {
        Write-Host $count ") " $p.name
        $count++
    }
    $index = Read-Host "Chooose project (enter number)"
    #Write-Host "Selected inde is: " $index
    $sp = $projects.value[$index-1]
    $arr = @($sp.id, $sp.name)
    Write-Host "Selected Project name: " $arr[1]
    return $arr
}
function CreateRepoInDevOpsProject($slug, $projectId, $devOpsOrg) 
{
    az repos create --name $slug --project $projectId --organization $devOpsOrg
}

$user = Read-Host "Enter Stash Username: "
$pass = Read-Host "Enter Stash Password: "
$stashHost = Read-Host "htp://domain:port"
$projectKey = Read-Host "Enter stash project key"
$devOpsOrg = Read-Host "https://dev.azure.com/"
$orgUri = "https://dev.azure.com/" + $devOpsOrg
$selectedDevOpsProject = SelectAzureDevOpsProject $orgUri
$selectedDevOpsProjectId = $selectedDevOpsProject[0]
$selectedDevOpsProjectName = $selectedDevOpsProject[1]
foreach($repos in GetStashReposForProject $user $pass $stashHost $projectKey -Wait)
{
    $slug = $repos.slug
    CloneStashRepository $repos.cloneUrl $slug -Wait
    CheckoutAllBranches -Wait
    CreateRepoInDevOpsProject $slug $selectedDevOpsProjectId $orgUri -Wait
    PushToDevops $devOpsOrg $selectedDevOpsProjectName $slug -Wait
    #Jump out of working folder and back to root so the loop know where to start.
    cd ..
}
Write-Host "*********************************** IMPORT COMPLETE ***********************************"

Отказ от ответственности

Все код здесь предоставляется как есть. Я несу никакой ответственности за любой ущерб, который может возникнуть, экономические и технические, если вы решите его использовать. Добавьте проверку и обработку ошибок, если вы планируете использовать это в автоматизации.

Оригинал: «https://dev.to/megatherion/migrating-repos-from-atlassian-stash-to-azure-devops-2006»