From 5e1215aa7f3eadfabaadfd845dc1f249526a1b1e Mon Sep 17 00:00:00 2001 From: Andy Cross Date: Sat, 22 Jul 2017 13:06:44 +0100 Subject: [PATCH] #72 Deploy with Chocolatey (#131) --- scripts/choco/package.ps1 | 35 +++++++ scripts/choco/parq/parq.nuspec | 24 +++++ scripts/choco/parq/tools/ReadMe.md | 91 +++++++++++++++++++ .../choco/parq/tools/chocolateyinstall.ps1 | 6 ++ .../choco/parq/tools/chocolateyuninstall.ps1 | 82 +++++++++++++++++ src/parq/AppSettings.cs | 2 + src/parq/Program.cs | 12 +++ src/parq/parq.csproj | 3 + 8 files changed, 255 insertions(+) create mode 100644 scripts/choco/package.ps1 create mode 100644 scripts/choco/parq/parq.nuspec create mode 100644 scripts/choco/parq/tools/ReadMe.md create mode 100644 scripts/choco/parq/tools/chocolateyinstall.ps1 create mode 100644 scripts/choco/parq/tools/chocolateyuninstall.ps1 diff --git a/scripts/choco/package.ps1 b/scripts/choco/package.ps1 new file mode 100644 index 000000000..9a4eb478f --- /dev/null +++ b/scripts/choco/package.ps1 @@ -0,0 +1,35 @@ +# Build +Set-Location ..\..\src\parq +dotnet restore -r win10-x64 +dotnet publish -c release -r win10-x64 -o ..\..\scripts\choco\build -f netcoreapp1.1 + +# Get Version +Set-Location ..\..\scripts\choco\build +$version = .\parq.exe ShowVersion=true + +Write-Host The Version of Parq built is $version + +# Zip +Add-Type -assembly "System.IO.Compression.FileSystem" +[System.IO.Compression.ZipFile]::CreateFromDirectory((Get-Location).Path, [System.IO.Path]::Combine((Get-Location).Path, "..\parq\tools\parqInstall.zip")) + +# Package +Set-Location ..\parq +# Update Version Number +$xml = [xml](Get-Content .\parq.nuspec) +$nsmgr = new-object System.Xml.XmlNamespaceManager($xml.NameTable); +$nsmgr.AddNamespace("nuspec", "http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd") + +$xml.SelectNodes("//nuspec:version", $nsmgr) | % { + $_."#text" = $version.ToString() + } + +$xml.Save((Get-Location).Path + "\parq.nuspec") +Write-Host Updated Nuspec with version number and will now begin to package. +choco pack +choco push .\parq.$version.nupkg -k $env:elastacloudKey + +# Clean +Set-Location .. +Remove-Item build -Recurse +Remove-Item .\parq\tools\parqInstall.zip \ No newline at end of file diff --git a/scripts/choco/parq/parq.nuspec b/scripts/choco/parq/parq.nuspec new file mode 100644 index 000000000..0ee205204 --- /dev/null +++ b/scripts/choco/parq/parq.nuspec @@ -0,0 +1,24 @@ + + + + + + parq + parq (Install) + 1.0.1.0 + Andy Cross, Richard Conway, Ivan Gavryliuk + Andy Cross + Parq is a .NET runtime (written for Windows but will run elsewhere) that brings tooling for inspecting Parquet files to developers. + (Find out more)[https://github.com/elastacloud/parquet-dotnet/blob/master/doc/parq.md] + + https://github.com/elastacloud/parquet-dotnet + https://chocolatey.org/api/v2/ + parq parquet fileviewer + Elastacloud Limited 2017 + https://github.com/elastacloud/parquet-dotnet/blob/master/LICENSE + false + + + + + \ No newline at end of file diff --git a/scripts/choco/parq/tools/ReadMe.md b/scripts/choco/parq/tools/ReadMe.md new file mode 100644 index 000000000..1c9051281 --- /dev/null +++ b/scripts/choco/parq/tools/ReadMe.md @@ -0,0 +1,91 @@ +## Summary +How do I create packages? See https://github.com/chocolatey/choco/wiki/CreatePackages + +If you are submitting packages to the community feed (https://chocolatey.org) +always try to ensure you have read, understood and adhere to the create +packages wiki link above. + +## Automatic Packages? +Consider making this package an automatic package, for the best +maintainability over time. Read up at https://github.com/chocolatey/choco/wiki/AutomaticPackages + +## Shim Generation +Any executables you include in the package or download (but don't call +install against using the built-in functions) will be automatically shimmed. + +This means those executables will automatically be included on the path. +Shim generation runs whether the package is self-contained or uses automation +scripts. + +By default, these are considered console applications. + +If the application is a GUI, you should create an empty file next to the exe +named 'name.exe.gui' e.g. 'bob.exe' would need a file named 'bob.exe.gui'. +See https://github.com/chocolatey/choco/wiki/CreatePackages#how-do-i-set-up-batch-redirects-for-applications-that-have-a-gui + +If you want to ignore the executable, create an empty file next to the exe +named 'name.exe.ignore' e.g. 'bob.exe' would need a file named +'bob.exe.ignore'. +See https://github.com/chocolatey/choco/wiki/CreatePackages#how-do-i-exclude-executables-from-getting-batch-redirects + +## Self-Contained? +If you have a self-contained package, you can remove the automation scripts +entirely and just include the executables, they will automatically get shimmed, +which puts them on the path. Ensure you have the legal right to distribute +the application though. See https://github.com/chocolatey/choco/wiki/Legal. + +You should read up on the Shim Generation section to familiarize yourself +on what to do with GUI applications and/or ignoring shims. + +## Automation Scripts +You have a powerful use of Chocolatey, as you are using PowerShell. So you +can do just about anything you need. Choco has some very handy built-in +functions that you can use, these are sometimes called the helpers. + +### Built-In Functions +https://github.com/chocolatey/choco/wiki/HelpersReference + +A note about a couple: +* Get-BinRoot - this is a horribly named function that doesn't do what new folks think it does. It gets you the 'tools' root, which by default is set to 'c:\tools', not the chocolateyInstall bin folder. +* Install-BinFile - used for non-exe files - executables are automatically shimmed... +* Uninstall-BinFile - used for non-exe files - executables are automatically shimmed + +### Getting package specific information +Use the package parameters pattern - see https://github.com/chocolatey/choco/wiki/How-To-Parse-PackageParameters-Argument + +### Need to mount an ISO? +https://github.com/chocolatey/choco/wiki/How-To-Mount-An-Iso-In-Chocolatey-Package + + +### Environment Variables +Chocolatey makes a number of environment variables available (You can access any of these with $env:TheVariableNameBelow): + + * TEMP = Overridden to the CacheLocation, but may be the same as the original TEMP folder + * ChocolateyInstall = Top level folder where Chocolatey is installed + * chocolateyPackageName = The name of the package, equivalent to the id in the nuspec (0.9.9+) + * chocolateyPackageVersion = The version of the package, equivalent to the version in the nuspec (0.9.9+) + * chocolateyPackageFolder = The top level location of the package folder + +#### Advanced Environment Variables +The following are more advanced settings: + + * chocolateyPackageParameters = (0.9.8.22+) + * CHOCOLATEY_VERSION = The version of Choco you normally see. Use if you are 'lighting' things up based on choco version. (0.9.9+) + - Otherwise take a dependency on the specific version you need. + * chocolateyForceX86 = If available and set to 'true', then user has requested 32bit version. (0.9.9+) + - Automatically handled in built in Choco functions. + * OS_PLATFORM = Like Windows, OSX, Linux. (0.9.9+) + * OS_VERSION = The version of OS, like 6.1 something something for Windows. (0.9.9+) + * OS_NAME = The reported name of the OS. (0.9.9+) + * IS_PROCESSELEVATED = Is the process elevated? (0.9.9+) + +#### Experimental Environment Variables +The following are experimental or use not recommended: + + * OS_IS64BIT = This may not return correctly - it may depend on the process the app is running under (0.9.9+) + * CHOCOLATEY_VERSION_PRODUCT = the version of Choco that may match CHOCOLATEY_VERSION but may be different (0.9.9+) + - it's based on git describe + * IS_ADMIN = Is the user an administrator? But doesn't tell you if the process is elevated. (0.9.9+) + * chocolateyInstallOverride = Not for use in package automation scripts. (0.9.9+) + * chocolateyInstallArguments = the installer arguments meant for the native installer. You should use chocolateyPackageParameters intead. (0.9.9+) + diff --git a/scripts/choco/parq/tools/chocolateyinstall.ps1 b/scripts/choco/parq/tools/chocolateyinstall.ps1 new file mode 100644 index 000000000..89e4cbb3b --- /dev/null +++ b/scripts/choco/parq/tools/chocolateyinstall.ps1 @@ -0,0 +1,6 @@ +Set-Location C:\ProgramData\Chocolatey\lib\parq\tools +Add-Type -assembly "System.IO.Compression.FileSystem" + +[System.IO.Compression.ZipFile]::ExtractToDirectory([System.IO.Path]::Combine((Get-Location).Path, "parqInstall.zip"), $pwd) + +Set-Content -Path %ChocolateyInstall%\bin\parq.cmd -Value "%ChocolateyInstall%\lib\parq\tools\parq.exe" -Encoding Ascii \ No newline at end of file diff --git a/scripts/choco/parq/tools/chocolateyuninstall.ps1 b/scripts/choco/parq/tools/chocolateyuninstall.ps1 new file mode 100644 index 000000000..c2c76f3b2 --- /dev/null +++ b/scripts/choco/parq/tools/chocolateyuninstall.ps1 @@ -0,0 +1,82 @@ +# IMPORTANT: Before releasing this package, copy/paste the next 2 lines into PowerShell to remove all comments from this file: +# $f='c:\path\to\thisFile.ps1' +# gc $f | ? {$_ -notmatch "^\s*#"} | % {$_ -replace '(^.*?)\s*?[^``]#.*','$1'} | Out-File $f+".~" -en utf8; mv -fo $f+".~" $f + +# If this is an MSI, cleaning up comments is all you need. +# If this is an exe, change installerType and silentArgs +# Auto Uninstaller should be able to detect and handle registry uninstalls (if it is turned on, it is in preview for 0.9.9). + +$ErrorActionPreference = 'Stop'; # stop on all errors + +$packageName = 'parq' +$softwareName = 'parq*' #part or all of the Display Name as you see it in Programs and Features. It should be enough to be unique +$installerType = 'MSI' +#$installerType = 'EXE' + +$silentArgs = '/qn /norestart' +# https://msdn.microsoft.com/en-us/library/aa376931(v=vs.85).aspx +$validExitCodes = @(0, 3010, 1605, 1614, 1641) +if ($installerType -ne 'MSI') { + # The below is somewhat naive and built for EXE installers + # Uncomment matching EXE type (sorted by most to least common) + #$silentArgs = '/S' # NSIS + #$silentArgs = '/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-' # Inno Setup + #$silentArgs = '/s' # InstallShield + #$silentArgs = '/s /v"/qn"' # InstallShield with MSI + #$silentArgs = '/s' # Wise InstallMaster + #$silentArgs = '-s' # Squirrel + #$silentArgs = '-q' # Install4j + #$silentArgs = '-s -u' # Ghost + # Note that some installers, in addition to the silentArgs above, may also need assistance of AHK to achieve silence. + #$silentArgs = '' # none; make silent with input macro script like AutoHotKey (AHK) + # https://chocolatey.org/packages/autohotkey.portable + $validExitCodes = @(0) +} + +$uninstalled = $false +$local_key = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machine_key = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machine_key6432 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' + +$key = Get-ItemProperty -Path @($machine_key6432,$machine_key, $local_key) ` + -ErrorAction SilentlyContinue ` + | ? { $_.DisplayName -like "$softwareName" } + +if ($key.Count -eq 1) { + $key | % { + $file = "$($_.UninstallString)" + + if ($installerType -eq 'MSI') { + # The Product Code GUID is all that should be passed for MSI, and very + # FIRST, because it comes directly after /x, which is already set in the + # Uninstall-ChocolateyPackage msiargs (facepalm). + $silentArgs = "$($_.PSChildName) $silentArgs" + + # Don't pass anything for file, it is ignored for msi (facepalm number 2) + # Alternatively if you need to pass a path to an msi, determine that and + # use it instead of the above in silentArgs, still very first + $file = '' + } + + Uninstall-ChocolateyPackage -PackageName $packageName ` + -FileType $installerType ` + -SilentArgs "$silentArgs" ` + -ValidExitCodes $validExitCodes ` + -File "$file" + } +} elseif ($key.Count -eq 0) { + Write-Warning "$packageName has already been uninstalled by other means." +} elseif ($key.Count -gt 1) { + Write-Warning "$key.Count matches found!" + Write-Warning "To prevent accidental data loss, no programs will be uninstalled." + Write-Warning "Please alert package maintainer the following keys were matched:" + $key | % {Write-Warning "- $_.DisplayName"} +} + + +## OTHER HELPERS +## https://github.com/chocolatey/choco/wiki/HelpersReference +#Uninstall-ChocolateyZipPackage +#Uninstall-BinFile # Only needed if you added one in the installer script, choco will remove the ones it added automatically. +#remove any shortcuts you added + diff --git a/src/parq/AppSettings.cs b/src/parq/AppSettings.cs index 420f555dd..f1ac15ac8 100644 --- a/src/parq/AppSettings.cs +++ b/src/parq/AppSettings.cs @@ -19,6 +19,8 @@ class AppSettings : SettingsContainer public readonly Option TruncationIdentifier = new Option("*"); + public readonly Option ShowVersion = new Option(false); + //singleton private static AppSettings instance; public static AppSettings Instance => instance ?? (instance = new AppSettings()); diff --git a/src/parq/Program.cs b/src/parq/Program.cs index 84467ba68..ea1d5c7ee 100644 --- a/src/parq/Program.cs +++ b/src/parq/Program.cs @@ -11,6 +11,12 @@ class Program { static void Main(string[] args) { + if (AppSettings.Instance.ShowVersion) + { + Console.WriteLine(GetVersionNumber(typeof(Program).AssemblyQualifiedName)); + return; + } + if (string.IsNullOrEmpty(AppSettings.Instance.InputFilePath)) { WriteHelp(); @@ -51,6 +57,12 @@ static void Main(string[] args) } } + private static string GetVersionNumber(string assemblyQualifiedName) + { + var fromVersion = (assemblyQualifiedName.Substring(assemblyQualifiedName.IndexOf("Version=") + 8)); + return fromVersion.Substring(0, fromVersion.IndexOf(',')); + } + private static void Verbose(string format, params string[] path) { Console.WriteLine(format, path); diff --git a/src/parq/parq.csproj b/src/parq/parq.csproj index eecd0e949..863d8a889 100644 --- a/src/parq/parq.csproj +++ b/src/parq/parq.csproj @@ -3,6 +3,9 @@ Exe netcoreapp1.1 + 1.0.1 + 1.0.1.0 + 1.0.1.0