如何在 Github Actions 的 windows-latest runner 上执行 MSI 文件

4

背景

我创建了一个 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目录上执行的那样。


我尝试过的

使用Windows-latest runner的默认Shell(即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文件在本地是有效且可用的)。但是,它会自动打开另一个提示窗口,显示安装和设置日志(它不是在同一个终端窗口中),我想这种情况可能在Github Actions上不会发生。


问题

➡️ 如何通过在windows-latest runner上的命令行从.msi文件安装此应用程序?


1
你可以从 https://github.com/actions/virtual-environments/issues/1704 获取一些想法。 - Lex Li
感谢您的建议@Lex Li。您分享的问题中推荐的手动步骤已经被实施并部署到生产环境中。我尝试添加它,以确保,但它没有解决我的问题,msiexec命令仍然似乎没有在“安装msi”步骤中执行。 - GuiFalourd
1个回答

0

Github社区论坛上询问同样的问题后,我从@Simran-B(Github咨询委员会成员)那里得到了以下答案:

msiexec似乎不会将任何内容记录到终端。如果您的MSI确实这样做 (即使在单独的窗口中),那么它必须是 特定于该MSI的某些东西...

msiexec支持记录到文件。根据有没有办法让msiexec回显到标准输出而不是记录到文件 - 服务器故障, 我成功运行了以下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!,因为每个日志行的强制刷新会使事情变慢,并且带有额外调试信息的冗长输出可能会产生数千行。或者,您可以将所有内容记录到文件中而不进行刷新,等待msiexec退出,然后一次性将文件内容打印到控制台中,这应该会更快(但您会失去实时日志记录)。
如果我没记错的话,GitHub托管的运行程序默认使用提升的权限。在我的本地测试中,我必须从提升的PowerShell中运行上述脚本,因为MSI尝试安装到C:\Program Files\,除非您拥有提升的权限,否则无法写入,这会导致安装失败而没有明显的日志条目。如果.msi路径有问题,您可能会得到1619的退出代码($procMain.ExitCode),这也不是很直观。另一个可能导致未安装任何内容(至少表面上如此)的原因是您实际上并没有等待msiexec完成-命令立即返回,安装过程在后台运行。您可以使用Start-Process选项和-Wait选项或使用-PassThru获取句柄并在其上调用.WaitForExit()来等待其完成。

这对我很有用!使用这些命令,我可以执行.msi文件来安装软件,然后在我的github actions工作流中使用它来执行测试!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接