[英]How to set-up Github Actions for Xamarin apps in windows-latest VM?
[英]How to execute MSI file on Github Actions (windows-latest runner)
我創建了一個 Github Actions 工作流,該工作流生成一個我不想在之后執行的.msi
文件來測試應用程序是否按預期工作。
工作流實現如下
build-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2.3.4
- name: Create binary from branch
run: |
choco install make
make build-windows
- name: Generate msi
shell: powershell
run: .\.github\scripts\windows\gen-win.ps1
- name: Install msi
run: |
echo "Start Msiexec"
msiexec /qn /i "file.msi" /L*vx!
echo "End Msiexec"
基本上,這個工作流會創建.exe
文件( Create binary from branch
文件步驟),然后使用 powershell 中的腳本生成.msi
文件( Generate msi
步驟),最后嘗試安裝.msi
文件( Install msi
步驟)。
問題出現在Install msi
步驟,運行器日志僅返回:
Start Msiexec
End Msiexec
...不顯示任何日志,或創建目錄和文件,就像安裝應該在$HOME
目錄上做的那樣。
使用默認 shell for windows-latest runner(即cmdlet
),我嘗試在工作流中運行這些命令,但沒有成功,使用"file.msi"
或"path/to/file.msi"
:
msiexec /i "file.msi"
msiexec /qn /i "file.msi"
msiexec /qn /i "file.msi" /L*vx!
我對 windows 操作系統不是很熟悉,但是對於我在網上搜索的內容,這個 msiexec 命令應該可以工作。
我還嘗試使用這些命令成功地在 windows 10 計算機上安裝手動生成的.msi
文件(因此生成的.msi
文件有效並且在本地工作)。 但是,它會打開另一個提示 window自動顯示安裝和設置日志(它不在同一個終端窗口中),我想這可能不會發生在 Github 操作上。
➡️如何通過 windows-latest 運行器上的命令行從.msi
文件安裝此應用程序?
在Github 社區論壇上問了同樣的問題后,我從@Simran-B (Github 咨詢委員會成員)那里得到了以下答案:
msiexec 似乎沒有向終端記錄任何內容。 如果您的 MSI 有(即使在單獨的窗口中),那么它必須是特定於該 MSI 的東西……
msiexec 支持的是記錄到文件。 基於Is there Anyway to get msiexec to echo to stdout instead of logging to a file - Server Fault ,我成功運行了以下 PowerShell 腳本(使用 Blender MSI 作為測試):
$file = "file.msi"
$log = "install.log"
$procMain = Start-Process "msiexec" "/i `"$file`" /qn /l*! `"$log`"" -NoNewWindow -PassThru
$procLog = Start-Process "powershell" "Get-Content -Path `"$log`" -Wait" -NoNewWindow -PassThru
$procMain.WaitForExit()
$procLog.Kill()
我不能推薦
/l*vx!
,因為每個日志行的強制刷新會使事情變慢,而帶有附加調試信息的冗長 output 會產生數千行。 或者,您可以在不刷新的情況下將所有內容記錄到文件中,等待msiexec
退出,然后在 go 中將文件內容打印到控制台,這應該會更快(但您會丟失實時日志記錄)。如果我沒記錯的話,GitHub 托管的運行器默認使用提升的權限。 在我的本地測試中,我必須從提升的 PowerShell 運行上述腳本,因為 MSI 試圖安裝到
C:\Program Files\
. 如果.msi
路徑有問題,您可能會得到 1619 ($procMain.ExitCode
) 的退出代碼,這也不是很直觀。 沒有安裝的另一個可能原因(至少很明顯)可能是您實際上並沒有等待msiexec
完成 - 命令立即返回並且安裝過程在后台運行。 您可以使用帶有-Wait
選項的 Start-Process 或使用 -PassThru 獲取句柄並在其上調用.WaitForExit()
以等待它完成。
它對我有用,使用這些命令,我可以執行.msi
文件來安裝軟件,然后在我的 github 操作工作流程中使用它來執行我的測試!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.