mirror of https://github.com/abpframework/abp.git
5 changed files with 413 additions and 0 deletions
@ -0,0 +1,35 @@ |
|||||
|
#THIS IS NOT BEING USED CURRENTLY. RELEASE GITHUB MANUALLY |
||||
|
|
||||
|
# Import the module dynamically from the PowerShell Gallery. Use CurrentUser scope to avoid having to run as admin. |
||||
|
Import-Module -Name new-github-release-function.psm1 |
||||
|
|
||||
|
# Specify the parameters required to create the release. Do it as a hash table for easier readability. |
||||
|
$newGitHubReleaseParameters = |
||||
|
@{ |
||||
|
GitHubUsername = 'abpframework' |
||||
|
GitHubRepositoryName = 'abp' |
||||
|
GitHubAccessToken = '*******************' |
||||
|
ReleaseName = "5.0.0-rc.2" |
||||
|
TagName = "5.0.0-rc.2" |
||||
|
ReleaseNotes = "N/A" |
||||
|
#AssetFilePaths = @('C:\MyProject\Installer.exe','C:\MyProject\Documentation.md') |
||||
|
IsPreRelease = $true |
||||
|
IsDraft = $true # Set to true when testing so we don't publish a real release (visible to everyone) by accident. |
||||
|
} |
||||
|
|
||||
|
# Try to create the Release on GitHub and save the results. |
||||
|
$result = New-GitHubRelease @newGitHubReleaseParameters |
||||
|
|
||||
|
# Provide some feedback to the user based on the results. |
||||
|
if ($result.Succeeded -eq $true) |
||||
|
{ |
||||
|
Write-Output "Release published successfully! View it at $($result.ReleaseUrl)" |
||||
|
} |
||||
|
elseif ($result.ReleaseCreationSucceeded -eq $false) |
||||
|
{ |
||||
|
Write-Error "The release was not created. Error message is: $($result.ErrorMessage)" |
||||
|
} |
||||
|
elseif ($result.AllAssetUploadsSucceeded -eq $false) |
||||
|
{ |
||||
|
Write-Error "The release was created, but not all of the assets were uploaded to it. View it at $($result.ReleaseUrl). Error message is: $($result.ErrorMessage)" |
||||
|
} |
||||
@ -0,0 +1,30 @@ |
|||||
|
param( |
||||
|
[string]$password |
||||
|
) |
||||
|
|
||||
|
if (!$password) |
||||
|
{ |
||||
|
#reading password from file content |
||||
|
$sshPasswordFileName = "ssh-password.txt" |
||||
|
$password = Get-Content $sshPasswordFileName |
||||
|
echo "Using SSH password from $sshPasswordFileName ..." |
||||
|
} |
||||
|
|
||||
|
if (!$password) |
||||
|
{ |
||||
|
$password = Read-Host "Enter the Natro jenkins user password" |
||||
|
} |
||||
|
|
||||
|
# Get the current version |
||||
|
[xml]$commonPropsXml = Get-Content "../common.props" |
||||
|
$version = $commonPropsXml.Project.PropertyGroup.Version |
||||
|
echo "`n---===[ Current version: $version ]===---" |
||||
|
|
||||
|
|
||||
|
|
||||
|
echo "`n---===[ Running SSH commands on NATRO ]===---" |
||||
|
|
||||
|
echo "`nDownloading release file into Natro..." |
||||
|
plink.exe -ssh jenkins@94.73.164.234 -pw $password -P 22 -batch "powershell -File c:\ci\scripts\download-latest-abp-release.ps1 ${version}" |
||||
|
|
||||
|
echo "`n---===[ COMPLETED ]===---" |
||||
@ -0,0 +1,347 @@ |
|||||
|
#Requires -Version 3.0 |
||||
|
|
||||
|
function New-GitHubRelease |
||||
|
{ |
||||
|
<# |
||||
|
.SYNOPSIS |
||||
|
Creates a new Release for the given GitHub repository. |
||||
|
|
||||
|
.DESCRIPTION |
||||
|
Uses the GitHub API to create a new Release for a given repository. |
||||
|
Allows you to specify all of the Release properties, such as the Tag, Name, Assets, and if it's a Draft or Prerelease or not. |
||||
|
|
||||
|
.PARAMETER GitHubUsername |
||||
|
The username that the GitHub repository exists under. |
||||
|
e.g. For the repository https://github.com/deadlydog/New-GitHubRelease, the username is 'deadlydog'. |
||||
|
|
||||
|
.PARAMETER GitHubRepositoryName |
||||
|
The name of the repository to create the Release for. |
||||
|
e.g. For the repository https://github.com/deadlydog/New-GitHubRelease, the repository name is 'New-GitHubRelease'. |
||||
|
|
||||
|
.PARAMETER GitHubAccessToken |
||||
|
The Access Token to use as credentials for GitHub. |
||||
|
Access tokens can be generated at https://github.com/settings/tokens. |
||||
|
The access token will need to have the repo/public_repo permission on it for it to be allowed to create a new Release. |
||||
|
|
||||
|
.PARAMETER TagName |
||||
|
The name of the tag to create at the Commitish. |
||||
|
|
||||
|
.PARAMETER ReleaseName |
||||
|
The name to use for the new release. |
||||
|
If blank, the TagName will be used. |
||||
|
|
||||
|
.PARAMETER ReleaseNotes |
||||
|
The text describing the contents of the release. |
||||
|
|
||||
|
.PARAMETER AssetFilePaths |
||||
|
The full paths of the files to include in the release. |
||||
|
|
||||
|
.PARAMETER Commitish |
||||
|
Specifies the commitish value that determines where the Git tag is created from. |
||||
|
Can be any branch or commit SHA. Unused if the Git tag already exists. |
||||
|
Default: the repository's default branch (usually master). |
||||
|
|
||||
|
.PARAMETER IsDraft |
||||
|
True to create a draft (unpublished) release, false to create a published one. |
||||
|
Default: false |
||||
|
|
||||
|
.PARAMETER IsPreRelease |
||||
|
True to identify the release as a prerelease. false to identify the release as a full release. |
||||
|
Default: false |
||||
|
|
||||
|
.OUTPUTS |
||||
|
A hash table with the following properties is returned: |
||||
|
|
||||
|
Succeeded = $true if the Release was created successfully and all assets were uploaded to it, $false if some part of the process failed. |
||||
|
ReleaseCreationSucceeded = $true if the Release was created successfully (does not include asset uploads), $false if the Release was not created. |
||||
|
AllAssetUploadsSucceeded = $true if all assets were uploaded to the Release successfully, $false if one of them failed, $null if there were no assets to upload. |
||||
|
ReleaseUrl = The URL of the new Release that was created. |
||||
|
ErrorMessage = A message describing what went wrong in the case that Succeeded is $false. |
||||
|
|
||||
|
.EXAMPLE |
||||
|
# Import the module dynamically from the PowerShell Gallery. Use CurrentUser scope to avoid having to run as admin. |
||||
|
Import-Module -Name New-GitHubRelease -Scope CurrentUser |
||||
|
|
||||
|
# Specify the parameters required to create the release. Do it as a hash table for easier readability. |
||||
|
$newGitHubReleaseParameters = |
||||
|
@{ |
||||
|
GitHubUsername = 'deadlydog' |
||||
|
GitHubRepositoryName = 'New-GitHubRelease' |
||||
|
GitHubAccessToken = 'SomeLongHexidecimalString' |
||||
|
ReleaseName = "New-GitHubRelease v1.0.0" |
||||
|
TagName = "v1.0.0" |
||||
|
ReleaseNotes = "This release contains the following changes: ..." |
||||
|
AssetFilePaths = @('C:\MyProject\Installer.exe','C:\MyProject\Documentation.md') |
||||
|
IsPreRelease = $false |
||||
|
IsDraft = $true # Set to true when testing so we don't publish a real release (visible to everyone) by accident. |
||||
|
} |
||||
|
|
||||
|
# Try to create the Release on GitHub and save the results. |
||||
|
$result = New-GitHubRelease @newGitHubReleaseParameters |
||||
|
|
||||
|
# Provide some feedback to the user based on the results. |
||||
|
if ($result.Succeeded -eq $true) |
||||
|
{ |
||||
|
Write-Output "Release published successfully! View it at $($result.ReleaseUrl)" |
||||
|
} |
||||
|
elseif ($result.ReleaseCreationSucceeded -eq $false) |
||||
|
{ |
||||
|
Write-Error "The release was not created. Error message is: $($result.ErrorMessage)" |
||||
|
} |
||||
|
elseif ($result.AllAssetUploadsSucceeded -eq $false) |
||||
|
{ |
||||
|
Write-Error "The release was created, but not all of the assets were uploaded to it. View it at $($result.ReleaseUrl). Error message is: $($result.ErrorMessage)" |
||||
|
} |
||||
|
|
||||
|
Attempt to create a new Release on GitHub, and provide feedback to the user indicating if it succeeded or not. |
||||
|
|
||||
|
.LINK |
||||
|
Project home: https://github.com/deadlydog/New-GitHubRelease |
||||
|
|
||||
|
.NOTES |
||||
|
Name: New-GitHubRelease |
||||
|
Author: Daniel Schroeder (originally based on the script at https://github.com/majkinetor/au/blob/master/scripts/Github-CreateRelease.ps1) |
||||
|
GitHub Release API Documentation: https://developer.github.com/v3/repos/releases/#create-a-release |
||||
|
Version: 1.0.2 |
||||
|
#> |
||||
|
[CmdletBinding()] |
||||
|
param |
||||
|
( |
||||
|
[Parameter(Mandatory=$true,HelpMessage="The username the repository is under (e.g. deadlydog).")] |
||||
|
[string] $GitHubUsername, |
||||
|
|
||||
|
[Parameter(Mandatory=$true,HelpMessage="The repository name to create the release in (e.g. Invoke-MsBuild).")] |
||||
|
[string] $GitHubRepositoryName, |
||||
|
|
||||
|
[Parameter(Mandatory=$true,HelpMessage="The Acess Token to use as credentials for GitHub.")] |
||||
|
[string] $GitHubAccessToken, |
||||
|
|
||||
|
[Parameter(Mandatory=$true,HelpMessage="The name of the tag to create at the the Commitish.")] |
||||
|
[string] $TagName, |
||||
|
|
||||
|
[Parameter(Mandatory=$false,HelpMessage="The name of the release. If blank, the TagName will be used.")] |
||||
|
[string] $ReleaseName, |
||||
|
|
||||
|
[Parameter(Mandatory=$false,HelpMessage="Text describing the contents of the tag.")] |
||||
|
[string] $ReleaseNotes, |
||||
|
|
||||
|
[Parameter(Mandatory=$false,HelpMessage="The full paths of the files to include in the release.")] |
||||
|
[string[]] $AssetFilePaths, |
||||
|
|
||||
|
[Parameter(Mandatory=$false, HelpMessage="Specifies the commitish value that determines where the Git tag is created from. Can be any branch or commit SHA. Unused if the Git tag already exists. Default: the repository's default branch (usually master).")] |
||||
|
[string] $Commitish, |
||||
|
|
||||
|
[Parameter(Mandatory=$false,HelpMessage="True to create a draft (unpublished) release, false to create a published one. Default: false")] |
||||
|
[bool] $IsDraft = $false, |
||||
|
|
||||
|
[Parameter(Mandatory=$false,HelpMessage="True to identify the release as a prerelease. false to identify the release as a full release. Default: false")] |
||||
|
[bool] $IsPreRelease = $false |
||||
|
) |
||||
|
|
||||
|
BEGIN |
||||
|
{ |
||||
|
# Turn on Strict Mode to help catch syntax-related errors. |
||||
|
# This must come after a script's/function's param section. |
||||
|
# Forces a function to be the first non-comment code to appear in a PowerShell Script/Module. |
||||
|
Set-StrictMode -Version Latest |
||||
|
|
||||
|
Set-SecurityProtocolForThread |
||||
|
|
||||
|
[string] $NewLine = [Environment]::NewLine |
||||
|
|
||||
|
if ([string]::IsNullOrEmpty($ReleaseName)) |
||||
|
{ |
||||
|
$ReleaseName = $TagName |
||||
|
} |
||||
|
|
||||
|
# Ensure that all of the given asset file paths to upload are valid. |
||||
|
Test-AllFilePathsAndThrowErrorIfOneIsNotValid $AssetFilePaths |
||||
|
} |
||||
|
|
||||
|
END { } |
||||
|
|
||||
|
PROCESS |
||||
|
{ |
||||
|
# Create the hash table to return, with default values. |
||||
|
$result = @{} |
||||
|
$result.Succeeded = $false |
||||
|
$result.ReleaseCreationSucceeded = $false |
||||
|
$result.AllAssetUploadsSucceeded = $false |
||||
|
$result.ReleaseUrl = $null |
||||
|
$result.ErrorMessage = $null |
||||
|
|
||||
|
[bool] $thereAreNoAssetsToIncludeInTheRelease = ($AssetFilePaths -eq $null) -or ($AssetFilePaths.Count -le 0) |
||||
|
if ($thereAreNoAssetsToIncludeInTheRelease) |
||||
|
{ |
||||
|
$result.AllAssetUploadsSucceeded = $null |
||||
|
} |
||||
|
|
||||
|
$authHeader = |
||||
|
@{ |
||||
|
Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($GitHubAccessToken + ":x-oauth-basic")) |
||||
|
} |
||||
|
|
||||
|
$releaseData = |
||||
|
@{ |
||||
|
tag_name = $TagName |
||||
|
target_commitish = $Commitish |
||||
|
name = $ReleaseName |
||||
|
body = $ReleaseNotes |
||||
|
draft = $IsDraft |
||||
|
prerelease = $IsPreRelease |
||||
|
} |
||||
|
|
||||
|
$createReleaseWebRequestParameters = |
||||
|
@{ |
||||
|
Uri = "https://api.github.com/repos/$GitHubUsername/$GitHubRepositoryName/releases" |
||||
|
Method = 'POST' |
||||
|
Headers = $authHeader |
||||
|
ContentType = 'application/json' |
||||
|
Body = (ConvertTo-Json $releaseData -Compress) |
||||
|
} |
||||
|
|
||||
|
try |
||||
|
{ |
||||
|
Write-Verbose "Sending web request to create the new Release..." |
||||
|
$createReleaseWebRequestResults = Invoke-RestMethodAndThrowDescriptiveErrorOnFailure $createReleaseWebRequestParameters |
||||
|
} |
||||
|
catch |
||||
|
{ |
||||
|
$result.ReleaseCreationSucceeded = $false |
||||
|
$result.ErrorMessage = $_.Exception.Message |
||||
|
return $result |
||||
|
} |
||||
|
|
||||
|
$result.ReleaseCreationSucceeded = $true |
||||
|
$result.ReleaseUrl = $createReleaseWebRequestResults.html_url |
||||
|
|
||||
|
if ($thereAreNoAssetsToIncludeInTheRelease) |
||||
|
{ |
||||
|
$result.Succeeded = $true |
||||
|
return $result |
||||
|
} |
||||
|
|
||||
|
# Upload Url has template parameters on the end (e.g. ".../assets{?name,label}"), so remove them. |
||||
|
[string] $urlToUploadFilesTo = $createReleaseWebRequestResults.upload_url -replace '{.+}' |
||||
|
|
||||
|
try |
||||
|
{ |
||||
|
Write-Verbose "Uploading asset files to the new release..." |
||||
|
Send-FilesToGitHubRelease -filePathsToUpload $AssetFilePaths -urlToUploadFilesTo $urlToUploadFilesTo -authHeader $authHeader |
||||
|
} |
||||
|
catch |
||||
|
{ |
||||
|
$result.AllAssetUploadsSucceeded = $false |
||||
|
$result.ErrorMessage = $_.Exception.Message |
||||
|
return $result |
||||
|
} |
||||
|
|
||||
|
$result.AllAssetUploadsSucceeded = $true |
||||
|
$result.Succeeded = $true |
||||
|
return $result |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function Send-FilesToGitHubRelease([string[]] $filePathsToUpload, [string] $urlToUploadFilesTo, $authHeader) |
||||
|
{ |
||||
|
[int] $numberOfFilesToUpload = $filePathsToUpload.Count |
||||
|
[int] $numberOfFilesUploaded = 0 |
||||
|
$filePathsToUpload | ForEach-Object ` |
||||
|
{ |
||||
|
$filePath = $_ |
||||
|
$fileName = Get-Item $filePath | Select-Object -ExpandProperty Name |
||||
|
|
||||
|
$uploadAssetWebRequestParameters = |
||||
|
@{ |
||||
|
# Append the name of the file to the upload url. |
||||
|
Uri = $urlToUploadFilesTo + "?name=$fileName" |
||||
|
Method = 'POST' |
||||
|
Headers = $authHeader |
||||
|
ContentType = 'application/zip' |
||||
|
InFile = $filePath |
||||
|
} |
||||
|
|
||||
|
$numberOfFilesUploaded = $numberOfFilesUploaded + 1 |
||||
|
Write-Verbose "Uploading asset $numberOfFilesUploaded of $numberOfFilesToUpload, '$filePath'." |
||||
|
Invoke-RestMethodAndThrowDescriptiveErrorOnFailure $uploadAssetWebRequestParameters > $null |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function Test-AllFilePathsAndThrowErrorIfOneIsNotValid([string[]] $filePaths) |
||||
|
{ |
||||
|
foreach ($filePath in $filePaths) |
||||
|
{ |
||||
|
[bool] $fileWasNotFoundAtPath = [string]::IsNullOrEmpty($filePath) -or !(Test-Path -Path $filePath -PathType Leaf) |
||||
|
if ($fileWasNotFoundAtPath) |
||||
|
{ |
||||
|
throw "There is no file at the specified path, '$filePath'." |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function Invoke-RestMethodAndThrowDescriptiveErrorOnFailure($requestParametersHashTable) |
||||
|
{ |
||||
|
$requestDetailsAsNicelyFormattedString = Convert-HashTableToNicelyFormattedString $requestParametersHashTable |
||||
|
Write-Verbose "Making web request with the following parameters:$NewLine$requestDetailsAsNicelyFormattedString" |
||||
|
|
||||
|
try |
||||
|
{ |
||||
|
$webRequestResult = Invoke-RestMethod @requestParametersHashTable |
||||
|
} |
||||
|
catch |
||||
|
{ |
||||
|
[Exception] $exception = $_.Exception |
||||
|
|
||||
|
[string] $errorMessage = Get-RestMethodExceptionDetailsOrNull -restMethodException $exception |
||||
|
if ([string]::IsNullOrWhiteSpace($errorMessage)) |
||||
|
{ |
||||
|
$errorMessage = $exception.ToString() |
||||
|
} |
||||
|
|
||||
|
throw "An unexpected error occurred while making web request:$NewLine$errorMessage" |
||||
|
} |
||||
|
|
||||
|
Write-Verbose "Web request returned the following result:$NewLine$webRequestResult" |
||||
|
return $webRequestResult |
||||
|
} |
||||
|
|
||||
|
function Get-RestMethodExceptionDetailsOrNull([Exception] $restMethodException) |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
$responseDetails = @{ |
||||
|
ResponseUri = $exception.Response.ResponseUri |
||||
|
StatusCode = $exception.Response.StatusCode |
||||
|
StatusDescription = $exception.Response.StatusDescription |
||||
|
ErrorMessage = $exception.Message |
||||
|
} |
||||
|
[string] $responseDetailsAsNicelyFormattedString = Convert-HashTableToNicelyFormattedString $responseDetails |
||||
|
|
||||
|
[string] $errorInfo = "Request Details:" + $NewLine + $requestDetailsAsNicelyFormattedString |
||||
|
$errorInfo += $NewLine |
||||
|
$errorInfo += "Response Details:" + $NewLine + $responseDetailsAsNicelyFormattedString |
||||
|
return $errorInfo |
||||
|
} |
||||
|
catch |
||||
|
{ |
||||
|
return $null |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function Convert-HashTableToNicelyFormattedString($hashTable) |
||||
|
{ |
||||
|
[string] $nicelyFormattedString = $hashTable.Keys | ForEach-Object ` |
||||
|
{ |
||||
|
$key = $_ |
||||
|
$value = $hashTable.$key |
||||
|
" $key = $value$NewLine" |
||||
|
} |
||||
|
return $nicelyFormattedString |
||||
|
} |
||||
|
|
||||
|
function Set-SecurityProtocolForThread |
||||
|
{ |
||||
|
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12 -bor [System.Net.SecurityProtocolType]::Tls11 -bor [System.Net.SecurityProtocolType]::Tls |
||||
|
} |
||||
|
|
||||
|
Export-ModuleMember -Function New-GitHubRelease |
||||
Binary file not shown.
Loading…
Reference in new issue