ืึทื•ื˜ืึธืžืึทื˜ื™ืึธืŸ ืคื•ืŸ ืกืงืœ ืกืขืจื•ื•ืขืจ ืื™ืŸ Jenkins: ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ื‘ื™ื•ื˜ืึทืคืœื™

ื ืื›ืืžืืœ ืคืึธืจื–ืขืฆืŸ ื“ื™ ื˜ืขืžืข ืคื•ืŸ โ€‹โ€‹ืึธืจื“ืขื ื•ื ื’ ื ื•ืœ ืจื™ืจ ืคึผืจืึธื“ ืื•ื ื˜ืขืจ RDS. ืฆื•ืงื•ื ืคึฟื˜ DBAs ื•ื•ืขื˜ ื ื™ืฉื˜ ืงืขื ืขืŸ ืฆื• ืคืึทืจื‘ื™ื ื“ืŸ ืฆื• PROD ืกืขืจื•ื•ืขืจืก ื’ืœื™ื™ึทืš, ืึธื‘ืขืจ ื–ื™ื™ ืงืขื ืขืŸ ื ื•ืฆืŸ ื“ื–ืฉืขื ืงื™ื ืก ื“ื–ืฉืึธื‘ืก ืคึฟืึทืจ ืึท ืœื™ืžื™ื˜ืขื“ ื’ืึทื ื’ ืคื•ืŸ ืึทืคึผืขืจื™ื™ืฉืึทื ื–. ื“ื™ ื“ื‘ืึท ืœืึธื ื˜ืฉื™ื– ืึทืจื‘ืขื˜ ืื•ืŸ ื ืึธืš ืขื˜ืœืขื›ืข ืžืึธืœ ื‘ืึทืงื•ืžืขืŸ ืึท ื‘ืจื™ื•ื• ืžื™ื˜ ืึท ื‘ืึทืจื™ื›ื˜ ืื•ื™ืฃ ื“ื™ ืงืึทืžืคึผืœื™ืฉืึทืŸ ืคื•ืŸ ื“ืขื ืึธืคึผืขืจืึทืฆื™ืข. ื–ืืœ ืก ืงื•ืง ืื™ืŸ ื•ื•ืขื’ืŸ ืฆื• ืคืึธืจืฉื˜ืขืœืŸ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ืŸ ืฆื• ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ.

ืึทื•ื˜ืึธืžืึทื˜ื™ืึธืŸ ืคื•ืŸ ืกืงืœ ืกืขืจื•ื•ืขืจ ืื™ืŸ Jenkins: ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ื‘ื™ื•ื˜ืึทืคืœื™

ื‘ืœื•ื™ื–ืข ื˜ืขืงืกื˜

ื–ืืœ ืก ืึธื ื”ื™ื™ื‘ืŸ ืžื™ื˜ ื“ื™ ืžืขืจืกื˜ ื ื™ืฉื˜ื™ืง. ื“ืขืจ ืขืจืฉื˜ืขืจ ืื•ืคึฟืŸ ืื™ื– ืึทื–ื•ื™ ืคึผืฉื•ื˜ ืึทื– ืขืก ืก 'ื˜ืึทืงืข ื’ืึธืจื ื™ืฉื˜ ืฆื• ืจืขื“ืŸ ื•ื•ืขื’ืŸ (ื“ืขืจ ืžื—ื‘ืจ ื ื™ืฆื˜ ืคืจืขืขืกื˜ื™ืœืข ื“ื–ืฉืึธื‘ืก ื•ื•ื™ื™ื˜ืขืจ):

ืึทื•ื˜ืึธืžืึทื˜ื™ืึธืŸ ืคื•ืŸ ืกืงืœ ืกืขืจื•ื•ืขืจ ืื™ืŸ Jenkins: ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ื‘ื™ื•ื˜ืึทืคืœื™

