Azure DevOps API를 사용하여 작업 항목 유형 복사

5319 단어
우리 모두는 ADO(Azure DevOps)에서 참여를 관리하는 방법을 좋아합니다. 에픽, 기능, 사용자 스토리를 만들고 Kanban 보드에서 진행 상황을 추적할 수 있습니다. 비즈니스 및 프로젝트의 요구 사항에 맞게 작업 항목 유형을 쉽게 사용자 지정할 수 있습니다. 생성한 작업 항목 유형을 복사하여 다른 비즈니스 사례에 사용하려면 어떻게 해야 합니까? 기존 작업 항목을 새 작업 항목 유형으로 복사하는 방법은 없습니다. 몇 개의 필드만 있는 경우 큰 문제가 되지 않지만 여러 페이지, 페이지의 여러 그룹 및 그룹의 여러 필드가 있는 경우 기념비적인 작업이 됩니다.

이 기사에서는 Azure DevOPs API를 사용하여 작업 항목을 복사하는 방법을 설명합니다. 설명서에는 새 프로세스 추가, 작업 항목 유형 추가, 그룹 추가 등의 기본 사항을 수행하는 방법이 나와 있지만 몇 가지 누락된 사항이 있습니다.

이것이 코드가 구성되는 방식입니다. 코드에 들어가기 전에 흐름을 이해하는 것이 좋을 것이라고 생각했습니다.

새 작업 항목 유형 만들기
대상 작업 항목 유형을 반복하고 누락된 페이지를 추가하여 새 작업 항목 유형에 대한 페이지를 만듭니다.
새 작업 항목 유형에 대한 단계 만들기
작업 항목에서 복사되지 않은 기본 단계 제거
대상 작업 항목 유형의 각 페이지를 반복합니다.
각 페이지의 각 섹션을 반복합니다.
각 섹션의 각 그룹을 통해 반복
각 그룹의 각 컨트롤을 통해 반복
새 작업 항목 유형에 필드 추가(컨트롤은 내가 본 필드 중 1개만 보유함)
주어진 섹션에 그룹 추가
지정된 그룹에 컨트롤 추가
새 작업 항목 유형이 생성되면 복사 중인 작업 항목에서 단계를 추가해야 합니다. 이렇게 하면 작업 항목 대상에서 추가된 상태와 함께 기본 작업 항목 유형이 제공됩니다. 기본적으로 작업 항목 유형이 생성되면 한 페이지와 네 개의 섹션이 있습니다. 왼쪽에서 오른쪽으로 처음 세 섹션은 페이지의 세 열을 반영합니다. 나는 아직 네 번째 섹션이 무엇인지 파악하지 못했습니다. 작업 항목 유형을 추가하면 필드를 더 쉽게 추가할 수 있습니다. 레이아웃의 각 페이지를 반복하고 필드를 추가하기만 하면 됩니다.

해결해야 할 문서화되지 않은 몇 가지 퍼즐 조각과 특별한 주의가 필요한 몇 가지 필드 유형이 있습니다. 기본적으로 System.Description 필드는 작업 항목 생성 페이지에 추가됩니다. 어떤 이유로 해당 필드의 이름을 변경한 경우 이 필드를 다른 필드와 다르게 처리해야 합니다. 설명 필드는 첫 번째 섹션의 첫 번째 그룹으로 표시됩니다. 이것은 가장 큰 계시이자 가장 발견하기 어려운 계시였습니다. 그 이유는 UI를 볼 때 설명 필드에 그룹이 없기 때문입니다. 따라서 여기서 진짜 문제는 여러 줄 텍스트 상자(HTML)라는 것입니다.

