From 572e346b1cead6c8d235a2a0f342fdcd6fe6c8e9 Mon Sep 17 00:00:00 2001 From: Dmitry Shibanov Date: Tue, 2 Jun 2020 18:23:40 +0300 Subject: [PATCH] Add helpers' submodule (#26) * add common helpers Co-authored-by: Dmitry Shibanov --- .gitmodules | 4 + azure-pipelines/templates/test-job.yml | 2 +- config/python-manifest-config.json | 8 ++ helpers | 1 + helpers/azure-devops/azure-devops-api.ps1 | 89 ------------ helpers/azure-devops/build-info.ps1 | 44 ------ helpers/azure-devops/run-ci-builds.ps1 | 94 ------------- helpers/common-helpers.psm1 | 80 ----------- helpers/generate-versions-manifest.ps1 | 158 ---------------------- helpers/github/create-pull-request.ps1 | 106 --------------- helpers/github/git.psm1 | 81 ----------- helpers/github/github-api.psm1 | 109 --------------- helpers/nix-helpers.psm1 | 50 ------- helpers/pester-extensions.psm1 | 33 ----- helpers/win-helpers.psm1 | 18 --- 15 files changed, 14 insertions(+), 863 deletions(-) create mode 100644 .gitmodules create mode 100644 config/python-manifest-config.json create mode 160000 helpers delete mode 100644 helpers/azure-devops/azure-devops-api.ps1 delete mode 100644 helpers/azure-devops/build-info.ps1 delete mode 100644 helpers/azure-devops/run-ci-builds.ps1 delete mode 100644 helpers/common-helpers.psm1 delete mode 100644 helpers/generate-versions-manifest.ps1 delete mode 100644 helpers/github/create-pull-request.ps1 delete mode 100644 helpers/github/git.psm1 delete mode 100644 helpers/github/github-api.psm1 delete mode 100644 helpers/nix-helpers.psm1 delete mode 100644 helpers/pester-extensions.psm1 delete mode 100644 helpers/win-helpers.psm1 diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..b343909 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "helpers"] + path = helpers + url = https://github.com/actions/versions-package-tools + branch = master diff --git a/azure-pipelines/templates/test-job.yml b/azure-pipelines/templates/test-job.yml index f3a1074..5f13b42 100644 --- a/azure-pipelines/templates/test-job.yml +++ b/azure-pipelines/templates/test-job.yml @@ -57,7 +57,7 @@ jobs: inputs: TargetType: inline script: | - Install-Module Pester -Force -Scope CurrentUser + Install-Module Pester -Force -Scope CurrentUser -RequiredVersion 4.10.1 Import-Module Pester $pesterParams = @{ Path="./python-tests.ps1"; diff --git a/config/python-manifest-config.json b/config/python-manifest-config.json new file mode 100644 index 0000000..daa5781 --- /dev/null +++ b/config/python-manifest-config.json @@ -0,0 +1,8 @@ +{ + "regex": "python-\\d+\\.\\d+\\.\\d+-(\\w+)-([\\w\\.]+)?-?(x\\d+)", + "groups": { + "arch": 3, + "platform": 1, + "platform_version": 2 + } +} \ No newline at end of file diff --git a/helpers b/helpers new file mode 160000 index 0000000..d8c3ce7 --- /dev/null +++ b/helpers @@ -0,0 +1 @@ +Subproject commit d8c3ce72eebad99e5377a15501ae2135ee4b2427 diff --git a/helpers/azure-devops/azure-devops-api.ps1 b/helpers/azure-devops/azure-devops-api.ps1 deleted file mode 100644 index dd2feba..0000000 --- a/helpers/azure-devops/azure-devops-api.ps1 +++ /dev/null @@ -1,89 +0,0 @@ -class AzureDevOpsApi -{ - [string] $BaseUrl - [string] $RepoOwner - [object] $AuthHeader - - AzureDevOpsApi( - [string] $TeamFoundationCollectionUri, - [string] $ProjectName, - [string] $AccessToken - ) { - $this.BaseUrl = $this.BuildBaseUrl($TeamFoundationCollectionUri, $ProjectName) - $this.AuthHeader = $this.BuildAuth($AccessToken) - } - - [object] hidden BuildAuth([string]$AccessToken) { - if ([string]::IsNullOrEmpty($AccessToken)) { - return $null - } - return @{ - Authorization = "Bearer $AccessToken" - } - } - - [string] hidden BuildBaseUrl([string]$TeamFoundationCollectionUri, [string]$ProjectName) { - return "${TeamFoundationCollectionUri}/${ProjectName}/_apis" - } - - [object] QueueBuild([string]$ToolVersion, [string]$SourceBranch, [string]$SourceVersion, [UInt32]$DefinitionId){ - $url = "build/builds" - - # The content of parameters field should be a json string - $buildParameters = @{ VERSION = $ToolVersion } | ConvertTo-Json - - $body = @{ - definition = @{ - id = $DefinitionId - } - sourceBranch = $SourceBranch - sourceVersion = $SourceVersion - parameters = $buildParameters - } | ConvertTo-Json - - return $this.InvokeRestMethod($url, 'POST', $body) - } - - [object] GetBuildInfo([UInt32]$BuildId){ - $url = "build/builds/$BuildId" - - return $this.InvokeRestMethod($url, 'GET', $null) - } - - [string] hidden BuildUrl([string]$Url) { - return "$($this.BaseUrl)/${Url}/?api-version=5.1" - } - - [object] hidden InvokeRestMethod( - [string] $Url, - [string] $Method, - [string] $Body - ) { - $requestUrl = $this.BuildUrl($Url) - $params = @{ - Method = $Method - ContentType = "application/json" - Uri = $requestUrl - Headers = @{} - } - if ($this.AuthHeader) { - $params.Headers += $this.AuthHeader - } - if (![string]::IsNullOrEmpty($body)) { - $params.Body = $Body - } - - return Invoke-RestMethod @params - } - -} - -function Get-AzureDevOpsApi { - param ( - [string] $TeamFoundationCollectionUri, - [string] $ProjectName, - [string] $AccessToken - ) - - return [AzureDevOpsApi]::New($TeamFoundationCollectionUri, $ProjectName, $AccessToken) -} \ No newline at end of file diff --git a/helpers/azure-devops/build-info.ps1 b/helpers/azure-devops/build-info.ps1 deleted file mode 100644 index 9622d8c..0000000 --- a/helpers/azure-devops/build-info.ps1 +++ /dev/null @@ -1,44 +0,0 @@ -Import-Module (Join-Path $PSScriptRoot "azure-devops-api.ps1") - -class BuildInfo -{ - [AzureDevOpsApi] $AzureDevOpsApi - [String] $Name - [UInt32] $Id - [String] $Status - [String] $Result - [String] $Link - - BuildInfo([AzureDevOpsApi] $AzureDevOpsApi, [object] $Build) - { - $this.AzureDevOpsApi = $AzureDevOpsApi - $this.Id = $Build.id - $this.Name = $Build.buildNumber - $this.Link = $Build._links.web.href - $this.Status = $Build.status - $this.Result = $Build.result - } - - [boolean] IsFinished() { - return ($this.Status -eq "completed") -or ($this.Status -eq "cancelling") - } - - [boolean] IsSuccess() { - return $this.Result -eq "succeeded" - } - - [void] UpdateBuildInfo() { - $buildInfo = $this.AzureDevOpsApi.GetBuildInfo($this.Id) - $this.Status = $buildInfo.status - $this.Result = $buildInfo.result - } -} - -function Get-BuildInfo { - param ( - [AzureDevOpsApi] $AzureDevOpsApi, - [object] $Build - ) - - return [BuildInfo]::New($AzureDevOpsApi, $Build) -} \ No newline at end of file diff --git a/helpers/azure-devops/run-ci-builds.ps1 b/helpers/azure-devops/run-ci-builds.ps1 deleted file mode 100644 index bf11295..0000000 --- a/helpers/azure-devops/run-ci-builds.ps1 +++ /dev/null @@ -1,94 +0,0 @@ -param ( - [Parameter(Mandatory)] [string] $TeamFoundationCollectionUri, - [Parameter(Mandatory)] [string] $AzureDevOpsProjectName, - [Parameter(Mandatory)] [string] $AzureDevOpsAccessToken, - [Parameter(Mandatory)] [string] $SourceBranch, - [Parameter(Mandatory)] [string] $ToolVersions, - [Parameter(Mandatory)] [UInt32] $DefinitionId, - [string] $SourceVersion -) - -Import-Module (Join-Path $PSScriptRoot "azure-devops-api.ps1") -Import-Module (Join-Path $PSScriptRoot "build-info.ps1") - -function Queue-Builds { - param ( - [Parameter(Mandatory)] [AzureDevOpsApi] $AzureDevOpsApi, - [Parameter(Mandatory)] [string] $ToolVersions, - [Parameter(Mandatory)] [string] $SourceBranch, - [Parameter(Mandatory)] [string] $SourceVersion, - [Parameter(Mandatory)] [string] $DefinitionId - ) - - [BuildInfo[]]$queuedBuilds = @() - - $ToolVersions.Split(',') | ForEach-Object { - $version = $_.Trim() - Write-Host "Queue build for $version..." - $queuedBuild = $AzureDevOpsApi.QueueBuild($version, $SourceBranch, $SourceVersion, $DefinitionId) - $buildInfo = Get-BuildInfo -AzureDevOpsApi $AzureDevOpsApi -Build $queuedBuild - Write-Host "Queued build: $($buildInfo.Link)" - $queuedBuilds += $buildInfo - } - - return $queuedBuilds -} - -function Wait-Builds { - param ( - [Parameter(Mandatory)] [BuildInfo[]] $Builds - ) - - $timeoutBetweenRefreshSec = 30 - - do { - # If build is still running - refresh its status - foreach($build in $builds) { - if (!$build.IsFinished()) { - $build.UpdateBuildInfo() - - if ($build.IsFinished()) { - Write-Host "The $($build.Name) build was completed: $($build.Link)" - } - } - } - - $runningBuildsCount = ($builds | Where-Object { !$_.IsFinished() }).Length - - Start-Sleep -Seconds $timeoutBetweenRefreshSec - } while($runningBuildsCount -gt 0) -} - -function Make-BuildsOutput { - param ( - [Parameter(Mandatory)] [BuildInfo[]] $Builds - ) - - Write-Host "Builds info:" - $builds | Format-Table -AutoSize -Property Name,Id,Status,Result,Link | Out-String -Width 10000 - - # Return exit code based on status of builds - $failedBuilds = ($builds | Where-Object { !$_.IsSuccess() }) - if ($failedBuilds.Length -ne 0) { - Write-Host "##vso[task.logissue type=error;]Builds failed" - $failedBuilds | ForEach-Object -Process { Write-Host "##vso[task.logissue type=error;]Name: $($_.Name); Link: $($_.Link)" } - Write-Host "##vso[task.complete result=Failed]" - } else { - Write-host "##[section] All builds have been passed successfully" - } -} - -$azureDevOpsApi = Get-AzureDevOpsApi -TeamFoundationCollectionUri $TeamFoundationCollectionUri ` - -ProjectName $AzureDevOpsProjectName ` - -AccessToken $AzureDevOpsAccessToken - -$queuedBuilds = Queue-Builds -AzureDevOpsApi $azureDevOpsApi ` - -ToolVersions $ToolVersions ` - -SourceBranch $SourceBranch ` - -SourceVersion $SourceVersion ` - -DefinitionId $DefinitionId - -Write-Host "Waiting results of builds ..." -Wait-Builds -Builds $queuedBuilds - -Make-BuildsOutput -Builds $queuedBuilds diff --git a/helpers/common-helpers.psm1 b/helpers/common-helpers.psm1 deleted file mode 100644 index 8de58a7..0000000 --- a/helpers/common-helpers.psm1 +++ /dev/null @@ -1,80 +0,0 @@ -<# -.SYNOPSIS -The execute command and print all output to the logs -#> -function Execute-Command { - [CmdletBinding()] - param( - [Parameter(Mandatory=$true)][string] $Command - ) - - Write-Debug "Execute $Command" - - try { - Invoke-Expression $Command | ForEach-Object { Write-Host $_ } - } - catch { - Write-Host "Error happened during command execution: $Command" - Write-Host "##vso[task.logissue type=error;] $_" - } -} - -<# -.SYNOPSIS -Download file from url and return local path to file -#> -function Download-File { - param( - [Parameter(Mandatory=$true)] - [Uri]$Uri, - [Parameter(Mandatory=$true)] - [String]$OutputFolder - ) - - $targetFilename = [IO.Path]::GetFileName($Uri) - $targetFilepath = Join-Path $OutputFolder $targetFilename - - Write-Debug "Download source from $Uri to $OutFile" - try { - (New-Object System.Net.WebClient).DownloadFile($Uri, $targetFilepath) - return $targetFilepath - } catch { - Write-Host "Error during downloading file from '$Uri'" - "$_" - exit 1 - } -} - -<# -.SYNOPSIS -Generate file that contains the list of all files in particular directory -#> -function New-ToolStructureDump { - param( - [Parameter(Mandatory=$true)] - [String]$ToolPath, - [Parameter(Mandatory=$true)] - [String]$OutputFolder - ) - - $outputFile = Join-Path $OutputFolder "tools_structure.txt" - - $folderContent = Get-ChildItem -Path $ToolPath -Recurse | Sort-Object | Select-Object -Property FullName, Length - $folderContent | ForEach-Object { - $relativePath = $_.FullName.Replace($ToolPath, ""); - return "${relativePath}" - } | Out-File -FilePath $outputFile -} - -<# -.SYNOPSIS -Check if it is macOS / Ubuntu platform -#> -function IsNixPlatform { - param( - [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] - [String]$Platform - ) - - return ($Platform -match "macos") -or ($Platform -match "ubuntu") -} \ No newline at end of file diff --git a/helpers/generate-versions-manifest.ps1 b/helpers/generate-versions-manifest.ps1 deleted file mode 100644 index 176360a..0000000 --- a/helpers/generate-versions-manifest.ps1 +++ /dev/null @@ -1,158 +0,0 @@ -<# -.SYNOPSIS -Generate versions manifest based on repository releases - -.DESCRIPTION -Versions manifest is needed to find the latest assets for particular version of tool -.PARAMETER GitHubRepositoryOwner -Required parameter. The organization which tool repository belongs -.PARAMETER GitHubRepositoryName -Optional parameter. The name of tool repository -.PARAMETER GitHubAccessToken -Required parameter. PAT Token to overcome GitHub API Rate limit -.PARAMETER OutputFile -Required parameter. File "*.json" where generated results will be saved -.PARAMETER PlatformMapFile -Optional parameter. Path to the json file with platform map -Structure example: -{ - "macos-1014": [ - { - "platform": "darwin", - "platform_version": "10.14" - }, ... - ], ... -} -#> - -param ( - [Parameter(Mandatory)] [string] $GitHubRepositoryOwner, - [Parameter(Mandatory)] [string] $GitHubRepositoryName, - [Parameter(Mandatory)] [string] $GitHubAccessToken, - [Parameter(Mandatory)] [string] $OutputFile, - [string] $PlatformMapFile -) - -Import-Module (Join-Path $PSScriptRoot "github/github-api.psm1") - -if ($PlatformMapFile -and (Test-Path $PlatformMapFile)) { - $PlatformMap = Get-Content $PlatformMapFile -Raw | ConvertFrom-Json -AsHashtable -} else { - $PlatformMap = @{} -} - -function Get-FileNameWithoutExtension { - param ( - [Parameter(Mandatory)][string]$Filename - ) - - if ($Filename.EndsWith(".tar.gz")) { - $Filename = [IO.path]::GetFileNameWithoutExtension($Filename) - } - - return [IO.path]::GetFileNameWithoutExtension($Filename) -} - -function New-AssetItem { - param ( - [Parameter(Mandatory)][string]$Filename, - [Parameter(Mandatory)][string]$DownloadUrl, - [Parameter(Mandatory)][string]$Arch, - [Parameter(Mandatory)][string]$Platform, - [string]$PlatformVersion - ) - $asset = New-Object PSObject - - $asset | Add-Member -Name "filename" -Value $Filename -MemberType NoteProperty - $asset | Add-Member -Name "arch" -Value $Arch -MemberType NoteProperty - $asset | Add-Member -Name "platform" -Value $Platform -MemberType NoteProperty - if ($PlatformVersion) { $asset | Add-Member -Name "platform_version" -Value $PlatformVersion -MemberType NoteProperty } - $asset | Add-Member -Name "download_url" -Value $DownloadUrl -MemberType NoteProperty - - return $asset -} - -function Build-AssetsList { - param ( - [AllowEmptyCollection()] - [Parameter(Mandatory)][array]$ReleaseAssets - ) - - - $assets = @() - foreach($releaseAsset in $ReleaseAssets) { - $filename = Get-FileNameWithoutExtension -Filename $releaseAsset.name - $parts = $filename.Split("-") - $arch = $parts[-1] - $buildPlatform = [string]::Join("-", $parts[2..($parts.Length-2)]) - - if ($PlatformMap[$buildPlatform]) { - $PlatformMap[$buildPlatform] | ForEach-Object { - $assets += New-AssetItem -Filename $releaseAsset.name ` - -DownloadUrl $releaseAsset.browser_download_url ` - -Arch $arch ` - -Platform $_.platform ` - -PlatformVersion $_.platform_version - } - - } else { - $assets += New-AssetItem -Filename $releaseAsset.name ` - -DownloadUrl $releaseAsset.browser_download_url ` - -Arch $arch ` - -Platform $buildPlatform - } - } - - return $assets -} - -function Get-VersionFromRelease { - param ( - [Parameter(Mandatory)][object]$Release - ) - # Release name can contain additional information after ':' so filter it - [string]$releaseName = $Release.name.Split(':')[0] - [Version]$version = $null - if (![Version]::TryParse($releaseName, [ref]$version)) { - throw "Release '$($Release.id)' has invalid title '$($Release.name)'. It can't be parsed as version. ( $($Release.html_url) )" - } - - return $version -} - -function Build-VersionsManifest { - param ( - [Parameter(Mandatory)][array]$Releases - ) - - $Releases = $Releases | Sort-Object -Property "published_at" -Descending - - $versionsHash = @{} - foreach ($release in $Releases) { - if (($release.draft -eq $true) -or ($release.prerelease -eq $true)) { - continue - } - - [Version]$version = Get-VersionFromRelease $release - $versionKey = $version.ToString() - - if ($versionsHash.ContainsKey($versionKey)) { - continue - } - - $versionsHash.Add($versionKey, [PSCustomObject]@{ - version = $versionKey - stable = $true - release_url = $release.html_url - files = Build-AssetsList $release.assets - }) - } - - # Sort versions by descending - return $versionsHash.Values | Sort-Object -Property @{ Expression = { [Version]$_.version }; Descending = $true } -} - -$gitHubApi = Get-GitHubApi -AccountName $GitHubRepositoryOwner -ProjectName $GitHubRepositoryName -AccessToken $GitHubAccessToken -$releases = $gitHubApi.GetGitHubReleases() -$versionIndex = Build-VersionsManifest $releases -$versionIndex | ConvertTo-Json -Depth 5 | Out-File $OutputFile -Encoding UTF8NoBOM -Force diff --git a/helpers/github/create-pull-request.ps1 b/helpers/github/create-pull-request.ps1 deleted file mode 100644 index 9c01042..0000000 --- a/helpers/github/create-pull-request.ps1 +++ /dev/null @@ -1,106 +0,0 @@ -<# -.SYNOPSIS -Create commit with all unstaged changes in repository and create pull-request - -.PARAMETER RepositoryOwner -Required parameter. The organization which tool repository belongs -.PARAMETER RepositoryName -Optional parameter. The name of tool repository -.PARAMETER AccessToken -Required parameter. PAT Token to authorize -.PARAMETER BranchName -Required parameter. The name of branch where changes will be pushed -.PARAMETER CommitMessage -Required parameter. The commit message to push changes -.PARAMETER PullRequestTitle -Required parameter. The title of pull-request -.PARAMETER PullRequestBody -Required parameter. The description of pull-request -#> -param ( - [Parameter(Mandatory)] [string] $RepositoryOwner, - [Parameter(Mandatory)] [string] $RepositoryName, - [Parameter(Mandatory)] [string] $AccessToken, - [Parameter(Mandatory)] [string] $BranchName, - [Parameter(Mandatory)] [string] $CommitMessage, - [Parameter(Mandatory)] [string] $PullRequestTitle, - [Parameter(Mandatory)] [string] $PullRequestBody -) - -Import-Module (Join-Path $PSScriptRoot "github-api.psm1") -Import-Module (Join-Path $PSScriptRoot "git.psm1") - -function Update-PullRequest { - Param ( - [Parameter(Mandatory=$true)] - [object] $GitHubApi, - [Parameter(Mandatory=$true)] - [string] $Title, - [Parameter(Mandatory=$true)] - [string] $Body, - [Parameter(Mandatory=$true)] - [string] $BranchName, - [Parameter(Mandatory=$true)] - [object] $PullRequest - ) - - $updatedPullRequest = $GitHubApi.UpdatePullRequest($Title, $Body, $BranchName, $PullRequest.number) - - if (($updatedPullRequest -eq $null) -or ($updatedPullRequest.html_url -eq $null)) { - Write-Host "##vso[task.logissue type=error;] Unexpected error occurs while updating pull request." - exit 1 - } - Write-host "##[section] Pull request updated: $($updatedPullRequest.html_url)" -} - -function Create-PullRequest { - Param ( - [Parameter(Mandatory=$true)] - [object] $GitHubApi, - [Parameter(Mandatory=$true)] - [string] $Title, - [Parameter(Mandatory=$true)] - [string] $Body, - [Parameter(Mandatory=$true)] - [string] $BranchName - ) - - $createdPullRequest = $GitHubApi.CreateNewPullRequest($Title, $Body, $BranchName) - - if (($createdPullRequest -eq $null) -or ($createdPullRequest.html_url -eq $null)) { - Write-Host "##vso[task.logissue type=error;] Unexpected error occurs while creating pull request." - exit 1 - } - - Write-host "##[section] Pull request created: $($createdPullRequest.html_url)" -} - -Write-Host "Configure local git preferences" -Git-ConfigureUser -Name "Service account" -Email "no-reply@microsoft.com" - -Write-Host "Create branch: $BranchName" -Git-CreateBranch -Name $BranchName - -Write-Host "Create commit" -Git-CommitAllChanges -Message $CommitMessage - -Write-Host "Push branch: $BranchName" -Git-PushBranch -Name $BranchName -Force $true - -$gitHubApi = Get-GitHubApi -AccountName $RepositoryOwner -ProjectName $RepositoryName -AccessToken $AccessToken -$pullRequest = $gitHubApi.GetPullRequest($BranchName, $RepositoryOwner) - -if ($pullRequest.Count -gt 0) { - Write-Host "Update pull request" - Update-PullRequest -GitHubApi $gitHubApi ` - -Title $PullRequestTitle ` - -Body $PullRequestBody ` - -BranchName $BranchName ` - -PullRequest $pullRequest[0] -} else { - Write-Host "Create pull request" - Create-PullRequest -GitHubApi $gitHubApi ` - -Title $PullRequestTitle ` - -Body $PullRequestBody ` - -BranchName $BranchName -} diff --git a/helpers/github/git.psm1 b/helpers/github/git.psm1 deleted file mode 100644 index 2383a79..0000000 --- a/helpers/github/git.psm1 +++ /dev/null @@ -1,81 +0,0 @@ -<# -.SYNOPSIS -Configure git credentials to use with commits -#> -function Git-ConfigureUser { - Param ( - [Parameter(Mandatory=$true)] - [string] $Name, - [Parameter(Mandatory=$true)] - [string] $Email - ) - - git config --global user.name $Name | Out-Host - git config --global user.email $Email | Out-Host - - if ($LASTEXITCODE -ne 0) { - Write-Host "##vso[task.logissue type=error;] Unexpected failure occurs while configuring git preferences." - exit 1 - } -} - -<# -.SYNOPSIS -Create new branch -#> -function Git-CreateBranch { - Param ( - [Parameter(Mandatory=$true)] - [string] $Name - ) - - git checkout -b $Name | Out-Host - - if ($LASTEXITCODE -ne 0) { - Write-Host "##vso[task.logissue type=error;] Unexpected failure occurs while creating new branch: $Name." - exit 1 - } -} - -<# -.SYNOPSIS -Commit all staged and unstaged changes -#> -function Git-CommitAllChanges { - Param ( - [Parameter(Mandatory=$true)] - [string] $Message - ) - - git add -A | Out-Host - git commit -m "$Message" | Out-Host - - if ($LASTEXITCODE -ne 0) { - Write-Host "##vso[task.logissue type=error;] Unexpected failure occurs while commiting changes." - exit 1 - } -} - -<# -.SYNOPSIS -Push branch to remote repository -#> -function Git-PushBranch { - Param ( - [Parameter(Mandatory=$true)] - [string] $Name, - [Parameter(Mandatory=$true)] - [boolean] $Force - ) - - if ($Force) { - git push --set-upstream origin $Name --force | Out-Host - } else { - git push --set-upstream origin $Name | Out-Host - } - - if ($LASTEXITCODE -ne 0) { - Write-Host "##vso[task.logissue type=error;] Unexpected failure occurs while pushing changes." - exit 1 - } -} \ No newline at end of file diff --git a/helpers/github/github-api.psm1 b/helpers/github/github-api.psm1 deleted file mode 100644 index fef64a5..0000000 --- a/helpers/github/github-api.psm1 +++ /dev/null @@ -1,109 +0,0 @@ -<# -.SYNOPSIS -The module that contains a bunch of methods to interact with GitHub API V3 -#> -class GitHubApi -{ - [string] $BaseUrl - [string] $RepoOwner - [object] $AuthHeader - - GitHubApi( - [string] $AccountName, - [string] $ProjectName, - [string] $AccessToken - ) { - $this.BaseUrl = $this.BuildBaseUrl($AccountName, $ProjectName) - $this.AuthHeader = $this.BuildAuth($AccessToken) - } - - [object] hidden BuildAuth([string]$AccessToken) { - if ([string]::IsNullOrEmpty($AccessToken)) { - return $null - } - $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("'':${AccessToken}")) - return @{ - Authorization = "Basic ${base64AuthInfo}" - } - } - - [string] hidden BuildBaseUrl([string]$RepositoryOwner, [string]$RepositoryName) { - return "https://api.github.com/repos/$RepositoryOwner/$RepositoryName" - } - - [object] CreateNewPullRequest([string]$Title, [string]$Body, [string]$BranchName){ - $requestBody = @{ - title = $Title - body = $Body - head = $BranchName - base = "master" - } | ConvertTo-Json - - $url = "pulls" - return $this.InvokeRestMethod($url, 'Post', $null, $requestBody) - } - - [object] GetPullRequest([string]$BranchName, [string]$RepositoryOwner){ - $url = "pulls" - return $this.InvokeRestMethod($url, 'GET', "head=${RepositoryOwner}:$BranchName&base=master", $null) - } - - [object] UpdatePullRequest([string]$Title, [string]$Body, [string]$BranchName, [string]$PullRequestNumber){ - $requestBody = @{ - title = $Title - body = $Body - head = $BranchName - base = "master" - } | ConvertTo-Json - - $url = "pulls/$PullRequestNumber" - return $this.InvokeRestMethod($url, 'Post', $null, $requestBody) - } - - [object] GetGitHubReleases(){ - $url = "releases" - return $this.InvokeRestMethod($url, 'GET', $null, $null) - } - - [string] hidden BuildUrl([string]$Url, [string]$RequestParams) { - if ([string]::IsNullOrEmpty($RequestParams)) { - return "$($this.BaseUrl)/$($Url)" - } else { - return "$($this.BaseUrl)/$($Url)?$($RequestParams)" - } - } - - [object] hidden InvokeRestMethod( - [string] $Url, - [string] $Method, - [string] $RequestParams, - [string] $Body - ) { - $requestUrl = $this.BuildUrl($Url, $RequestParams) - $params = @{ - Method = $Method - ContentType = "application/json" - Uri = $requestUrl - Headers = @{} - } - if ($this.AuthHeader) { - $params.Headers += $this.AuthHeader - } - if (![string]::IsNullOrEmpty($Body)) { - $params.Body = $Body - } - - return Invoke-RestMethod @params - } - -} - -function Get-GitHubApi { - param ( - [string] $AccountName, - [string] $ProjectName, - [string] $AccessToken - ) - - return [GitHubApi]::New($AccountName, $ProjectName, $AccessToken) -} \ No newline at end of file diff --git a/helpers/nix-helpers.psm1 b/helpers/nix-helpers.psm1 deleted file mode 100644 index 9cbd49e..0000000 --- a/helpers/nix-helpers.psm1 +++ /dev/null @@ -1,50 +0,0 @@ -<# -.SYNOPSIS -Pack folder to *.zip format -#> -function Pack-Zip { - param( - [Parameter(Mandatory=$true)] - [String]$PathToArchive, - [Parameter(Mandatory=$true)] - [String]$ToolZipFile - ) - - Write-Debug "Pack $PathToArchive to $ToolZipFile" - Push-Location -Path $PathToArchive - zip -q -r $ToolZipFile * | Out-Null - Pop-Location -} - -<# -.SYNOPSIS -Unpack *.tar file -#> -function Extract-TarArchive { - param( - [Parameter(Mandatory=$true)] - [String]$ArchivePath, - [Parameter(Mandatory=$true)] - [String]$OutputDirectory - ) - - Write-Debug "tar -C $OutputDirectory -xzf $ArchivePath --strip 1" - tar -C $OutputDirectory -xzf $ArchivePath --strip 1 -} - -function Create-TarArchive { - param( - [Parameter(Mandatory=$true)] - [String]$SourceFolder, - [Parameter(Mandatory=$true)] - [String]$ArchivePath, - [string]$CompressionType = "gz" - ) - - $CompressionTypeArgument = If ([string]::IsNullOrWhiteSpace($CompressionType)) { "" } else { "--${CompressionType}" } - - Push-Location $SourceFolder - Write-Debug "tar -c $CompressionTypeArgument -f $ArchivePath ." - tar -c $CompressionTypeArgument -f $ArchivePath . - Pop-Location -} \ No newline at end of file diff --git a/helpers/pester-extensions.psm1 b/helpers/pester-extensions.psm1 deleted file mode 100644 index 46d2a75..0000000 --- a/helpers/pester-extensions.psm1 +++ /dev/null @@ -1,33 +0,0 @@ -<# -.SYNOPSIS -Pester extension that allows to run command and validate exit code -.EXAMPLE -"python file.py" | Should -ReturnZeroExitCode -#> -function ShouldReturnZeroExitCode { - Param( - [Parameter (Mandatory = $true)] [ValidateNotNullOrEmpty()] - [String]$ActualValue, - [switch]$Negate - ) - - Write-Host "Run command '${ActualValue}'" - Invoke-Expression -Command $ActualValue | ForEach-Object { Write-Host $_ } - $actualExitCode = $LASTEXITCODE - - [bool]$succeeded = $actualExitCode -eq 0 - if ($Negate) { $succeeded = -not $succeeded } - - if (-not $succeeded) - { - $failureMessage = "Command '${ActualValue}' has finished with exit code ${actualExitCode}" - } - - return New-Object PSObject -Property @{ - Succeeded = $succeeded - FailureMessage = $failureMessage - } -} - -Add-AssertionOperator -Name ReturnZeroExitCode ` - -Test $function:ShouldReturnZeroExitCode diff --git a/helpers/win-helpers.psm1 b/helpers/win-helpers.psm1 deleted file mode 100644 index b80145b..0000000 --- a/helpers/win-helpers.psm1 +++ /dev/null @@ -1,18 +0,0 @@ -function Create-SevenZipArchive { - param( - [Parameter(Mandatory=$true)] - [String]$SourceFolder, - [Parameter(Mandatory=$true)] - [String]$ArchivePath, - [String]$ArchiveType = "zip", - [String]$CompressionLevel = 5 - ) - - $ArchiveTypeArgument = "-t${ArchiveType}" - $CompressionLevelArgument = "-mx=${CompressionLevel}" - - Push-Location $SourceFolder - Write-Debug "7z a $ArchiveTypeArgument $CompressionLevelArgument $ArchivePath @$SourceFolder" - 7z a $ArchiveTypeArgument $CompressionLevelArgument $ArchivePath $SourceFolder\* - Pop-Location -} \ No newline at end of file