sqlcmd ื˜ื•ื˜ ืขืคึผืขืก ืื•ืŸ ืžื™ืจ ืคืึธืจืฉื˜ืขืœืŸ ืขืก ืฆื• ื“ื™ ื‘ืึทื ื™ืฆืขืจ. ื™ื“ืขืึทืœ ืคึฟืึทืจ, ืœืžืฉืœ, ื‘ืึทืงืึทืคึผ ื“ื–ืฉืึธื‘ืก:

ืึทื•ื˜ืึธืžืึทื˜ื™ืึธืŸ ืคื•ืŸ ืกืงืœ ืกืขืจื•ื•ืขืจ ืื™ืŸ Jenkins: ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ื‘ื™ื•ื˜ืึทืคืœื™

ื“ื• ื–ืืœืกื˜ ื ื™ืฉื˜ ืคืึทืจื’ืขืกืŸ, ื“ื•ืจืš ื“ืขื ื•ื•ืขื’, ืึทื– ืื•ื ื˜ืขืจ RDS ื‘ืึทืงืึทืคึผ / ื•ืžืงืขืจืŸ ืื™ื– ื™ื™ืกื™ื ื’ืงืจืึทื ืึทืก, ืึทื–ื•ื™ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื•ื•ืึทืจื˜ืŸ ืคึฟืึทืจ ืขืก:

declare @rds table
  (id int, task_type varchar(128), database_name sysname, pct int, duration int, 
   lifecycle varchar(128), taskinfo varchar(max) null, 
   upd datetime, cre datetime,
   s3 varchar(256), ovr int, KMS varchar(256) null)
waitfor delay '00:00:20' 
insert into @rds exec msdb.dbo.rds_task_status @db_name='{db}'
select @xid=max(id) from @rds

again:
waitfor delay '00:00:02'
delete from @rds
insert into @rds exec msdb.dbo.rds_task_status @db_name='{db}' 
# {db} substituted with db name by powershell
select @stat=lifecycle,@info=taskinfo from @rds where id=@xid
if @stat not in ('ERROR','SUCCESS','CANCELLED') goto again

ืฆื•ื•ื™ื™ื˜ืข ืื•ืคึฟืŸ, CSV

ืึทืœืฅ ื“ืึธ ืื™ื– ืื•ื™ืš ื–ื™ื™ืขืจ ืคึผืฉื•ื˜:

ืึทื•ื˜ืึธืžืึทื˜ื™ืึธืŸ ืคื•ืŸ ืกืงืœ ืกืขืจื•ื•ืขืจ ืื™ืŸ Jenkins: ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ื‘ื™ื•ื˜ืึทืคืœื™

ืึธื‘ืขืจ, ื“ืขื ืื•ืคึฟืŸ ืึทืจื‘ืขื˜ ื‘ืœื•ื™ื– ืื•ื™ื‘ ื“ื™ ื“ืึทื˜ืŸ ืื•ืžื’ืขืงืขืจื˜ ืื™ืŸ ื“ื™ ืงืกื•ื• ืื™ื– "ืคึผืฉื•ื˜". ืื•ื™ื‘ ืื™ืจ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืฆื•ืจื™ืงืงื•ืžืขืŸ, ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืึท ืจืฉื™ืžื” ืคื•ืŸ TOP N ืงืคึผื• ืื™ื ื˜ืขื ืกื™ื•ื•ืข ืงื•ื•ื™ืจื™ื– ืื•ื™ืฃ ื“ืขื ื•ื•ืขื’, ื“ื™ CSV ื•ื•ืขื˜ "ืงืขืจืึธื•ื“" ืจืขื›ื˜ ืฆื• ื“ืขื ืคืึทืงื˜ ืึทื– ื“ื™ ืึธื ืคึฟืจืขื’ ื˜ืขืงืกื˜ ืงืขื ืขืŸ ืึทื ื˜ื”ืึทืœื˜ืŸ ืงื™ื™ืŸ ืื•ืชื™ื•ืช - ืงืึธืžืžืึทืก, ืงื•ื•ืึธื˜ืขืก ืื•ืŸ ืืคื™ืœื• ืฉื•ืจื” ื‘ืจื™ื™ืงืก. ื“ืขืจื™ื‘ืขืจ, ืžื™ืจ ื“ืึทืจืคึฟืŸ ืขืคึผืขืก ืžืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜.

