지속적인 전달 파이프 라인의 일부로 주어진 시스템에 msi를 설치하고 싶습니다. msiexec plus psexec는이 작업을 완벽하게 수행하지만 msiexec는 파일에만 로그 할 수 있으며 stdout / stderr에 로그해야합니다.
현재 CI 소프트웨어로 출력을 다시 가져 오려면 로그 내용을 에코하는 두 번째 단계를 추가해야합니다.
아무도 전에이 문제에 직면 했습니까 (그리고 극복 했습니까?)
여기에 도움을 주셔서 감사합니다.
표
지속적인 전달 파이프 라인의 일부로 주어진 시스템에 msi를 설치하고 싶습니다. msiexec plus psexec는이 작업을 완벽하게 수행하지만 msiexec는 파일에만 로그 할 수 있으며 stdout / stderr에 로그해야합니다.
현재 CI 소프트웨어로 출력을 다시 가져 오려면 로그 내용을 에코하는 두 번째 단계를 추가해야합니다.
아무도 전에이 문제에 직면 했습니까 (그리고 극복 했습니까?)
여기에 도움을 주셔서 감사합니다.
표
답변:
나는 이것을 다시 확인했고, 여기에 업데이트 된 정보가 있습니다 .
MSI GUI를 억제하고 타사에서 구현 한 외부 GUI를 설정할 수 있습니다. 이 외부 GUI는 설치를 수행 할 때 msiexec.exe 에서 메시지를 수신 할 수 있습니다. 이것은 대부분 사용자 정의 진행률 표시 줄 을 구현하는 것이지만 대부분의 다른 오류 메시지와 상태 메시지를 가로 챌 수 있습니다. MsiSetExternalUI function .
흥미로운 매개 변수는 dwMessageFilter 입니다. 이를 설정하면 예를 들어 설치 중 발생하는 오류 메시지 만 수신 할 수 있습니다. 이것이 대부분의 목적에 충분하다고 생각합니다.
INSTALLUI_HANDLER MsiSetExternalUI(
_In_ INSTALLUI_HANDLER puiHandler,
_In_ DWORD dwMessageFilter,
_In_ LPVOID pvContext
);
유감스럽게도 현재이 샘플 코드가 없습니다. 시스템을 올바르게 설정하면 나중에 테스트하겠습니다. MsiEnableLog 기능은 파일에 로깅을 사용하도록 설정하는 관련 함수 호출이다. 업데이트 : 다음은 작동하는 SDK 예제 입니다.
상기 명령 줄 인터페이스 수준 , 당신은 또한을 추가하여 파일을 즉시 버퍼를 플러시 로깅을 설정할 수 있습니다 ! 매개 변수 :
msiexec.exe /I "IsWiX.msi" /QN /L*V! "C:\msilog.log"
즉, msiexec.exe가 충돌해도 로그 파일이 손실되지 않으므로 로그 버퍼가 손실되지 않습니다. IO 오버 헤드로 인해 설치 비용이 상당히 느려집니다.
MsiExec
파일에만 로그 할 수 있으므로 설치 프로그램이 완료된 후 해당 파일의 내용을 계속 반향해야합니다.
오히려 로컬 시스템의 MSI 로그 파일을 각 설치의 공통 위치에 영구적으로 캐시 한 다음 전체 설정의 종료 코드를 등록하면됩니다. 설치가 성공을보고하면 로그 파일이 흥미롭지 않습니까? 더 "잡음"?
이외에도 MSI 설치에 대한 로그 정보를 캡처하여 중앙에 저장하는 여러 소프트웨어 전달 시스템이 있습니다. 한 가지 예는 SCCM (Microsoft의 이름이 Systems Management Server-SMS)입니다.
모든 MSI 파일에 대한 로깅 설정은 "시스템의 모든 설정에 대한 전역"섹션을 참조하십시오. http://www.installsite.org/pages/en/msifaq/a/1022.htm
다음 powershell 스크립트를 사용합니다. 여전히 로그를 파일에 기록해야하지만 내용을 stdout에 실시간으로 기록합니다.
$main_process = Start-Process -FilePath ".\installer.exe" -ArgumentList "/S /V`"/qn /l*! output.log`"" -NoNewWindow -PassThru
$log_process = Start-Process "powershell" "Get-Content -Path output.log -Wait" -NoNewWindow -PassThru
$main_process.WaitForExit()
$log_process.Kill()
exit $main_process.ExitCode