Module/Include/DevOpsHelper.ps1
function Get-DevOpsActivityOrganisation { param ( [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$Organisation, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)] [string]$Project, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)] [string]$Repository, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)] [string]$PATToken ) $Projects = GetProjectsInOrganisation -Organisation $Organisation -PATToken $PATToken $Output = @() $Current = 0; foreach ($nProject in $Projects) { $Current += 1 $Done = ($Current / $Projects.Count) * 100 $Done = ([Math]::Round($Done, 0)) if ($Project -ne '') { if ($nProject.name -ne $Project) { continue; } } $Repositories = GetRepositorysForProject -Organisation $Organisation -Project $nProject.name -PATToken $PATToken Write-Progress -Activity ("Collecting commit activity for Organisation {0}" -f $Organisation) -Status "$Done% Complete:" -PercentComplete $Done foreach ($nRepository in $Repositories) { if ($Repository -ne '') { if ($nRepository.name -ne $Repositoriy) { continue; } } $Commits = GetCommitsFromRepository -Organisation $Organisation -Project $nProject.name -RepositoryId $nRepository.id -PATToken $PATToken $Commit = $Commits | Select-Object -First 1 $CommitCount = $Commits | Measure-Object -Maximum $item = New-Object PSObject $item | Add-Member -type NoteProperty -Name 'Project' -Value $nProject.name; $item | Add-Member -type NoteProperty -Name 'Repository' -Value $nRepository.name; $item | Add-Member -type NoteProperty -Name 'Id' -Value $commit.Id; $item | Add-Member -type NoteProperty -Name 'Author' -Value $Commit.Author; $item | Add-Member -type NoteProperty -Name 'Date' -Value $Commit.Date; $item | Add-Member -type NoteProperty -Name 'CommitCount' -Value $CommitCount.Count; if (-not $Commit.Id -eq '') { $Output += $item } Write-Progress -Activity ("Collecting commit activity for Organisation {0}" -f $Organisation) -Status "$Done% Complete:" -PercentComplete $Done } } $Output } function GetProjectsInOrganisation { param ( [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$Organisation, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)] [string]$PATToken ) $Header = Get-BasicAuthHeader -userName 'mathias@brightcom.se' -PATToken $PATToken $Parameters = @{ Method = "GET" Uri = "https://dev.azure.com/$Organisation/_apis/projects?api-version=6.0" Headers = $Header ContentType = "application/json" Body = $BodyJson } $results = Invoke-RestMethod @Parameters $value = $results | Select-Object -Property value | ConvertTo-Json $projects = $value | ConvertFrom-Json | Select-Object -Property value -ExpandProperty value return($projects) #$value = $results | Select-Object -Property value | ConvertTo-Json #$projects = $value | ConvertFrom-Json | Select-Object -Property value -ExpandProperty value #$projects | Select-Object -Property name, id | Sort-Object -Property lastUpdateTime -Descending } function GetRepositorysForProject { param ( [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$Organisation, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$Project, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)] [string]$Repository, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)] [string]$PATToken ) $Header = Get-BasicAuthHeader -userName 'mathias@brightcom.se' -PATToken $PATToken $Parameters = @{ Method = "GET" Uri = "https://dev.azure.com/$Organisation/$Project/_apis/git/repositories?api-version=6.1-preview.1" Headers = $Header ContentType = "application/json" Body = $BodyJson } $results = Invoke-RestMethod @Parameters $value = $results | Select-Object -Property value | ConvertTo-Json $repos = $value | ConvertFrom-Json | Select-Object -Property value -ExpandProperty value return($repos) } function GetCommitsFromRepository { Param ( [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$Organisation, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$Project, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$RepositoryId, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)] [string]$PATToken ) $Header = Get-BasicAuthHeader -userName 'mathias@brightcom.se' -PATToken $PATToken $Parameters = @{ Method = "GET" Uri = "https://dev.azure.com/$Organisation/$Project/_apis/git/repositories/$RepositoryId/commits?api-version=6.1-preview.1" Headers = $Header ContentType = "application/json" Body = $BodyJson } $commits = @() $results = Invoke-RestMethod @Parameters $value = $results | Select-Object -Property value | ConvertTo-Json $repoCommits = $value | ConvertFrom-Json | Select-Object -Property value -ExpandProperty value foreach ($commit in $repoCommits) { $commitdata = $commit.author | ConvertFrom-String -Delimiter ';' $commitauthor = $commitdata.P1 | ConvertFrom-String -Delimiter '=' $commitauthor = $commitauthor.P2.TrimStart('@{'); $commitdate = $commitdata.P3 | ConvertFrom-String -Delimiter '=' $commitdate = $commitdate.P2.TrimEnd('}') $commitdate = [DateTime]$commitdate $commitdate = $commitdate.ToShortDateString() $item = New-Object PSObject $item | Add-Member -type NoteProperty -Name 'Project' -Value $Project; $item | Add-Member -type NoteProperty -Name 'RepositoryId' -Value $RepositoryId; $item | Add-Member -type NoteProperty -Name 'Id' -Value $commit.commitId; $item | Add-Member -type NoteProperty -Name 'Author' -Value $commitauthor; $item | Add-Member -type NoteProperty -Name 'Date' -Value $commitdate; $item | Add-Member -type NoteProperty -Name 'Comment' -Value $commit.comment; $commits += $item } return($commits); } function Get-ProjectServiceEndpoints { param ( [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$Organisation, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$Project, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$PATToken ) $Header = Get-BasicAuthHeader -userName 'mathias@brightcom.se' -PATToken $PATToken $Parameters = @{ Method = "GET" Uri = "https://dev.azure.com/$Organisation/$Project/_apis/serviceendpoint/endpoints?api-version=6.0-preview.4" Headers = $Header ContentType = "application/json" Body = $BodyJson } $results = Invoke-RestMethod @Parameters $value = $results | Select-Object -Property value | ConvertTo-Json $result = $value | ConvertFrom-Json | Select-Object -Property value -ExpandProperty value return($result) } function New-ProjectGitHubServiceEndpoint { param ( [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$Organisation, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$Project, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$PATToken ) $Header = Get-BasicAuthHeader -userName 'mathias@brightcom.se' -PATToken $PATToken $ProjectInfo = GetProjectsInOrganisation -Organisation 'BrightComSolutions' -PATToken $PATToken | Where-Object name -eq 'Gardenstore' $BodyJson = @' { "data": {}, "name": "github.com_BrightCom-dev", "type": "GitHub", "url": "https://github.com", "authorization": { "parameters": { "AccessToken": "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" }, "scheme": "Token" }, "isShared": false, "isReady": true, "serviceEndpointProjectReferences": [ { "projectReference": { "id": "", "name": "" }, "name": "github.com_BrightCom-dev" } ] } '@ $BodyJson = $BodyJson | ConvertFrom-Json $BodyJson.serviceEndpointProjectReferences[0].projectReference[0].id = $ProjectInfo.id $BodyJson.serviceEndpointProjectReferences[0].projectReference[0].name = $ProjectInfo.name $BodyJson = $BodyJson | ConvertTo-Json -Depth 3 #send the mail through Sendgrid $Parameters = @{ Method = "POST" Uri = "https://dev.azure.com/$Organisation/$Project/_apis/serviceendpoint/endpoints?api-version=6.0-preview.4" Headers = $Header ContentType = "application/json" Body = $BodyJson } $results = Invoke-RestMethod @Parameters $value = $results | Select-Object -Property value | ConvertTo-Json $result = $value | ConvertFrom-Json | Select-Object -Property value -ExpandProperty value return($result) } function New-DevOpsWorkItemTask { param ( [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$Organisation, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$Project, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$Title, [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)] [string]$PATToken ) $Header = Get-BasicAuthHeader -userName 'mathias@brightcom.se' -PATToken $PATToken $BodyJson = @" [ { "op": "add", "path": "/fields/System.Title", "from": null, "value": "$Title" }, { "op": "add", "path": "/fields/System.State", "from": null, "value": "New" }, { "op": "add", "path": "/fields/System.AssignedTo", "from": null, "value": "mathias@brightcom.se" }, { "op": "add", "path": "/fields/System.AreaPath", "from": null, "value": "BrightCom Solutions\\BCS Infrastructure" }, { "op": "add", "path": "/relations/-", "value": { "rel": "System.LinkTypes.Hierarchy-Reverse", "url": "https://dev.azure.com/fabrikam/_apis/wit/workItems/598", "attributes": { "comment": "Making a new link for the dependency" } } } ] "@ $Uri = ('https://dev.azure.com/{0}/{1}/_apis/wit/workitems/$Task?api-version=5.0' -f $Organisation, $Project) $Parameters = @{ Method = "POST" Uri = $Uri Headers = $Header ContentType = "application/json-patch+json" Body = $BodyJson } $results = Invoke-RestMethod @Parameters return($results) } |