Use AnsiColor in jenkins via powershell
Well I've never used it before so I figured I'd try it. Basically you just literally put an escape character (ASCII 27) followed by a left bracket [
and then the codes, as described on this page, directly into the string.
To make this easier, I wrote a function that formats the string:
function Format-AnsiColor {[CmdletBinding()][OutputType([String])]param( [Parameter( Mandatory = $true, ValueFromPipeline = $true )] [AllowEmptyString()] [String] $Message , [Parameter()] [ValidateSet( 'normal display' ,'bold' ,'underline (mono only)' ,'blink on' ,'reverse video on' ,'nondisplayed (invisible)' )] [Alias('attribute')] [String] $Style , [Parameter()] [ValidateSet( 'black' ,'red' ,'green' ,'yellow' ,'blue' ,'magenta' ,'cyan' ,'white' )] [Alias('fg')] [String] $ForegroundColor , [Parameter()] [ValidateSet( 'black' ,'red' ,'green' ,'yellow' ,'blue' ,'magenta' ,'cyan' ,'white' )] [Alias('bg')] [String] $BackgroundColor) Begin { $e = [char]27 $attrib = @{ 'normal display' = 0 'bold' = 1 'underline (mono only)' = 4 'blink on' = 5 'reverse video on' = 7 'nondisplayed (invisible)' = 8 } $fore = @{ black = 30 red = 31 green = 32 yellow = 33 blue = 34 magenta = 35 cyan = 36 white = 37 } $back = @{ black = 40 red = 41 green = 42 yellow = 43 blue = 44 magenta = 45 cyan = 46 white = 47 } } Process { $formats = @() if ($Style) { $formats += $attrib[$Style] } if ($ForegroundColor) { $formats += $fore[$ForegroundColor] } if ($BackgroundColor) { $formats += $back[$BackgroundColor] } if ($formats) { $formatter = "$e[$($formats -join ';')m" } "$formatter$_" }}
Usage:
Format-AnsiColor -Message 'Hey there' -Style Bold -ForegroundColor Red'Hello' | Format-AnsiColor -BackgroundColor Green'One','Two','Three' | Format-AnsiColor -Style 'normal display' -ForegroundColor White -BackgroundColor Black
Remember that you have to turn off the sequence (by that I mean set the style and colors back to whatever it was before) if you don't want it anymore.
I use lot of long powershell in my Jenkin, color is essential !I overwrite the native Write-Host in profile.ps1 of my Jenkins User. and now all my local script is colorized on Jenkins
function Write-Host { <# .SYNOPSIS Wrapper for Write-Host, adds ANSI SGR codes based on -foregroundColor and -backgroundColor .DESCRIPTION Renplace le Write-host standard, pour une compatibilité avec les sorties linux (JENKINS) .PARAMETER object Liste de String qui seront regroupe et affichée en couleur .PARAMETER foregroundColor Couleur du texte .PARAMETER backgroundColor Couleur de fond .PARAMETER nonewline si pas de retour a la ligne .NOTES 👉 Alban LOPEZ 2018 👣 alban.lopez@gmail.com 💛 http://git/PowerTech/ #> param( $object, [ConsoleColor]$foregroundColor, [ConsoleColor]$backgroundColor, [switch]$nonewline ) if (!(Get-Command Write-HostOriginal -ea 0).name){ # doit etre embarque (pour les scriptblock) $global:ConsoleOutput = '' $metaData = New-Object System.Management.Automation.CommandMetaData (Get-Command 'Microsoft.PowerShell.Utility\Write-Host') Invoke-Expression "function Global:Write-HostOriginal { $([System.Management.Automation.ProxyCommand]::create($metaData)) }" } # https://msdn.microsoft.com/en-us/library/system.consolecolor(v=vs.110).aspx # Converted to closest ANSI SGR equivalent $AnsiColor = [pscustomobject][ordered]@{ # doit etre embarque (pour les scriptblock) ForeGround = [pscustomobject][ordered]@{ Black = 30 Red = 91 DarkRed = 31 Green = 92 DarkGreen = 32 Yellow = 93 DarkYellow = 33 Blue = 94 DarkBlue = 34 Magenta = 95 DarkMagenta = 35 Cyan = 96 DarkCyan = 36 White = 97 Gray = 37 DarkGray = 90 } BackGround = [pscustomobject][ordered]@{ Black = 40 White = 107 Red = 101 DarkRed = 41 Green = 102 DarkGreen = 42 Yellow = 103 DarkYellow = 43 Blue = 104 DarkBlue = 44 Magenta = 105 DarkMagenta = 45 Cyan = 106 DarkCyan = 46 Gray = 47 DarkGray = 100 } style = [pscustomobject][ordered]@{ RESET = 0 BOLD_ON = 1 ITALIC_ON = 3 UNDERLINE_ON = 4 BLINK_ON = 5 REVERSE_ON = 7 # BOLD_OFF = 22 # ITALIC_OFF = 23 # UDERLINE_OFF = 24 # BLINK_OFF = 25 # REVERSE_OFF = 27 } } function Colorize-Text { <# .SYNOPSIS Adds ANSI SGR codes to a string. .DESCRIPTION Adds ANSI SGR codes to a string. .PARAMETER text Text to be transformed. .PARAMETER ansiSgrCode ANSI SGR number to insert. See https://en.wikipedia.org/wiki/ANSI_escape_code for details Or use the [AnsiColor] enum. Also accepts an array of SGR numbers, and will apply all of them. .NOTES Designed to play nicely with https://wiki.jenkins-ci.org/display/JENKINS/AnsiColor+Plugin .EXAMPLE Colorize-Text 'toto' 7,93,101 #> param( $object, [int[]]$ansiCodes #https://en.wikipedia.org/wiki/ANSI_escape_code#graphics ) return "$([char]27)[$($ansiCodes -join(';'))m$object$([char]27)[0m" } $ansiCodes = @() if($style){ $ansiCodes += $AnsiColor.style.$style } if($foregroundColor){ $ansiCodes += $AnsiColor.ForeGround.$foregroundColor } if($backgroundColor) { $ansiCodes += $AnsiColor.BackGround.$backgroundColor } # Write-HostOriginal (Colorize-Text $object -ansiCodes $ansiCodes ) -nonewline # | Out-Host # (Colorize-Text $object -ansiCodes $ansiCodes ) | Out-Host # [Console]::Write( (Colorize-Text $object -ansiCodes $ansiCodes ) ) if($foregroundColor -and $backgroundColor){ # Write-HostOriginal (Colorize-Text $object -ansiCodes $ansiCodes ) -ForegroundColor $foregroundColor -BackgroundColor $backgroundColor -nonewline # | Out-Host $global:ConsoleOutput += (Colorize-Text $object -ansiCodes $ansiCodes ) } elseif($foregroundColor){ # Write-HostOriginal (Colorize-Text $object -ansiCodes $ansiCodes ) -ForegroundColor $foregroundColor -nonewline # | Out-Host $global:ConsoleOutput += (Colorize-Text $object -ansiCodes $ansiCodes ) } elseif($backgroundColor){ # Write-HostOriginal (Colorize-Text $object -ansiCodes $ansiCodes ) -BackgroundColor $backgroundColor -nonewline # | Out-Host $global:ConsoleOutput += (Colorize-Text $object -ansiCodes $ansiCodes ) } else { # Write-HostOriginal $object -nonewline # | Out-Host $global:ConsoleOutput += $object } if (!$nonewline) { Write-HostOriginal $global:ConsoleOutput # -NoNewline $global:ConsoleOutput = '' # Write-HostOriginal '$!' -fore magenta }}
This code is compatible to ScriptBlock in thread and remote usage (Start-Job, Invoke-command)
Drop-in Write-Host replacement that uses ANSI escape codes to render colors.Allows for colorized output in CI systems.
.Synopsis Write-Host but with ANSI colors!.Description Drop-in Write-Host replacement that uses ANSI escape codes to render colors. Allows for colorized output in CI systems..Parameter Object Objects to display in the host..Parameter ForegroundColor Specifies the text color. There is no default..Parameter BackgroundColor Specifies the background color. There is no default..Parameter Separator Specifies a separator string to insert between objects displayed by the host..Parameter NoNewline The string representations of the input objects are concatenated to form the output. No spaces or newlines are inserted between the output strings. No newline is added after the last output string..Example Write-Host 'Double rainbow!' -ForegroundColor Magenta -BackgroundColor Yellow.Notes Author : beatcracker (https://github.com/beatcracker) License: MS-PL (https://opensource.org/licenses/MS-PL) Source : https://github.com/beatcracker/Powershell-Misc#>function Write-Host { [CmdletBinding()] Param( [Parameter(ValueFromPipeline)] [Alias('Msg', 'Message')] [System.Object[]]$Object, [System.Object]$Separator, [System.ConsoleColor]$ForegroundColor, [System.ConsoleColor]$BackgroundColor, [switch]$NoNewline ) Begin { # Map ConsoleColor enum values to ANSI colors # https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit $AnsiColor = @( 30, 34, 32, 36, 31, 35, 33, 37, 90, 94, 92, 96, 91, 95, 93, 97 ) # PS < 6.0 doesn't have `e escape character $Esc = [char]27 $AnsiTemplate = "$Esc[{0}m{1}$Esc[{2}m" } Process { # https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_special_characters#escape-e # https://docs.microsoft.com/en-us/powershell/scripting/windows-powershell/wmf/whats-new/console-improvements#vt100-support if ($Host.UI.SupportsVirtualTerminal) { $Method = if ($NoNewline) { 'Write' } else { 'WriteLine' } $Output = if ($Separator) { $Object -join $Separator } else { "$Object" } # Splitting by regex ensures that this will work on files from Windows/Linux/macOS # Get-Content .\Foobar.txt -Raw | Write-Host -ForegroundColor Red foreach ($item in $Output -split '\r\n|\r|\n') { if ("$BackgroundColor") { $item = $AnsiTemplate -f ($AnsiColor[$BackgroundColor.value__] + 10), $item, 49 } if ("$ForegroundColor") { $item = $AnsiTemplate -f $AnsiColor[$ForegroundColor.value__], $item, 39 } [System.Console]::$Method($item) } } else { Microsoft.PowerShell.Utility\Write-Host @PSBoundParameters } }}