Build Event: Publicação de detalhes do aplicativo

Ao solucionar problemas de um aplicativo ou serviços da Web, poucas coisas são mais irritantes do que não saber exatamente qual código está sendo executado no servidor.

Meus objetivos são

  • Reúna detalhes automaticamente e copie-os para o servidor durante a publicação

  • Forneça uma lista de arquivos publicados que não foram confirmados no repositório antes da publicação (pode acontecer ..)

  • Dê ao front-end acesso a esses detalhes de uma forma facilmente consumível

  • Use os blocos de construção básicos que são inerentes ao Git e ao Windows (não quero perder muito tempo implementando alguma estrutura ou servidor que lide com isso para mim, ainda)

Minha solução é um arquivo em lote executado por um Build Event no Visual Studio que usa comandos Git para coletar informações e gerar um arquivo JSON formatado que pode ser acessado por meu aplicativo a partir do servidor web.

O arquivo de lote (preBuild.bat na pasta do meu projeto):

@echo off
set PROJECTDIR=%1app

REM
Clean out old minified CSS and JS for the app and build artifacts
del %PROJECTDIR%UIstaticcssapp.min.css
del %PROJECTDIR%UIstaticjsapp.min.js
del %PROJECTDIR%MSBuildOutput.txt

REM
Print details of the Git branch, and any uncommitted files that were published.
setlocal
EnableDelayedExpansion
set FILENAME=%PROJECTDIR%UIstaticjspublished_revision.js

set GIT="c:Program Files (x86)Gitbingit.exe"
for /F %%n in ('%GIT% rev-parse --abbrev-ref HEAD') do set NAME=%%n
for /F %%h in ('%GIT% rev-parse HEAD') do set HASH=%%h
for /F "tokens=2-4 delims=/ " %%a in ('date /t') do (set DATE=%%c-%%a-%%b)
for /F "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set TIME=%%a%%b)
echo
{ > %FILENAME%
echo
"published":"%DATE%_%TIME%", >> %FILENAME%
echo
"branch":"%NAME%", >> %FILENAME%
echo
"hash":"%HASH%", >> %FILENAME%
echo
"uncommitted": [>> %FILENAME%
REM
On the first line, don't print a comma in the array.. all subsequent lines have a comma prepended
set LINENO=0

for /F "tokens=*" %%l in ('
%GIT% diff --name-only %HASH%') do (
IF !LINENO! GTR 0 (

echo ,"%%l" >> %FILENAME%

) ELSE (

echo "%%l" >> %FILENAME%

)

set /a LINENO+=1

)

echo ]} >> %FILENAME%

exit 0

O evento de pré-construção:

$(SolutionDir)apppreBuild.bat $(SolutionDir)

Um exemplo do arquivo JSON:

{ 
"published":"2013-03-15_1219",
"branch":"master",
"hash":"fe7bae4dfbe58lkdiefmxdf4df14f035a6bieur5",
"uncommitted": [
"app/Global.asax.cs"
]
}