페이지의 다른 곳에 있는 여러 줄 텍스트 상자는 어떻습니까? 다시 말하지만, 모든 것이 그룹에 있어야 하지만 이 필드는 UI에서 볼 때 그룹에 있지 않습니다. 그래서 몇 시간 동안 fiddler 트래픽을 파헤친 후 여러 줄 텍스트 필드와 관련하여 문서화되지 않은 것을 찾을 수 있었습니다. 그룹을 만들고 여러 줄 필드를 그룹의 컨트롤로 추가해야 합니다. 이것은 내가 놓친 퍼즐의 piece이었습니다. 여러 줄 필드가 페이지에 배치되었을 때 전송된 요청을 찾았고 그들이 어디로 가고 있는지 파악할 수 있었습니다. 이제 그룹 추가에 대한 문서는 컨트롤이 요청의 일부가 될 수 있음을 보여주지만 여러 줄 텍스트 필드가 특별한 경우임을 지정하지는 않습니다.

그런 다음 이 코드 블록의 끝에 표시된 대로 API를 사용하여 그룹을 추가하기만 하면 됩니다.

# multi line text fields cannot be inside a group. they are their own group on the UI
if($grp.controls[0].controlType -eq "HtmlFieldControl")
{
    isMultiLine = $true
    # first add the field to the work item
    $addCtl = @{
       referenceName = $grp.controls[0].id
       order = "$null"
       readOnly = "$false"
       label = $grp.label.Trim()
       visible = "$true"

   # must encapsulate true false in quotes to register
   defaultValue = if($fld.type -eq "boolean")
                    {"$false"}
                    else {""}
   required = if($fld.type -eq "boolean")
                 {"$true"} 
                 else {"$false"} 
 $ctlJSON = ConvertTo-Json -InputObject $addCtl

 # add field to work item type
 # https://docs.microsoft.com/en-us/rest/api/azure/devops/processes/fields/add?view=azure-devops-rest-7.1
 # POST https://dev.azure.com/{organization}/_apis/work/processes/{processId}/workItemTypes/{witRefName}/fields?api-version=7.1-preview.2
 $field = $null
 $fieldURL = $userParams.HTTP_preFix + "://dev.azure.com/" + $userParams.VSTSMasterAcct + "/_apis/work/processes/" + $proc.typeId  + "/workitemTypes/" + $newWKItem.referenceName + "/fields?api-version=7.1-preview.2"
 $field = Invoke-RestMethod -Uri $fieldURL -Method Post -ContentType "application/json" -Headers $authorization -Body $ctlJSON
 Write-Host $field

# now add the Multi line field to the page in a group with no name 
$addGroup = @{
          Contribution = "$null"    
          height = "$null"
          id = "$null"
          inherited = "$null"
          isContribution = "$false"
          label = $grp.label.Trim()
          visible = "$true"
          order = "$null"
          overridden = "$null"
               controls = @( @{
                   contribution = "$null"
                   controlType = "$null"
                   height = "$null"
                   id = $grp.controls[0].id
                   inherited = "$null"
                   isContribution = "$false"
                   label = $grp.controls[0].label.Trim()
                   metadata = "$null"
                   order = "$null"
                   overridden = "$null"
                   visible = "$true"
                   watermark = "$null"
               })

    }
    $grpJSON = ConvertTo-Json -InputObject $addGroup
    # POST https://dev.azure.com/{organization}/_apis/work/processes/{processId}/workItemTypes/{witRefName}/layout/pages/{pageId}/sections/{sectionId}/groups?api-version=7.1-preview.1
    $groupURL = $userParams.HTTP_preFix + "://dev.azure.com/" + $userParams.VSTSMasterAcct + "/_apis/work/processes/" + $proc.typeId  + "/workitemtypes/" + $newWKItem.referenceName + "/layout/pages/" + $pgExists.id + "/sections/" + $newSection.id + "/groups?api-version=7.1-preview.1"   
    $group = Invoke-RestMethod -Uri $groupURL -Method Post -ContentType "application/json" -Headers $authorization -Body $grpJSON
    Write-Host "Multi line field " $group
    $newGrp = $group  
}

좋은 웹페이지 즐겨찾기