From aacd152358b9cc54117979641d5323cc35a05317 Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Wed, 21 Nov 2018 21:36:41 +0000 Subject: [PATCH 01/17] (maint) Added license --- LICENSE | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2d0a190 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 Gary Ewan Park + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From 5c9f4db3e198cd6cfe6254cb598ef17a252322bf Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Wed, 21 Nov 2018 21:40:11 +0000 Subject: [PATCH 02/17] (doc) Added links --- vss-extension.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/vss-extension.json b/vss-extension.json index ecaf340..8dd3d6c 100644 --- a/vss-extension.json +++ b/vss-extension.json @@ -21,6 +21,20 @@ "color": "rgb(220, 235, 252)", "theme": "light" }, + "links": { + "learn": { + "uri": "https://gep13.github.io/chocolatey-azuredevops/" + }, + "license": { + "uri": "https://github.com/gep13/chocolatey-azuredevops/blob/develop/LICENSE" + }, + "repository": { + "uri": "https://github.com/gep13/chocolatey-azuredevops" + }, + "support": { + "uri": "https://github.com/gep13/chocolatey-azuredevops/issues" + } +}, "content": { "details": { "path": "readme.md" @@ -59,4 +73,4 @@ "path": "Tasks/chocolatey" } ] -} \ No newline at end of file +} From 6ec974d5714932eba74306bdb07a7760be4541da Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Wed, 21 Nov 2018 21:45:08 +0000 Subject: [PATCH 03/17] (doc) Added screenshot --- images/task.png | Bin 0 -> 35793 bytes vss-extension.json | 7 ++++++- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 images/task.png diff --git a/images/task.png b/images/task.png new file mode 100644 index 0000000000000000000000000000000000000000..892abefb9f7a647b9342eb7f6e1880eb4653d0f6 GIT binary patch literal 35793 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%0D{vvBNGq|Rznt?@} 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 Date: Wed, 21 Nov 2018 21:49:34 +0000 Subject: [PATCH 04/17] (doc) Updated More Information link --- Tasks/chocolatey/task.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tasks/chocolatey/task.json b/Tasks/chocolatey/task.json index db5165a..1d68825 100644 --- a/Tasks/chocolatey/task.json +++ b/Tasks/chocolatey/task.json @@ -4,7 +4,7 @@ "friendlyName": "Chocolatey", "description": "Run various Chocolatey commands, including pack, push, install, upgrade, etc.", "author": "gep13", - "helpMarkDown": "[More Information](https://gep13.co.uk/chocolatey-azuredevops", + "helpMarkDown": "[More Information](https://gep13.github.io/chocolatey-azuredevops/", "category": "Build", "visibility": [ "Build", @@ -648,4 +648,4 @@ "workingDirectory": "$(currentDirectory)" } } -} \ No newline at end of file +} From ea6825566fe3648c84aa8d142bb586bd786b7e48 Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Wed, 21 Nov 2018 22:05:38 +0000 Subject: [PATCH 05/17] (doc) Updated readme --- readme.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/readme.md b/readme.md index 074b0e4..cd8047c 100644 --- a/readme.md +++ b/readme.md @@ -1 +1,49 @@ # Chocolatey Azure DevOps Tasks + +This extension brings support for [Chocolatey](https://chocolatey.org/) to Azure DevOps. + +## Table of Contents + +1. [What is Chocolatey?](#what-is-chocolatey) +1. [Tasks](#tasks) +1. [Resources](#resources) +1. [Thanks](#thanks) +1. [Contributing](#contributing) +1. [Releases](#releases) + +## What is Chocolatey? + +Chocolatey is a Package Manager for Windows, which allows the automation of all your software needs. + +For more information about [Chocolatey](https://chocolatey.org/), please see the Chocolatey Website or the Chocolatey [source code repository](https://github.com/chocolatey/choco). + + +## Tasks + +This extension contains only a single Task, which is capable of executing the following Chocolatey Commands: + +* apikey +* config +* custom +* feature +* install +* pack +* push +* source +* upgrade + +## Resources + +Short YouTube videos of each of the releases of this extension can be found in this [playlist](https://www.youtube.com/playlist?list=PL84yg23i9GBhGahFf5-41vOJhn3D-6EUU). + +## Thanks + +The Chocolatey Azure DevOps Extension is modelled on the NuGet Extension, and many of the ideas in terms of how it functions, is based on how it works. + +## Contributing + +If you would like to see any other tasks or features added for this Azure DevOps Extension, feel free to raise an [issue](https://github.com/gep13/chocolatey-azuredevops/issues), and if possible, a follow up pull request. + +## Releases + +To find out what was released in each version of this extension, check out the [releases](https://github.com/gep13/chocolatey-azuredevops/releases) page. From 72a805ac471c9e2529fd3bd84507c8725def2e9a Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Fri, 23 Nov 2018 21:01:58 +0000 Subject: [PATCH 06/17] (GH-12) Updated helpMarkdown with URL --- Tasks/chocolatey/task.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tasks/chocolatey/task.json b/Tasks/chocolatey/task.json index 1d68825..2fbb596 100644 --- a/Tasks/chocolatey/task.json +++ b/Tasks/chocolatey/task.json @@ -85,7 +85,7 @@ "type": "pickList", "label": "Command", "defaultValue": "pack", - "helpMarkDown": "The Chocolatey command to run. Select 'Custom' to use a different command.", + "helpMarkDown": "The Chocolatey command to run. Select 'custom' to use other commands that are available [here](https://chocolatey.org/docs/commands-reference).", "required": "true", "properties": { "EditableOptions": "False" From b3b791beabd8b70ef29fcbcf71e204cfb62cfab9 Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Fri, 23 Nov 2018 21:02:51 +0000 Subject: [PATCH 07/17] (maint) Whitespace changes --- vss-extension.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vss-extension.json b/vss-extension.json index fa30aa1..e412012 100644 --- a/vss-extension.json +++ b/vss-extension.json @@ -23,16 +23,16 @@ }, "links": { "learn": { - "uri": "https://gep13.github.io/chocolatey-azuredevops/" + "uri": "https://gep13.github.io/chocolatey-azuredevops/" }, "license": { - "uri": "https://github.com/gep13/chocolatey-azuredevops/blob/develop/LICENSE" + "uri": "https://github.com/gep13/chocolatey-azuredevops/blob/develop/LICENSE" }, "repository": { - "uri": "https://github.com/gep13/chocolatey-azuredevops" + "uri": "https://github.com/gep13/chocolatey-azuredevops" }, "support": { - "uri": "https://github.com/gep13/chocolatey-azuredevops/issues" + "uri": "https://github.com/gep13/chocolatey-azuredevops/issues" } }, "screenshots": [ @@ -78,4 +78,4 @@ "path": "Tasks/chocolatey" } ] -} +} \ No newline at end of file From c7b452a01c6dddab6cff837b73bdff20bb087761 Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Fri, 23 Nov 2018 21:14:09 +0000 Subject: [PATCH 08/17] (GH-15) Added note about Chocolatey requirement --- readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readme.md b/readme.md index cd8047c..d8d6403 100644 --- a/readme.md +++ b/readme.md @@ -22,6 +22,8 @@ For more information about [Chocolatey](https://chocolatey.org/), please see the This extension contains only a single Task, which is capable of executing the following Chocolatey Commands: +**NOTE:** This Azure DevOps Task assumes that Chocolatey is already installed on the Build Agent that is running the build. If Chocolatey is not located on the Build Agent, an error will be thrown, and the task will fail. + * apikey * config * custom From b9b0fe7cb72e64e704420692dcaed17fd3b83994 Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Fri, 23 Nov 2018 21:21:16 +0000 Subject: [PATCH 09/17] (GH-16) Inspect last exit code - Throw if non-zero --- Tasks/chocolatey/chocolatey.ps1 | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Tasks/chocolatey/chocolatey.ps1 b/Tasks/chocolatey/chocolatey.ps1 index c04d315..3507950 100644 --- a/Tasks/chocolatey/chocolatey.ps1 +++ b/Tasks/chocolatey/chocolatey.ps1 @@ -392,10 +392,18 @@ try { if($packOperation -eq "single") { [string]$packNuspecFileName = Get-VstsInput -Name 'packNuspecFileName' -Require & $chocoExe $commandName $packNuspecFileName $($chocolateyArguments) + + if($LASTEXITCODE -ne 0) { + throw "Something went wrong with Chocolatey execution. Check log for additional information." + } } else { $nuspecFiles = Get-ChildItem "*.nuspec" foreach($nuspecFile in $nuspecFiles) { & $chocoExe $commandName $nuspecFile $($chocolateyArguments) + + if($LASTEXITCODE -ne 0) { + throw "Something went wrong with Chocolatey execution. Check log for additional information." + } } } } elseif($commandName -eq 'push') { @@ -405,14 +413,26 @@ try { if($pushOperation -eq "single") { [string]$pushNupkgFileName = Get-VstsInput -Name 'pushNupkgFileName' -Require & $chocoExe $commandName $pushNupkgFileName $($chocolateyArguments) + + if($LASTEXITCODE -ne 0) { + throw "Something went wrong with Chocolatey execution. Check log for additional information." + } } else { $nupkgFiles = Get-ChildItem "*.nupkg" foreach($nupkgFile in $nupkgFiles) { & $chocoExe $commandName $nupkgFile $($chocolateyArguments) + + if($LASTEXITCODE -ne 0) { + throw "Something went wrong with Chocolatey execution. Check log for additional information." + } } } } else { & $chocoExe $commandName $($chocolateyArguments) + + if($LASTEXITCODE -ne 0) { + throw "Something went wrong with Chocolatey execution. Check log for additional information." + } } } catch { Write-VstsTaskError $_.Exception.Message From 662e43f1fc16c6a72a7ac3db336c28048a197bb8 Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Fri, 23 Nov 2018 21:57:00 +0000 Subject: [PATCH 10/17] (GH-17) Quoted all arguments - To guard against known problems --- Tasks/chocolatey/chocolatey.ps1 | 116 +++++++------------------------- 1 file changed, 26 insertions(+), 90 deletions(-) diff --git a/Tasks/chocolatey/chocolatey.ps1 b/Tasks/chocolatey/chocolatey.ps1 index 3507950..ff9f354 100644 --- a/Tasks/chocolatey/chocolatey.ps1 +++ b/Tasks/chocolatey/chocolatey.ps1 @@ -28,17 +28,14 @@ try { [string]$commandName = "" if($debug) { - Write-Output "Adding --debug to arguments" $chocolateyArguments.Add("--debug") > $null } if($verbose) { - Write-Output "Adding --verbose to arguments" $chocolateyArguments.Add("--verbose") > $null } if($trace) { - Write-Output "Adding --trace to arguments" $chocolateyArguments.Add("--trace") > $null } @@ -52,26 +49,22 @@ try { [string]$apikeyApikey = Get-VstsInput -Name 'apikeyApikey' -Require $commandName = "apikey" - $chocolateyArguments.Add("--source") > $null - $chocolateyArguments.Add($apikeySource) > $null - $chocolateyArguments.Add("--api-key") > $null - $chocolateyArguments.Add($apikeyApikey) > $null + $chocolateyArguments.Add("--source=`"'$apikeySource'`"") > $null + $chocolateyArguments.Add("--api-key=`"'$apikeyApikey'`"") > $null } "config" { [string]$configOperation = Get-VstsInput -Name 'configOperation' -Require [string]$configName = Get-VstsInput -Name 'configName' -Require - $chocolateyArguments.Add("--name") > $null - $chocolateyArguments.Add($configName) > $null + $chocolateyArguments.Add("--name=`"'$configName'`"") > $null $commandName = "config" if($configOperation -eq "set") { [string]$configValue = Get-VstsInput -Name 'configValue' -Require - $chocolateyArguments.Add("--value") > $null - $chocolateyArguments.Add($configValue) > $null + $chocolateyArguments.Add("--value=`"'$configValue'`"") > $null $chocolateyArguments.Insert(0, "set") > $null } else { $chocolateyArguments.Insert(0, "unset") > $null @@ -83,7 +76,6 @@ try { [string]$customArguments = Get-VstsInput -Name 'customArguments' if($customArguments) { - Write-Output "Adding custom arguments" $chocolateyArguments.Add($customArguments) > $null } @@ -95,8 +87,7 @@ try { [string]$featureName = Get-VstsInput -Name 'featureName' -Require $commandName = "feature" - $chocolateyArguments.Add("--name") > $null - $chocolateyArguments.Add($featureName) > $null + $chocolateyArguments.Add("--name=`"'$featureName'`"") > $null $chocolateyArguments.Insert(0, $featureOperation) > $null } @@ -113,57 +104,43 @@ try { [string]$installParams = Get-VstsInput -Name 'installParams' if([System.Version]::Parse($chocolateyVersion) -ge [System.Version]::Parse("0.9.8.33")) { - Write-Output "Adding -y to arguments" $chocolateyArguments.Add("-y") > $null } if([System.Version]::Parse($chocolateyVersion) -ge [System.Version]::Parse("0.10.4")) { - Write-Output "Adding --no-progress to arguments" $chocolateyArguments.Add("--no-progress") > $null } if($installPackageVersion) { - Write-Output "Adding --version to arguments" - $chocolateyArguments.Add("--version") > $null - $chocolateyArguments.Add($installPackageVersion) > $null + $chocolateyArguments.Add("--version=`"'$installPackageVersion'`"") > $null } if($installPre) { - Write-Output "Adding --pre to arguments" $chocolateyArguments.Add("--pre") > $null } if($installSource) { - Write-Output "Adding --source to arguments" - $chocolateyArguments.Add("--version") > $null - $chocolateyArguments.Add($installSource) > $null + $chocolateyArguments.Add("--source=`"'$installSource'`"") > $null } if($installForce) { - Write-Output "Adding --force to arguments" $chocolateyArguments.Add("--force") > $null } if($installX86) { - Write-Output "Adding --x86 to arguments" $chocolateyArguments.Add("--x86") > $null } if($installInstallArgs) { - Write-Output "Adding --install-arguments to arguments" - $chocolateyArguments.Add("--install-arguments") > $null - $chocolateyArguments.Add($installInstallArgs) > $null + $chocolateyArguments.Add("--install-arguments=`"'$installInstallArgs'`"") > $null } if($installOverride) { - Write-Output "Adding --override-arguments to arguments" $chocolateyArguments.Add("--override-arguments") > $null } if($installParams) { - Write-Output "Adding --package-parameters to arguments" - $chocolateyArguments.Add("--package-parameters") > $null - $chocolateyArguments.Add($installParams) > $null + $chocolateyArguments.Add("--package-parameters=`"'$installParams'`"") > $null } $chocolateyArguments.Insert(0, $installPackageId) > $null @@ -177,15 +154,11 @@ try { [string]$packOutputDirectory = Get-VstsInput -Name 'packOutputDirectory' if($packVersion) { - Write-Output "Adding --version to arguments" - $chocolateyArguments.Add("--version") > $null - $chocolateyArguments.Add($packVersion) > $null + $chocolateyArguments.Add("--version=`"'$packVersion'`"") > $null } if($packOutputDirectory) { - Write-Output "Adding --output-directory to arguments" - $chocolateyArguments.Add("--output-directory") > $null - $chocolateyArguments.Add($packOutputDirectory) > $null + $chocolateyArguments.Add("--output-directory=`"'$packOutputDirectory'`"") > $null } $commandName = "pack" @@ -200,26 +173,19 @@ try { [string]$pushTimeout = Get-VstsInput -Name 'pushTimeout' if($pushSource) { - Write-Output "Adding --source to arguments" - $chocolateyArguments.Add("--source") > $null - $chocolateyArguments.Add($pushSource) > $null + $chocolateyArguments.Add("--source=`"'$pushSource'`"") > $null } if($pushApikey) { - Write-Output "Adding --apikey to arguments" - $chocolateyArguments.Add("--apikey") > $null - $chocolateyArguments.Add($pushApikey) > $null + $chocolateyArguments.Add("--apikey=`"'$pushApikey'`"") > $null } if($pushForce) { - Write-Output "Adding --force to arguments" $chocolateyArguments.Add("--force") > $null } if($pushTimeout) { - Write-Output "Adding -t to arguments" - $chocolateyArguments.Add("-t") > $null - $chocolateyArguments.Add($pushTimeout) > $null + $chocolateyArguments.Add("-t=`"'$pushTimeout'`"") > $null } $commandName = "push" @@ -235,41 +201,29 @@ try { [string]$certPassword = Get-VstsInput -Name 'certPassword' [bool]$byPassProxy = Get-VstsInput -Name 'byPassProxy' -AsBool -Default $false - $chocolateyArguments.Add("--name") > $null - $chocolateyArguments.Add($sourceSourceName) > $null + $chocolateyArguments.Add("--name=`"'$sourceSourceName'`"") > $null if($sourcePriority) { - Write-Output "Adding --priority to arguments" - $chocolateyArguments.Add("--priority") > $null - $chocolateyArguments.Add($sourcePriority) > $null + $chocolateyArguments.Add("--priority=`"'$sourcePriority'`"") > $null } if($user) { - Write-Output "Adding --user to arguments" - $chocolateyArguments.Add("--user") > $null - $chocolateyArguments.Add($user) > $null + $chocolateyArguments.Add("--user=`"'$user'`"") > $null } if($password) { - Write-Output "Adding --password to arguments" - $chocolateyArguments.Add("--password") > $null - $chocolateyArguments.Add($password) > $null + $chocolateyArguments.Add("--password=`"'$password'`"") > $null } if($cert) { - Write-Output "Adding --cert to arguments" - $chocolateyArguments.Add("--cert") > $null - $chocolateyArguments.Add($cert) > $null + $chocolateyArguments.Add("--cert=`"'$cert'`"") > $null } if($certPassword) { - Write-Output "Adding --certpassword to arguments" - $chocolateyArguments.Add("--certpassword") > $null - $chocolateyArguments.Add($certPassword) > $null + $chocolateyArguments.Add("--certpassword=`"'$certPassword'`"") > $null } if($byPassProxy) { - Write-Output "Adding --bypass-proxy to arguments" $chocolateyArguments.Add("--bypass-proxy") > $null } @@ -280,8 +234,7 @@ try { "add" { [string]$sourceSource = Get-VstsInput -Name 'sourceSource' -Require - $chocolateyArguments.Add("--source") > $null - $chocolateyArguments.Add($sourceSource) > $null + $chocolateyArguments.Add("--source=`"'$sourceSource'`"") > $null $chocolateyArguments.Insert(0, "add") > $null } @@ -313,63 +266,47 @@ try { [string]$upgradeParams = Get-VstsInput -Name 'upgradeParams' if([System.Version]::Parse($chocolateyVersion) -ge [System.Version]::Parse("0.9.8.33")) { - Write-Output "Adding -y to arguments" $chocolateyArguments.Add("-y") > $null } if([System.Version]::Parse($chocolateyVersion) -ge [System.Version]::Parse("0.10.4")) { - Write-Output "Adding --no-progress to arguments" $chocolateyArguments.Add("--no-progress") > $null } if($upgradePackageVersion) { - Write-Output "Adding --version to arguments" - $chocolateyArguments.Add("--version") > $null - $chocolateyArguments.Add($upgradePackageVersion) > $null + $chocolateyArguments.Add("--version=`"'$upgradePackageVersion'`"") > $null } if($upgradePre) { - Write-Output "Adding --pre to arguments" $chocolateyArguments.Add("--pre") > $null } if($upgradeSource) { - Write-Output "Adding --source to arguments" - $chocolateyArguments.Add("--version") > $null - $chocolateyArguments.Add($upgradeSource) > $null + $chocolateyArguments.Add("--source=`"'$upgradeSource'`"") > $null } if($except) { - Write-Output "Adding --except to arguments" - $chocolateyArguments.Add("--except") > $null - $chocolateyArguments.Add($except) > $null + $chocolateyArguments.Add("--except=`"'$except'`"") > $null } if($upgradeForce) { - Write-Output "Adding --force to arguments" $chocolateyArguments.Add("--force") > $null } if($upgradeX86) { - Write-Output "Adding --x86 to arguments" $chocolateyArguments.Add("--x86") > $null } if($upgradeInstallArgs) { - Write-Output "Adding --install-arguments to arguments" - $chocolateyArguments.Add("--install-arguments") > $null - $chocolateyArguments.Add($upgradeInstallArgs) > $null + $chocolateyArguments.Add("--install-arguments=`"'$upgradeInstallArgs'`"") > $null } if($upgradeOverride) { - Write-Output "Adding --override-arguments to arguments" $chocolateyArguments.Add("--override-arguments") > $null } if($upgradeParams) { - Write-Output "Adding --package-parameters to arguments" - $chocolateyArguments.Add("--package-parameters") > $null - $chocolateyArguments.Add($upgradeParams) > $null + $chocolateyArguments.Add("--package-parameters=`"'$upgradeParams'`"") > $null } $chocolateyArguments.Insert(0, $upgradePackageId) > $null @@ -378,7 +315,6 @@ try { } if($extraArguments) { - Write-Output "Adding extra arguments" $chocolateyArguments.Add($extraArguments) } From 284004485caec62470fc9e532c7d60997d7a5b4c Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Fri, 23 Nov 2018 22:04:20 +0000 Subject: [PATCH 11/17] (GH-21) Added GRM config file --- GitReleaseManager.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 GitReleaseManager.yaml diff --git a/GitReleaseManager.yaml b/GitReleaseManager.yaml new file mode 100644 index 0000000..e8a95c8 --- /dev/null +++ b/GitReleaseManager.yaml @@ -0,0 +1,12 @@ +issue-labels-include: +- Bug +- Feature +- Improvement +- Documentation +- Breaking change +issue-labels-exclude: +- Build +issue-labels-alias: + - name: Documentation + header: Documentation + plural: Documentation From 11f7e322f3785adfff638e79642b28ca95916519 Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Fri, 23 Nov 2018 22:05:58 +0000 Subject: [PATCH 12/17] (GH-22) Added editorconfig file --- .editorconfig | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8459932 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,23 @@ +; This file is for unifying the coding style for different editors and IDEs. +; More information at http://EditorConfig.org + +root = true + +[*] +end_of_line = CRLF + +[*.ps1] +indent_style = space +indent_size = 2 + +[*.cs] +indent_style = space +indent_size = 4 + +[*.cake] +indent_style = space +indent_size = 4 + +[*.js] +indent_style = tab +indent_size = 2 From 4b740c631d2d5716568ab6785642ec336c1ac7e0 Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Fri, 23 Nov 2018 22:08:17 +0000 Subject: [PATCH 13/17] (GH-23) Added AppVeyor Build --- .appveyor.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .appveyor.yml diff --git a/.appveyor.yml b/.appveyor.yml new file mode 100644 index 0000000..fdae2fd --- /dev/null +++ b/.appveyor.yml @@ -0,0 +1,25 @@ +# Build script +init: + - git config --global core.autocrlf true + +# Build script +build_script: + - ps: .\build.ps1 -Target "AppVeyor" + +# Tests +test: off + +# Branches to build +branches: + # Whitelist + only: + - develop + - master + - /r/.*/ + - /release/.*/ + - /hotfix/.*/ + +# Build cache +cache: +- tools -> build.cake +- node_modules -> package.json From 972a1c1967e87213d4a87c897547bbd40828c6ba Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Fri, 23 Nov 2018 22:17:33 +0000 Subject: [PATCH 14/17] (GH-24) Added repo documentation --- CODEOFCONDUCT.md | 24 ++++++++ CONTRIBUTING.md | 148 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 CODEOFCONDUCT.md create mode 100644 CONTRIBUTING.md diff --git a/CODEOFCONDUCT.md b/CODEOFCONDUCT.md new file mode 100644 index 0000000..630cda6 --- /dev/null +++ b/CODEOFCONDUCT.md @@ -0,0 +1,24 @@ +# Contributor Code of Conduct + +As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. + +We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, or nationality. + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery +- Personal attacks +- Trolling or insulting/derogatory comments +- Public or private harassment +- Publishing other's private information, such as physical or electronic addresses, without explicit permission +- Other unethical or unprofessional conduct + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +By adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team. + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting a project maintainer at [cake-build@outlook.com](mailto:cake-build@outlook.com). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Maintainers are obligated to maintain confidentiality with regard to the reporter of an incident. + +This Code of Conduct is adapted from the Contributor Covenant, version 1.3.0, available from http://contributor-covenant.org/version/1/3/0/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..c2503d8 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,148 @@ +# Contribution Guidelines + +* [Prerequisites](#prerequisites) +* [Definition of trivial contributions](#definition-of-trivial-contributions) +* [Contributing process](#contributing-process) + * [Get buyoff or find open community issues or features](#get-buyoff-or-find-open-community-issues-or-features) + * [Set up your environment](#Set-up-your-environment) + * [Prepare commits](#prepare-commits) + * [Submit pull request](#Submit-pull-request) + * [Respond to feedback on pull request](#respond-to-feedback-on-pull-request) +* [Other general information](#other-general-information) +* [Acknowledgement](#acknowledgement) + +## Prerequisites + +By contributing to this project, you assert that: + +* The contribution is your own original work. +* You have the right to assign the copyright for the work (it is not owned by your employer, or + you have been given copyright assignment in writing). +* You [license](https://github.com/gep13/chocolatey-azuredevops/blob/develop/LICENSE) the contribution under the terms applied to the rest of this project. +* You agree to follow the [code of conduct](https://github.com/gep13/chocolatey-azuredevops/blob/develop/CODEOFCONDUCT.md). + +## Definition of trivial contributions +It's hard to define what is a trivial contribution. Sometimes even a 1 character change can be considered significant. +Unfortunately because it can be subjective, the decision on what is trivial comes from the maintainers of the project +and not from folks contributing to the project. + +What is generally considered trivial: + +* Fixing a typo. +* Documentation changes. +* Fixes to non-production code - like fixing something small in the build code. + +What is generally not considered trivial: + + * Changes to any code that would be delivered as part of the final product. + This includes any scripts that are delivered, such as the PowerShell bootstrapper. + Yes, even 1 character changes could be considered non-trivial. + +## Contributing process +### Get buyoff or find open community issues or features + + * Through GitHub, or through the [Gitter chat](https://gitter.im/gep13/chocolatey-azuredevops) (preferred), + you talk about a feature you would like to see (or a bug), and why it should be included. + * If approved through the Gitter chat, ensure an accompanying GitHub issue is created with + information and a link back to the discussion. + * Once you get a nod from one of the maintainers, you can start on the feature. + * Alternatively, if a feature is on the issues list with the + [help wanted](https://github.com/gep13/chocolatey-azuredevops/labels/help%20wanted) label, + it is open for a community member (contributor) to patch. You should comment that you are signing up for it on the issue so someone else doesn't also sign up for the work. + +### Set up your environment + + * You create, or update, a fork of gep13/chocolatey-azuredeveops under your GitHub account. + * From there you create a branch named specific to the feature. + * In the branch you do work specific to the feature. + * Please also observe the following: + * No reformatting + * No changing files that are not specific to the feature. + * More covered below in the **Prepare commits** section. + * Test your changes and please help us out by updating and implementing some automated tests. + It is recommended that all contributors spend some time looking over the tests in the source code. + You can't go wrong emulating one of the existing tests and then changing it specific to the behavior you are testing. + * Please do not update your branch from the develop unless we ask you to. See the responding to feedback section below. + +### Prepare commits +This section serves to help you understand what makes a good commit. + +A commit should observe the following: + + * A commit is a small logical unit that represents a change. + * Should include new or changed tests relevant to the changes you are making. + * No unnecessary whitespace. Check for whitespace with `git diff --check` and `git diff --cached --check` before commit. + * You can stage parts of a file for commit. + +### Submit pull request +Prerequisites: + + * You are making commits in a feature branch. + * All code should compile without errors or warnings. + * All tests should be passing. + +Submitting PR: + + * Once you feel it is ready, submit the pull request to the `gep13/chocolatey-azuredevops` repository against the `develop` branch + unless specifically requested to submit it against another branch. + * In the case of a larger change that is going to require more discussion, + please submit a PR sooner. Waiting until you are ready may mean more changes than you are + interested in if the changes are taking things in a direction the maintainers do not want to go. + * In the pull request, outline what you did and point to specific conversations (as in URLs) + and issues that you are resolving. This is a tremendous help for us in evaluation and acceptance. + * Once the pull request is in, please do not delete the branch or close the pull request + (unless something is wrong with it). + * One of the team members, or one of the maintainers, will evaluate it within a + reasonable time period (which is to say usually within 1-3 weeks). Some things get evaluated + faster or fast tracked. We are human and we have active lives outside of open source so don't + fret if you haven't seen any activity on your pull request within a month or two. + We don't have a Service Level Agreement (SLA) for pull requests. + Just know that we will evaluate your pull request. + +### Respond to feedback on pull request + +We may have feedback for you to fix or change some things. We generally like to see that pushed against +the same topic branch (it will automatically update the Pull Request). You can also fix/squash/rebase +commits and push the same topic branch with `--force` (it's generally acceptable to do this on topic +branches not in the main repository, it is generally unacceptable and should be avoided at all costs +against the main repository). + +If we have comments or questions when we do evaluate it and receive no response, it will probably +lessen the chance of getting accepted. Eventually, this means it will be closed if it is not accepted. +Please know this doesn't mean we don't value your contribution, just that things go stale. If in the +future you want to pick it back up, feel free to address our concerns/questions/feedback and reopen +the issue/open a new PR (referencing old one). + +Sometimes we may need you to rebase your commit against the latest code before we can review it further. +If this happens, you can do the following: + + * `git fetch upstream` (upstream would be the mainstream repo or `gep13/chocolatey-azuredevops` in this case) + * `git checkout develop` + * `git rebase upstream/develop` + * `git checkout your-branch` + * `git rebase develop` + * Fix any merge conflicts + * `git push origin your-branch` (origin would be your GitHub repo or `your-github-username/chocolatey-azuredevops` in this case). + You may need to `git push origin your-branch --force` to get the commits pushed. + This is generally acceptable with topic branches not in the mainstream repository. + +The only reasons a pull request should be closed and resubmitted are as follows: + + * When the pull request is targeting the wrong branch (this doesn't happen as often). + * When there are updates made to the original by someone other than the original contributor. + Then the old branch is closed with a note on the newer branch this supersedes #github_number. + +## Other general information +If you reformat code or hit core functionality without an approval from a person on the Team, +it's likely that no matter how awesome it looks afterwards, it will probably not get accepted. +Reformatting code makes it harder for us to evaluate exactly what was changed. + +If you do these things, it will be make evaluation and acceptance easy. +Now if you stray outside of the guidelines we have above, it doesn't mean we are going to ignore +your pull request. It will just make things harder for us. +Harder for us roughly translates to a longer SLA for your pull request. + +## Acknowledgement + +This contribution guide was taken from the [Chocolatey project](https://chocolatey.org/) +with permission and was edited to follow conventions and processes used here. From 92cebf80f14657c32acbba478f75f3a8ce700e30 Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Fri, 23 Nov 2018 22:18:00 +0000 Subject: [PATCH 15/17] (GH-20) Make extension public --- vss-extension.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vss-extension.json b/vss-extension.json index e412012..c2f04d1 100644 --- a/vss-extension.json +++ b/vss-extension.json @@ -4,6 +4,7 @@ "version": "0.1.0", "name": "Chocolatey", "publisher": "gep13", + "public": true, "description": "A set of Tasks related to using Chocolatey as part of your Azure DevOps Build Pipelines.", "targets": [ { @@ -78,4 +79,4 @@ "path": "Tasks/chocolatey" } ] -} \ No newline at end of file +} From 2f8a837fa688112159c7cb4df19218c8c0cfc26b Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Fri, 23 Nov 2018 22:43:38 +0000 Subject: [PATCH 16/17] (GH-26) Fix environment variables --- build/parameters.cake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build/parameters.cake b/build/parameters.cake index d407266..2e3b081 100644 --- a/build/parameters.cake +++ b/build/parameters.cake @@ -60,11 +60,11 @@ public class BuildParameters !string.IsNullOrWhiteSpace(buildSystem.AppVeyor.Environment.Repository.Tag.Name) ), GitHub = new BuildCredentials ( - userName: context.EnvironmentVariable("CAKEVSO_GITHUB_USERNAME"), - password: context.EnvironmentVariable("CAKEVSO_GITHUB_PASSWORD") + userName: context.EnvironmentVariable("CHOCOLATEYAZUREDEVOPS_GITHUB_USERNAME"), + password: context.EnvironmentVariable("CHOCOLATEYAZUREDEVOPS_GITHUB_PASSWORD") ), Marketplace = new VisualStudioMarketplaceCredentials ( - token: context.EnvironmentVariable("CAKEVSO_VSMARKETPLACE_TOKEN") + token: context.EnvironmentVariable("CHOCOLATEYAZUREDEVOPS_VSMARKETPLACE_TOKEN") ), IsPublishBuild = new [] { "ReleaseNotes", @@ -76,7 +76,7 @@ public class BuildParameters }.Any( publishTarget => StringComparer.OrdinalIgnoreCase.Equals(publishTarget, target) ), - SkipGitVersion = StringComparer.OrdinalIgnoreCase.Equals("True", context.EnvironmentVariable("CAKE_SKIP_GITVERSION")) + SkipGitVersion = StringComparer.OrdinalIgnoreCase.Equals("True", context.EnvironmentVariable("CHOCOLATEYAZUREDEVOPS_SKIP_GITVERSION")) }; } } From dbea3ba73b68531a7f5d95de6c65c75b256e2f2d Mon Sep 17 00:00:00 2001 From: Gary Ewan Park Date: Fri, 23 Nov 2018 22:46:31 +0000 Subject: [PATCH 17/17] (GH-27) Remove copy/paste errors --- CODEOFCONDUCT.md | 2 +- build.cake | 364 +++++++++++++++++++++--------------------- build/parameters.cake | 206 ++++++++++++------------ build/version.cake | 146 ++++++++--------- 4 files changed, 359 insertions(+), 359 deletions(-) diff --git a/CODEOFCONDUCT.md b/CODEOFCONDUCT.md index 630cda6..6431c83 100644 --- a/CODEOFCONDUCT.md +++ b/CODEOFCONDUCT.md @@ -19,6 +19,6 @@ By adopting this Code of Conduct, project maintainers commit themselves to fairl This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting a project maintainer at [cake-build@outlook.com](mailto:cake-build@outlook.com). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Maintainers are obligated to maintain confidentiality with regard to the reporter of an incident. +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting a project maintainer at [abuse@gep13.co.uk](mailto:abuse@gep13.co.uk). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Maintainers are obligated to maintain confidentiality with regard to the reporter of an incident. This Code of Conduct is adapted from the Contributor Covenant, version 1.3.0, available from http://contributor-covenant.org/version/1/3/0/ diff --git a/build.cake b/build.cake index 7443242..7b584e3 100644 --- a/build.cake +++ b/build.cake @@ -1,182 +1,182 @@ -////////////////////////////////////////////////////////////////////// -// ADDINS -////////////////////////////////////////////////////////////////////// - -#addin "nuget:?package=MagicChunks&version=1.1.0.34" -#addin "nuget:?package=Cake.Tfx&version=0.4.2" -#addin "nuget:?package=Cake.Npm&version=0.7.2" - -////////////////////////////////////////////////////////////////////// -// TOOLS -////////////////////////////////////////////////////////////////////// - -#tool "nuget:?package=gitreleasemanager&version=0.6.0" -#tool "nuget:?package=GitVersion.CommandLine&version=3.6.4" - -// Load other scripts. -#load "./build/parameters.cake" - -////////////////////////////////////////////////////////////////////// -// PARAMETERS -////////////////////////////////////////////////////////////////////// - -BuildParameters parameters = BuildParameters.GetParameters(Context, BuildSystem); -bool publishingError = false; - -/////////////////////////////////////////////////////////////////////////////// -// SETUP / TEARDOWN -/////////////////////////////////////////////////////////////////////////////// - -Setup(context => -{ - parameters.SetBuildVersion( - BuildVersion.CalculatingSemanticVersion( - context: Context, - parameters: parameters - ) - ); - - // Increase verbosity? - if(parameters.IsMasterCakeVsoBranch && (context.Log.Verbosity != Verbosity.Diagnostic)) { - Information("Increasing verbosity to diagnostic."); - context.Log.Verbosity = Verbosity.Diagnostic; - } - - Information("Building version {0} of cake-vso ({1}, {2}) using version {3} of Cake. (IsTagged: {4})", - parameters.Version.SemVersion, - parameters.Configuration, - parameters.Target, - parameters.Version.CakeVersion, - parameters.IsTagged); -}); - -////////////////////////////////////////////////////////////////////// -// TASKS -////////////////////////////////////////////////////////////////////// - -Task("Clean") - .Does(() => -{ - CleanDirectories(new[] { "./build-results" }); -}); - -Task("Install-Tfx-Cli") - .Does(() => -{ - Npm.WithLogLevel(NpmLogLevel.Silent).FromPath(".").Install(settings => settings.Package("tfx-cli").Globally()); -}); - -Task("Create-Release-Notes") - .Does(() => -{ - GitReleaseManagerCreate(parameters.GitHub.UserName, parameters.GitHub.Password, "cake-build", "cake-vso", new GitReleaseManagerCreateSettings { - Milestone = parameters.Version.Milestone, - Name = parameters.Version.Milestone, - Prerelease = true, - TargetCommitish = "master" - }); -}); - -Task("Update-Json-Versions") - .Does(() => -{ - var projectToPackagePackageJson = "vss-extension.json"; - Information("Updating {0} version -> {1}", projectToPackagePackageJson, parameters.Version.SemVersion); - - TransformConfig(projectToPackagePackageJson, projectToPackagePackageJson, new TransformationCollection { - { "version", parameters.Version.SemVersion } - }); - - var taskJson = "Tasks/chocolatey/task.json"; - Information("Updating {0} version -> {1}", taskJson, parameters.Version.SemVersion); - - TransformConfig(taskJson, taskJson, new TransformationCollection { - { "version/Major", parameters.Version.Major } - }); - - TransformConfig(taskJson, taskJson, new TransformationCollection { - { "version/Minor", parameters.Version.Minor } - }); - - TransformConfig(taskJson, taskJson, new TransformationCollection { - { "version/Patch", parameters.Version.Patch } - }); -}); - -Task("Package-Extension") - .IsDependentOn("Update-Json-Versions") - .IsDependentOn("Install-Tfx-Cli") - .IsDependentOn("Clean") - .Does(() => -{ - var buildResultDir = Directory("./build-results"); - - TfxExtensionCreate(new TfxExtensionCreateSettings() - { - ManifestGlobs = new List(){ "./vss-extension.json" }, - OutputPath = buildResultDir - }); -}); - -Task("Publish-GitHub-Release") - .WithCriteria(() => parameters.ShouldPublish) - .Does(() => -{ - var buildResultDir = Directory("./build-results"); - var packageFile = File("cake-build.cake-" + parameters.Version.SemVersion + ".vsix"); - - GitReleaseManagerAddAssets(parameters.GitHub.UserName, parameters.GitHub.Password, "cake-build", "cake-vso", parameters.Version.Milestone, buildResultDir + packageFile); - GitReleaseManagerClose(parameters.GitHub.UserName, parameters.GitHub.Password, "cake-build", "cake-vso", parameters.Version.Milestone); -}) -.OnError(exception => -{ - Information("Publish-GitHub-Release Task failed, but continuing with next Task..."); - publishingError = true; -}); - -Task("Publish-Extension") - .IsDependentOn("Package-Extension") - .WithCriteria(() => parameters.ShouldPublish) - .Does(() => -{ - var buildResultDir = Directory("./build-results"); - var packageFile = File("cake-build.cake-" + parameters.Version.SemVersion + ".vsix"); - - TfxExtensionPublish(buildResultDir + packageFile, new TfxExtensionPublishSettings() - { - AuthType = TfxAuthType.Pat, - Token = parameters.Marketplace.Token - }); -}) -.OnError(exception => -{ - Information("Publish-Extension Task failed, but continuing with next Task..."); - publishingError = true; -}); - -////////////////////////////////////////////////////////////////////// -// TASK TARGETS -////////////////////////////////////////////////////////////////////// - -Task("Default") - .IsDependentOn("Package-Extension"); - -Task("Appveyor") - .IsDependentOn("Publish-Extension") - .IsDependentOn("Publish-GitHub-Release") - .Finally(() => -{ - if(publishingError) - { - throw new Exception("An error occurred during the publishing of cake-vscode. All publishing tasks have been attempted."); - } -}); - -Task("ReleaseNotes") - .IsDependentOn("Create-Release-Notes"); - -////////////////////////////////////////////////////////////////////// -// EXECUTION -////////////////////////////////////////////////////////////////////// - -RunTarget(parameters.Target); +////////////////////////////////////////////////////////////////////// +// ADDINS +////////////////////////////////////////////////////////////////////// + +#addin "nuget:?package=MagicChunks&version=1.1.0.34" +#addin "nuget:?package=Cake.Tfx&version=0.4.2" +#addin "nuget:?package=Cake.Npm&version=0.7.2" + +////////////////////////////////////////////////////////////////////// +// TOOLS +////////////////////////////////////////////////////////////////////// + +#tool "nuget:?package=gitreleasemanager&version=0.7.1" +#tool "nuget:?package=GitVersion.CommandLine&version=3.6.4" + +// Load other scripts. +#load "./build/parameters.cake" + +////////////////////////////////////////////////////////////////////// +// PARAMETERS +////////////////////////////////////////////////////////////////////// + +BuildParameters parameters = BuildParameters.GetParameters(Context, BuildSystem); +bool publishingError = false; + +/////////////////////////////////////////////////////////////////////////////// +// SETUP / TEARDOWN +/////////////////////////////////////////////////////////////////////////////// + +Setup(context => +{ + parameters.SetBuildVersion( + BuildVersion.CalculatingSemanticVersion( + context: Context, + parameters: parameters + ) + ); + + // Increase verbosity? + if(parameters.IsMasterBranch && (context.Log.Verbosity != Verbosity.Diagnostic)) { + Information("Increasing verbosity to diagnostic."); + context.Log.Verbosity = Verbosity.Diagnostic; + } + + Information("Building version {0} of chocolatey-azuredevops ({1}, {2}) using version {3} of Cake. (IsTagged: {4})", + parameters.Version.SemVersion, + parameters.Configuration, + parameters.Target, + parameters.Version.CakeVersion, + parameters.IsTagged); +}); + +////////////////////////////////////////////////////////////////////// +// TASKS +////////////////////////////////////////////////////////////////////// + +Task("Clean") + .Does(() => +{ + CleanDirectories(new[] { "./build-results" }); +}); + +Task("Install-Tfx-Cli") + .Does(() => +{ + Npm.WithLogLevel(NpmLogLevel.Silent).FromPath(".").Install(settings => settings.Package("tfx-cli").Globally()); +}); + +Task("Create-Release-Notes") + .Does(() => +{ + GitReleaseManagerCreate(parameters.GitHub.UserName, parameters.GitHub.Password, "gep13", "chocolatey-azuredevops", new GitReleaseManagerCreateSettings { + Milestone = parameters.Version.Milestone, + Name = parameters.Version.Milestone, + Prerelease = true, + TargetCommitish = "master" + }); +}); + +Task("Update-Json-Versions") + .Does(() => +{ + var projectToPackagePackageJson = "vss-extension.json"; + Information("Updating {0} version -> {1}", projectToPackagePackageJson, parameters.Version.SemVersion); + + TransformConfig(projectToPackagePackageJson, projectToPackagePackageJson, new TransformationCollection { + { "version", parameters.Version.SemVersion } + }); + + var taskJson = "Tasks/chocolatey/task.json"; + Information("Updating {0} version -> {1}", taskJson, parameters.Version.SemVersion); + + TransformConfig(taskJson, taskJson, new TransformationCollection { + { "version/Major", parameters.Version.Major } + }); + + TransformConfig(taskJson, taskJson, new TransformationCollection { + { "version/Minor", parameters.Version.Minor } + }); + + TransformConfig(taskJson, taskJson, new TransformationCollection { + { "version/Patch", parameters.Version.Patch } + }); +}); + +Task("Package-Extension") + .IsDependentOn("Update-Json-Versions") + .IsDependentOn("Install-Tfx-Cli") + .IsDependentOn("Clean") + .Does(() => +{ + var buildResultDir = Directory("./build-results"); + + TfxExtensionCreate(new TfxExtensionCreateSettings() + { + ManifestGlobs = new List(){ "./vss-extension.json" }, + OutputPath = buildResultDir + }); +}); + +Task("Publish-GitHub-Release") + .WithCriteria(() => parameters.ShouldPublish) + .Does(() => +{ + var buildResultDir = Directory("./build-results"); + var packageFile = File("cake-build.cake-" + parameters.Version.SemVersion + ".vsix"); + + GitReleaseManagerAddAssets(parameters.GitHub.UserName, parameters.GitHub.Password, "gep13", "chocolatey-azuredevops", parameters.Version.Milestone, buildResultDir + packageFile); + GitReleaseManagerClose(parameters.GitHub.UserName, parameters.GitHub.Password, "gep13", "chocolatey-azuredevops", parameters.Version.Milestone); +}) +.OnError(exception => +{ + Information("Publish-GitHub-Release Task failed, but continuing with next Task..."); + publishingError = true; +}); + +Task("Publish-Extension") + .IsDependentOn("Package-Extension") + .WithCriteria(() => parameters.ShouldPublish) + .Does(() => +{ + var buildResultDir = Directory("./build-results"); + var packageFile = File("cake-build.cake-" + parameters.Version.SemVersion + ".vsix"); + + TfxExtensionPublish(buildResultDir + packageFile, new TfxExtensionPublishSettings() + { + AuthType = TfxAuthType.Pat, + Token = parameters.Marketplace.Token + }); +}) +.OnError(exception => +{ + Information("Publish-Extension Task failed, but continuing with next Task..."); + publishingError = true; +}); + +////////////////////////////////////////////////////////////////////// +// TASK TARGETS +////////////////////////////////////////////////////////////////////// + +Task("Default") + .IsDependentOn("Package-Extension"); + +Task("Appveyor") + .IsDependentOn("Publish-Extension") + .IsDependentOn("Publish-GitHub-Release") + .Finally(() => +{ + if(publishingError) + { + throw new Exception("An error occurred during the publishing of cake-vscode. All publishing tasks have been attempted."); + } +}); + +Task("ReleaseNotes") + .IsDependentOn("Create-Release-Notes"); + +////////////////////////////////////////////////////////////////////// +// EXECUTION +////////////////////////////////////////////////////////////////////// + +RunTarget(parameters.Target); diff --git a/build/parameters.cake b/build/parameters.cake index 2e3b081..b52dac7 100644 --- a/build/parameters.cake +++ b/build/parameters.cake @@ -1,104 +1,104 @@ -#load "./version.cake" - -public class BuildParameters -{ - public string Target { get; private set; } - public string Configuration { get; private set; } - public bool IsLocalBuild { get; private set; } - public bool IsRunningOnUnix { get; private set; } - public bool IsRunningOnWindows { get; private set; } - public bool IsRunningOnAppVeyor { get; private set; } - public bool IsPullRequest { get; private set; } - public bool IsMasterCakeVsoRepo { get; private set; } - public bool IsMasterCakeVsoBranch { get; private set; } - public bool IsTagged { get; private set; } - public bool IsPublishBuild { get; private set; } - public bool IsReleaseBuild { get; private set; } - public bool SkipGitVersion { get; private set; } - public BuildCredentials GitHub { get; private set; } - public VisualStudioMarketplaceCredentials Marketplace { get; private set; } - public BuildVersion Version { get; private set; } - - public bool ShouldPublish - { - get - { - return !IsLocalBuild && !IsPullRequest && IsMasterCakeVsoRepo - && IsMasterCakeVsoBranch && IsTagged; - } - } - - public void SetBuildVersion(BuildVersion version) - { - Version = version; - } - - public static BuildParameters GetParameters( - ICakeContext context, - BuildSystem buildSystem - ) - { - if (context == null) - { - throw new ArgumentNullException("context"); - } - - var target = context.Argument("target", "Default"); - - return new BuildParameters { - Target = target, - Configuration = context.Argument("configuration", "Release"), - IsLocalBuild = buildSystem.IsLocalBuild, - IsRunningOnUnix = context.IsRunningOnUnix(), - IsRunningOnWindows = context.IsRunningOnWindows(), - IsRunningOnAppVeyor = buildSystem.AppVeyor.IsRunningOnAppVeyor, - IsPullRequest = buildSystem.AppVeyor.Environment.PullRequest.IsPullRequest, - IsMasterCakeVsoRepo = StringComparer.OrdinalIgnoreCase.Equals("cake-build/cake-vso", buildSystem.AppVeyor.Environment.Repository.Name), - IsMasterCakeVsoBranch = StringComparer.OrdinalIgnoreCase.Equals("master", buildSystem.AppVeyor.Environment.Repository.Branch), - IsTagged = ( - buildSystem.AppVeyor.Environment.Repository.Tag.IsTag && - !string.IsNullOrWhiteSpace(buildSystem.AppVeyor.Environment.Repository.Tag.Name) - ), - GitHub = new BuildCredentials ( - userName: context.EnvironmentVariable("CHOCOLATEYAZUREDEVOPS_GITHUB_USERNAME"), - password: context.EnvironmentVariable("CHOCOLATEYAZUREDEVOPS_GITHUB_PASSWORD") - ), - Marketplace = new VisualStudioMarketplaceCredentials ( - token: context.EnvironmentVariable("CHOCOLATEYAZUREDEVOPS_VSMARKETPLACE_TOKEN") - ), - IsPublishBuild = new [] { - "ReleaseNotes", - "Create-Release-Notes" - }.Any( - releaseTarget => StringComparer.OrdinalIgnoreCase.Equals(releaseTarget, target) - ), - IsReleaseBuild = new string[] { - }.Any( - publishTarget => StringComparer.OrdinalIgnoreCase.Equals(publishTarget, target) - ), +#load "./version.cake" + +public class BuildParameters +{ + public string Target { get; private set; } + public string Configuration { get; private set; } + public bool IsLocalBuild { get; private set; } + public bool IsRunningOnUnix { get; private set; } + public bool IsRunningOnWindows { get; private set; } + public bool IsRunningOnAppVeyor { get; private set; } + public bool IsPullRequest { get; private set; } + public bool IsMasterRepo { get; private set; } + public bool IsMasterBranch { get; private set; } + public bool IsTagged { get; private set; } + public bool IsPublishBuild { get; private set; } + public bool IsReleaseBuild { get; private set; } + public bool SkipGitVersion { get; private set; } + public BuildCredentials GitHub { get; private set; } + public VisualStudioMarketplaceCredentials Marketplace { get; private set; } + public BuildVersion Version { get; private set; } + + public bool ShouldPublish + { + get + { + return !IsLocalBuild && !IsPullRequest && IsMasterRepo + && IsMasterBranch && IsTagged; + } + } + + public void SetBuildVersion(BuildVersion version) + { + Version = version; + } + + public static BuildParameters GetParameters( + ICakeContext context, + BuildSystem buildSystem + ) + { + if (context == null) + { + throw new ArgumentNullException("context"); + } + + var target = context.Argument("target", "Default"); + + return new BuildParameters { + Target = target, + Configuration = context.Argument("configuration", "Release"), + IsLocalBuild = buildSystem.IsLocalBuild, + IsRunningOnUnix = context.IsRunningOnUnix(), + IsRunningOnWindows = context.IsRunningOnWindows(), + IsRunningOnAppVeyor = buildSystem.AppVeyor.IsRunningOnAppVeyor, + IsPullRequest = buildSystem.AppVeyor.Environment.PullRequest.IsPullRequest, + IsMasterRepo = StringComparer.OrdinalIgnoreCase.Equals("gep13/chocolatey-azuredevops", buildSystem.AppVeyor.Environment.Repository.Name), + IsMasterBranch = StringComparer.OrdinalIgnoreCase.Equals("master", buildSystem.AppVeyor.Environment.Repository.Branch), + IsTagged = ( + buildSystem.AppVeyor.Environment.Repository.Tag.IsTag && + !string.IsNullOrWhiteSpace(buildSystem.AppVeyor.Environment.Repository.Tag.Name) + ), + GitHub = new BuildCredentials ( + userName: context.EnvironmentVariable("CHOCOLATEYAZUREDEVOPS_GITHUB_USERNAME"), + password: context.EnvironmentVariable("CHOCOLATEYAZUREDEVOPS_GITHUB_PASSWORD") + ), + Marketplace = new VisualStudioMarketplaceCredentials ( + token: context.EnvironmentVariable("CHOCOLATEYAZUREDEVOPS_VSMARKETPLACE_TOKEN") + ), + IsPublishBuild = new [] { + "ReleaseNotes", + "Create-Release-Notes" + }.Any( + releaseTarget => StringComparer.OrdinalIgnoreCase.Equals(releaseTarget, target) + ), + IsReleaseBuild = new string[] { + }.Any( + publishTarget => StringComparer.OrdinalIgnoreCase.Equals(publishTarget, target) + ), SkipGitVersion = StringComparer.OrdinalIgnoreCase.Equals("True", context.EnvironmentVariable("CHOCOLATEYAZUREDEVOPS_SKIP_GITVERSION")) - }; - } -} - -public class BuildCredentials -{ - public string UserName { get; private set; } - public string Password { get; private set; } - - public BuildCredentials(string userName, string password) - { - UserName = userName; - Password = password; - } -} - -public class VisualStudioMarketplaceCredentials -{ - public string Token { get; private set; } - - public VisualStudioMarketplaceCredentials(string token) - { - Token = token; - } -} + }; + } +} + +public class BuildCredentials +{ + public string UserName { get; private set; } + public string Password { get; private set; } + + public BuildCredentials(string userName, string password) + { + UserName = userName; + Password = password; + } +} + +public class VisualStudioMarketplaceCredentials +{ + public string Token { get; private set; } + + public VisualStudioMarketplaceCredentials(string token) + { + Token = token; + } +} diff --git a/build/version.cake b/build/version.cake index 4935fe8..e867184 100644 --- a/build/version.cake +++ b/build/version.cake @@ -1,73 +1,73 @@ -public class BuildVersion -{ - public string Version { get; private set; } - public string SemVersion { get; private set; } - public string Milestone { get; private set; } - public string CakeVersion { get; private set; } - public string Major { get; private set; } - public string Minor { get; private set; } - public string Patch { get; private set; } - - public static BuildVersion CalculatingSemanticVersion( - ICakeContext context, - BuildParameters parameters - ) - { - if (context == null) - { - throw new ArgumentNullException("context"); - } - - string version = null; - string semVersion = null; - string milestone = null; - string major = null; - string minor = null; - string patch = null; - - if (!parameters.SkipGitVersion) - { - context.Information("Calculating Semantic Version"); - if (!parameters.IsLocalBuild || parameters.IsPublishBuild || parameters.IsReleaseBuild) - { - context.GitVersion(new GitVersionSettings{ - OutputType = GitVersionOutput.BuildServer - }); - - version = context.EnvironmentVariable("GitVersion_MajorMinorPatch"); - semVersion = context.EnvironmentVariable("GitVersion_LegacySemVerPadded"); - milestone = string.Concat("v", version); - major = context.EnvironmentVariable("GitVersion_Major"); - minor = context.EnvironmentVariable("GitVersion_Minor"); - patch = context.EnvironmentVariable("GitVersion_Patch"); - } - - GitVersion assertedVersions = context.GitVersion(new GitVersionSettings - { - OutputType = GitVersionOutput.Json, - }); - - version = assertedVersions.MajorMinorPatch; - semVersion = assertedVersions.LegacySemVerPadded; - milestone = string.Concat("v", version); - major = assertedVersions.Major.ToString(); - minor = assertedVersions.Minor.ToString(); - patch = assertedVersions.Patch.ToString(); - - context.Information("Calculated Semantic Version: {0}", semVersion); - } - - var cakeVersion = typeof(ICakeContext).Assembly.GetName().Version.ToString(); - - return new BuildVersion - { - Version = version, - SemVersion = semVersion, - Milestone = milestone, - CakeVersion = cakeVersion, - Major = major, - Minor = minor, - Patch = patch - }; - } -} +public class BuildVersion +{ + public string Version { get; private set; } + public string SemVersion { get; private set; } + public string Milestone { get; private set; } + public string CakeVersion { get; private set; } + public string Major { get; private set; } + public string Minor { get; private set; } + public string Patch { get; private set; } + + public static BuildVersion CalculatingSemanticVersion( + ICakeContext context, + BuildParameters parameters + ) + { + if (context == null) + { + throw new ArgumentNullException("context"); + } + + string version = null; + string semVersion = null; + string milestone = null; + string major = null; + string minor = null; + string patch = null; + + if (!parameters.SkipGitVersion) + { + context.Information("Calculating Semantic Version"); + if (!parameters.IsLocalBuild || parameters.IsPublishBuild || parameters.IsReleaseBuild) + { + context.GitVersion(new GitVersionSettings{ + OutputType = GitVersionOutput.BuildServer + }); + + version = context.EnvironmentVariable("GitVersion_MajorMinorPatch"); + semVersion = context.EnvironmentVariable("GitVersion_LegacySemVerPadded"); + milestone = string.Concat("v", version); + major = context.EnvironmentVariable("GitVersion_Major"); + minor = context.EnvironmentVariable("GitVersion_Minor"); + patch = context.EnvironmentVariable("GitVersion_Patch"); + } + + GitVersion assertedVersions = context.GitVersion(new GitVersionSettings + { + OutputType = GitVersionOutput.Json, + }); + + version = assertedVersions.MajorMinorPatch; + semVersion = assertedVersions.LegacySemVerPadded; + milestone = version; + major = assertedVersions.Major.ToString(); + minor = assertedVersions.Minor.ToString(); + patch = assertedVersions.Patch.ToString(); + + context.Information("Calculated Semantic Version: {0}", semVersion); + } + + var cakeVersion = typeof(ICakeContext).Assembly.GetName().Version.ToString(); + + return new BuildVersion + { + Version = version, + SemVersion = semVersion, + Milestone = milestone, + CakeVersion = cakeVersion, + Major = major, + Minor = minor, + Patch = patch + }; + } +}