繁体   English   中英

如何在 Github 操作上执行 MSI 文件(Windows 最新运行程序)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM