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"
]
}