ืฉื™ื™ืŸ ื•ื•ืื•ื ื“ืขืจ ืื™ืŸ HTML

ืื™ืš ื•ื•ืขื˜ ื’ืขื‘ืŸ ืื™ืจ ืึท ืงืึธื“ ืกื ื™ืคึผ ื’ืœื™ื™ืš

$Header = @"
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #6495ED;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
"@
  
$Result = invoke-Sqlcmd -ConnectionString $jstr -Query "select * from DbInv" `
  | Select-Object -Property * -ExcludeProperty "ItemArray", "RowError", "RowState", "Table", "HasErrors"
if ($Result -eq $null) { $cnt = 0; }
elseif ($Result.getType().FullName -eq "System.Management.Automation.PSCustomObject") { $cnt = 1; }
else { $cnt = $Result.Rows.Count; } 
if ($cnt -gt 0) {
  $body = "<h2>My table</h2>"
  $Result | ConvertTo-HTML -Title "Rows" -Head $header -body $body `
    | Out-File "res.log" -Append -Encoding UTF8
  } else {
    "<h3>No data</h3>" | Out-File "res.log" -Append -Encoding UTF8
  }

ื“ื•ืจืš ื“ืขื ื•ื•ืขื’, ืฆื•ืงื•ืงื  ื–ื™ืš ืฆื• ื“ื™ ืฉื•ืจื” ืžื™ื˜ System.Management.Automation.PSCustomObject, ืขืก ืื™ื– ืžืึทื“ื–ืฉื™ืงืึทืœ ืื•ื™ื‘ ืขืก ืื™ื– ืคึผื•ื ืงื˜ ืื™ื™ืŸ ืฉื•ืจื” ืื™ืŸ ื“ื™ ื’ืจื™ื“, ืขืก ื–ืขื ืขืŸ ืขื˜ืœืขื›ืข ืคืจืื‘ืœืขืžืขืŸ. ื“ื™ ืœื™ื™ื–ื•ื ื’ ืื™ื– ื’ืขื ื•ืžืขืŸ ืคื•ืŸ ื“ื™ ืื™ื ื˜ืขืจื ืขื˜ ืึธืŸ ืคื™ืœ ืคืืจืฉื˜ืื ื“. ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืื™ืจ ื•ื•ืขื˜ ื‘ืึทืงื•ืžืขืŸ ืจืขื–ื•ืœื˜ืึทื˜ ืคืึธืจืžืึทื˜ื˜ืขื“ ืขืคึผืขืก ื•ื•ื™ ื“ืึธืก:

ืึทื•ื˜ืึธืžืึทื˜ื™ืึธืŸ ืคื•ืŸ ืกืงืœ ืกืขืจื•ื•ืขืจ ืื™ืŸ Jenkins: ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ื‘ื™ื•ื˜ืึทืคืœื™

ืฆื™ื™ื›ืขื ื•ื ื’ ื’ืจืึทืคืก

ื•ื•ืืจืขื ื•ื ื’: ืงื™ื ืงื™ ืงืึธื“ ืื•ื ื˜ืŸ!
ืขืก ืื™ื– ืึท ืžืึธื“ื ืข ืึธื ืคึฟืจืขื’ ืื•ื™ืฃ ื“ื™ SQL ืกืขืจื•ื•ืขืจ ื•ื•ืึธืก ื“ื™ืกืคึผืœื™ื™ื– ื“ื™ ืงืคึผื• ืคึฟืึทืจ ื“ื™ ืœืขืฆื˜ืข N ืžื™ื ื•ื˜ - ืขืก ื˜ื•ืจื ืก ืื•ื™ืก ืึทื– ืงืึทืžืจืึทื“ ืžืึทื“ื–ืฉืึธืจ ื’ืขื“ืขื ืงื˜ ืึทืœืฅ! ืคึผืจื•ึผื•ื•ื˜ ื“ืขื ื•ื™ืกืคืจืขื’:

DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks) 
  FROM sys.dm_os_sys_info WITH (NOLOCK)); 
SELECT TOP(256) 
  DATEADD(ms, -1 * (@ts_now - [timestamp]), GETDATE()) AS [EventTime],
  SQLProcessUtilization AS [SQLCPU], 
  100 - SystemIdle - SQLProcessUtilization AS [OtherCPU]
FROM (SELECT record.value('(./Record/@id)[1]', 'int') AS record_id, 
  record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') 
    AS [SystemIdle], 
  record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') 
    AS [SQLProcessUtilization], [timestamp] 
  FROM (SELECT [timestamp], CONVERT(xml, record) AS [record] 
  FROM sys.dm_os_ring_buffers WITH (NOLOCK)
  WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' 
    AND record LIKE N'%<SystemHealth>%') AS x) AS y 
ORDER BY 1 DESC OPTION (RECOMPILE);

ืื™ืฆื˜, ื ื™ืฆืŸ ื“ืขื ืคืึธืจืžืึทื˜ื˜ื™ื ื’ ($ ืคืจืึทื’ืžืขื ื˜ ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง)

<table style="width: 100%"><tbody><tr style="background-color: white; height: 2pt;">
  <td style="width: SQLCPU%; background-color: green;"></td>
  <td style="width: OtherCPU%; background-color: blue;"></td>
  <td style="width: REST%; background-color: #C0C0C0;"></td></tr></tbody>
</table>

ืžื™ืจ ืงืขื ืขืŸ ืžืึทื›ืŸ ื“ื™ ื’ื•ืฃ ืคื•ืŸ ื“ื™ ื‘ืจื™ื•ื•:

$Result = invoke-Sqlcmd -ConnectionString $connstr -Query $Query `
  | Select-Object -Property * -ExcludeProperty `
  "ItemArray", "RowError", "RowState", "Table", "HasErrors"
if ($Result.HasRows) {
  foreach($item in $Result) 
    { 
    $time = $itemEventTime 
    $sqlcpu = $item.SQLCPU
    $other = $itemOtherCPU
    $rest = 100 - $sqlcpu - $other
    $f = $fragment -replace "SQLCPU", $sqlcpu
    $f = $f -replace "OtherCPU", $other
    $f = $f -replace "REST", $rest
    $f | Out-File "res.log" -Append -Encoding UTF8
    }

ื•ื•ืึธืก ื•ื•ืขื˜ ืงื•ืงืŸ ื•ื•ื™ ื“ืึธืก:

ืึทื•ื˜ืึธืžืึทื˜ื™ืึธืŸ ืคื•ืŸ ืกืงืœ ืกืขืจื•ื•ืขืจ ืื™ืŸ Jenkins: ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ื‘ื™ื•ื˜ืึทืคืœื™

ื™ืึธ, ืžืึธื ืกื™ืขืจ ื•ื•ื™ื™ืกื˜ ืคื™ืœ ื•ื•ืขื’ืŸ ืคึผืขืจื•ื•ืขืจืกื™ืึธื ืก! ืขืก ืื™ื– ื˜ืฉื™ืงืึทื•ื•ืข ืึทื– ื“ืขืจ ืงืึธื“ ื›ึผื•ืœืœ: Powershell (ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ ืขืก), SQL, Xquery, HTML. ืขืก ืื™ื– ืึท ืฉืึธื“ ืึทื– ืžื™ืจ ืงืขื ืขืŸ ื ื™ืฉื˜ ืœื™ื™ื’ืŸ ื“ื–ืฉืึทื•ื•ืึทืกืงืจื™ืคึผื˜ ืฆื• HTML (ื•ื•ื™ื™ึทืœ ืขืก ืื™ื– ืคึฟืึทืจ ืฉืจื™ื™ื‘ืŸ), ืึธื‘ืขืจ ืคึผืึทืœื™ืฉื™ื ื’ ืคึผื™ื˜ื”ืึธืŸ ืงืึธื“ (ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืื™ืŸ ืกืงืœ) ืื™ื– ืึทืœืขืžืขืŸ ืก ืคืœื™ื›ื˜!

SQL ืคึผืจืึธืคื™ืœืขืจ ืฉืคึผื•ืจ ืจืขื–ื•ืœื˜ืึทื˜

ืขืก ืื™ื– ืงืœืึธืจ ืึทื– ื“ื™ ืฉืคึผื•ืจ ื•ื•ืขื˜ ื ื™ืฉื˜ ืคึผืึทืกื™ืง ืื™ืŸ ื“ื™ ืงืกื•ื• ื•ื•ื™ื™ึทืœ ืคื•ืŸ ื“ื™ ื˜ืขืงืกื˜ื“ืึทื˜ืึท ืคืขืœื“. ืื‘ืขืจ ื•ื•ื™ื™ึทื–ื ื“ื™ืง ืึท ืฉืคึผื•ืจ ื’ืจื™ื“ ืื™ืŸ ืึท ื‘ืจื™ื•ื• ืื™ื– ืื•ื™ืš ืžืึธื“ื ืข - ื‘ื™ื™ื“ืข ื•ื•ื™ื™ึทืœ ืคื•ืŸ ื“ื™ ื’ืจื™ื™ืก ืื•ืŸ ื•ื•ื™ื™ึทืœ ื“ื™ ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ืึธืคื˜ ื’ืขื ื™ืฆื˜ ืคึฟืึทืจ ื•ื•ื™ื™ึทื˜ืขืจ ืึทื ืึทืœื™ืกื™ืก. ื“ืขืจื™ื‘ืขืจ, ืžื™ืจ ื˜ืึธืŸ ื“ื™ ืคืืœื’ืขื ื“ืข: ืžื™ืจ ืจื•ืคืŸ ื“ื•ืจืš ื™ื ื•ื•ืึธื•ืง-SqlCmd ืึท ื’ืขื•ื•ื™ืกืขืจ ืฉืจื™ืคื˜, ืื™ืŸ ื•ื•ืขืœื›ืŸ ืขืก ื•ื•ืขืจื˜ ื’ืขื˜ืึธืŸ ืื™ืŸ ื˜ื™ืคืขื ื™ืฉืŸ

select 
  SPID,EventClass,TextData,
  Duration,Reads,Writes,CPU,
  StartTime,EndTime,DatabaseName,HostName,
  ApplicationName,LoginName
   from ::fn_trace_gettable ( @filename , default )  

ื•ื•ื™ื™ึทื˜ืขืจ, ืื•ื™ืฃ ืคืจื™ื™ึทื ื“ ืกืขืจื•ื•ื™ืจืขืจ, ืฆื•ื˜ืจื™ื˜ืœืขืš ืคืืจ ื“ื™ ื“ื™-ื‘ื™-ืขื™, ืื™ื– ื“ื ื ื˜ืจืขื™ืก ื“ืื˜ื ื‘ืื–ืข ืžื™ื˜ ื ืœื™ื™ื“ื™ื’ืŸ ื˜ืขืžืคืœืื˜, ื ืžืื“ืขืœ ื˜ืื‘ืขืœืข, ื’ืจื™ื™ื˜ ืฆื• ืื ื ืขืžืขืŸ ืืœืข ืกืคืขืฆื™ืคื™ืฆื™ืจื˜ืข ืงืืœื•ื'ืก. ืžื™ืจ ืงืืคื™ืจืŸ ื“ืขื ืžืื“ืขืœ ืฆื• ื ื ื™ื™ืขืจ ื˜ืื‘ืขืœืข ืžื™ื˜ ื ื™ื•ื ื™ืง ื ืืžืขืŸ:

$dt = Get-Date -format "yyyyMMdd"
$tm = Get-Date -format "hhmmss"
$tableName = $srv + "_" + $dt + "_" + $tm
$copytab = "select * into " + $tableName + " from Model"
invoke-SqlCmd -ConnectionString $tstr -Query $copytab 

ืื•ืŸ ืื™ืฆื˜ ืžื™ืจ ืงืขื ืขืŸ ืฉืจื™ื™ึทื‘ืŸ ืื•ื ื“ื–ืขืจ ืฉืคึผื•ืจ ืื™ืŸ ืขืก ื ื™ืฆืŸ Data.SqlClient.SqlBulkCopy - ืื™ืš ื”ืื‘ ืฉื•ื™ืŸ ืื•ื™ื‘ืŸ ื’ืขื’ืขื‘ืŸ ื ื‘ื™ื™ืฉืคื™ืœ ื“ืขืจืคื•ืŸ. ื™ืึธ, ืขืก ื•ื•ืึธืœื˜ ืื•ื™ืš ื–ื™ื™ืŸ ืคื™ื™ึทืŸ ืฆื• ืžืึทืกืงืข ืงืึทื ืกื˜ืึทื ืฅ ืื™ืŸ ื˜ืขืงืกื˜ื“ืึทื˜ืึท:

# mask data
foreach ($Row in $Result)
{ 
  $v = $Row["TextData"]
  $v = $v -replace "'([^']{2,})'", "'str'" -replace "[0-9][0-9]+", '999'
  $Row["TextData"] = $v
}

ืžื™ืจ ืคืึทืจื‘ื™ื™ึทื˜ืŸ ื ื•ืžืขืจืŸ ืžืขืจ ื•ื•ื™ ืื™ื™ืŸ ื›ืึทืจืึทืงื˜ืขืจ ืœืึทื ื’ ืžื™ื˜ 999, ืื•ืŸ ืžื™ืจ ืคืึทืจื‘ื™ื™ึทื˜ืŸ ืกื˜ืจื™ื ื’ืก ืžืขืจ ื•ื•ื™ ืื™ื™ืŸ ื›ืึทืจืึทืงื˜ืขืจ ืžื™ื˜ 'ืกื˜ืจ'. ื ื•ืžืขืจืŸ ืคื•ืŸ 0 ื‘ื™ื– 9 ื–ืขื ืขืŸ ืึธืคื˜ ื’ืขื ื™ืฆื˜ ื•ื•ื™ ืคืœืึทื’ืก, ืื•ืŸ ืžื™ืจ ืึธื ืจื™ืจืŸ ื–ื™ื™ ื ื™ืฉื˜, ื•ื•ื™ ืื•ื™ืš ืœื™ื™ื“ื™ืง ืื•ืŸ ืื™ื™ืŸ-ื›ืึทืจืึทืงื˜ืขืจ ืกื˜ืจื™ื ื’ืก - 'ื™', 'ืขืŸ', ืืื–"ื• ื• ื–ืขื ืขืŸ ืึธืคื˜ ื’ืขืคื•ื ืขืŸ ืฆื•ื•ื™ืฉืŸ ื–ื™ื™.

ืœืึธืžื™ืจ ืœื™ื™ื’ืŸ ืขื˜ืœืขื›ืข ืงืึธืœื™ืจ ืฆื• ืื•ื ื“ื–ืขืจ ืœืขื‘ืŸ (ืฉื˜ืจืขื ื’ 18+)

ืื™ืŸ ื˜ื™ืฉืŸ, ืื™ืจ ืึธืคื˜ ื•ื•ื™ืœืŸ ืฆื• ื”ื•ื™ื›ืคึผื•ื ืงื˜ ืกืขืœื– ื•ื•ืึธืก ื“ืึทืจืคืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ึทื˜. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, FAILS, ื”ื•ื™ืš ืžื“ืจื’ื” ืคื•ืŸ ืคืจืึทื’ืžืึทื ื˜ื™ื™ืฉืึทืŸ, ืืื–"ื• ื•. ื“ืึธืš, ื“ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื˜ืืŸ ืื™ืŸ ื ืึทืงืขื˜ SQL, ื“ื–ืฉืขื ืขืจื™ื™ื˜ื™ื ื’ HTML ื ื™ืฆืŸ PRINT ืื•ืŸ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ื™ ื˜ืขืงืข ื˜ื™ืคึผ ืฆื• HTML ืื™ืŸ Jenkins:

declare @body varchar(max), @chunk varchar(max)
set @body='<font face="Lucida Console" size="3">'
set @body=@body+'<b>Server name: '+@@servername+'</b><br>'
set @body=@body+'<br><br>'
set @body=@body+'<table><tr><th>Job</th><th>Last Run</th><th>Avg Duration, sec</th><th>Last Run, Sec</th><th>Last Status</th></tr>'
print @body

DECLARE tab CURSOR FOR SELECT '<tr><td>'+name+'</td><td>'+
  LastRun+'</td><td>'+
  convert(varchar,AvgDuration)+'</td><td>'+
  convert(varchar,LastDuration)+'</td><td>'+
    case when LastStatus<>'Succeeded' then '<font color="red">' else '' end+
      LastStatus+
      case when LastStatus<>'Succeeded' then '</font>' else '' end+
     +'</td><td>'
  from #j2
OPEN tab;  
FETCH NEXT FROM tab into @chunk
WHILE @@FETCH_STATUS = 0  
BEGIN
  print @chunk
  FETCH NEXT FROM tab into @chunk;  
END  
CLOSE tab;  
DEALLOCATE tab;
print '</table>'

ืคืืจื•ื•ืืก ื”ืื‘ ืื™ืš ื’ืขืฉืจื™ื‘ืŸ ืื–ื ืงืื•ื“?

ืึทื•ื˜ืึธืžืึทื˜ื™ืึธืŸ ืคื•ืŸ ืกืงืœ ืกืขืจื•ื•ืขืจ ืื™ืŸ Jenkins: ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ื‘ื™ื•ื˜ืึทืคืœื™

ืื‘ืขืจ ืขืก ืื™ื– ืึท ืžืขืจ ืฉื™ื™ืŸ ืœื™ื™ื–ื•ื ื’. ืงืึธื ื•ื•ืขืจื˜ ืฆื• HTML ืœืึธื–ืŸ ืื•ื ื“ื– ื ื™ืฉื˜ ืงืึธืœื™ืจืŸ ื“ื™ ืกืขืœื–, ืึธื‘ืขืจ ืžื™ืจ ืงืขื ืขืŸ ื˜ืึธืŸ ื“ืึธืก ื ืึธืš ื“ื™ ืคืึทืงื˜. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืžื™ืจ ื•ื•ื™ืœืŸ ืฆื• ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ืกืขืœื– ืžื™ื˜ ืึท ืคืจืึทื’ืžืึทื ื˜ื™ื™ืฉืึทืŸ ืžื“ืจื’ื” ืคื•ืŸ ืžืขืจ ื•ื•ื™ 80 ืื•ืŸ ืžืขืจ ื•ื•ื™ 90. ื–ืืœ ืก ืœื™ื™ื’ืŸ ืกื˜ื™ื™ืœื–:

<style>
.SQLmarkup-red { color: red; background-color: yellow; }
.SQLmarkup-yellow { color: black; background-color: #FFFFE0; }
.SQLmarkup-default { color: black; background-color: white; }
</style>

ืื™ืŸ ื“ื™ ืึธื ืคึฟืจืขื’ ื–ื™ืš ืžื™ืจ ื•ื•ืขืœืŸ ืœื™ื™ื’ืŸ ืึท ื‘ืึธืง ื–ื™ื™ึทืœ ื’ืœื™ื™ืš ืคืจื™ืขืจ ื–ื™ื™ึทืœ ืžื™ืจ ื•ื•ื™ืœืŸ ืฆื• ืงืึธืœื™ืจืŸ. ื“ื™ ื–ื™ื™ึทืœ ื–ืึธืœ ื–ื™ื™ืŸ ื’ืขืจื•ืคืŸ SQLmarkup-ืขืคึผืขืก:

case  
  when ps.avg_fragmentation_in_percent>=90.0 then 'SQLmarkup-red'
  when ps.avg_fragmentation_in_percent>=80.0 then 'SQLmarkup-yellow'
  else 'SQLmarkup-default' 
  end as [SQLmarkup-1], 
ps.avg_fragmentation_in_percent, 

ืื™ืฆื˜, ื•ื•ืขืŸ ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ื“ื™ HTML ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ื“ื•ืจืš Powershell, ืžื™ืจ ื•ื•ืขืœืŸ ืึทืจืึธืคึผื ืขืžืขืŸ ื“ื™ ื‘ืึธืง ื–ื™ื™ึทืœ ืคื•ืŸ ื“ื™ ื›ืขื“ืขืจ, ืื•ืŸ ืื™ืŸ ื“ื™ ื’ื•ืฃ ืคื•ืŸ ื“ื™ ื“ืึทื˜ืŸ ืžื™ืจ ืึทืจื™ื‘ืขืจืคื™ืจืŸ ื“ื™ ื•ื•ืขืจื˜ ืคื•ืŸ ื“ื™ ื–ื™ื™ึทืœ ืฆื• ื“ื™ ืกื˜ื™ืœ. ื“ืึธืก ืื™ื– ื’ืขื˜ืืŸ ืžื™ื˜ ื‘ืœื•ื™ื– ืฆื•ื•ื™ื™ ืกืึทื‘ืกื˜ื™ื˜ื•ืฉืึทื ื–:

$html = $html `
  -replace "<th>SQLmarkup[^<]*</th>", "" `
  -replace "<td>SQLmarkup-(.+?)</td><td>",'<td class="SQLmarkup-$1">'

ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜:
ืึทื•ื˜ืึธืžืึทื˜ื™ืึธืŸ ืคื•ืŸ ืกืงืœ ืกืขืจื•ื•ืขืจ ืื™ืŸ Jenkins: ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ื‘ื™ื•ื˜ืึทืคืœื™

ืื™ื– ืขืก ื ื™ืฉื˜ ืขืœืขื’ืึทื ื˜? ื›ืึธื˜ืฉ ื ื™ื˜, ื“ืขื ืงืึทืœืขืจื™ื ื’ ื“ืขืจืžืื ื˜ ืžื™ืจ ืคื•ืŸ ืขืคึผืขืก
ืึทื•ื˜ืึธืžืึทื˜ื™ืึธืŸ ืคื•ืŸ ืกืงืœ ืกืขืจื•ื•ืขืจ ืื™ืŸ Jenkins: ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ื‘ื™ื•ื˜ืึทืคืœื™

ืžืงื•ืจ: www.habr.com

ืงื•ื™ืคืŸ ืคืึทืจืœืึธื–ืœืขืš ื”ืึธืกื˜ื™ื ื’ ืคึฟืึทืจ ื–ื™ื™ื˜ืœืขืš ืžื™ื˜ DDoS ืฉื•ืฅ, VPS VDS ืกืขืจื•ื•ืขืจืก ๐Ÿ”ฅ ืงื•ื™ืคื˜ ืคืึทืจืœืขืกืœืขื›ืข ื•ื•ืขื‘ื–ื™ื™ื˜ืœ ื”ืึธืกื˜ื™ื ื’ ืžื™ื˜ DDoS ืฉื•ืฅ, VPS VDS ืกืขืจื•ื•ืขืจืก | ProHoster