【问题标题】:Azure Devops Pipeline Matlab Command Bugs between R2019B and R2017BR2019B 和 R2017B 之间的 Azure Devops Pipeline Matlab 命令错误
【发布时间】:2025-12-25 02:50:11
【问题描述】:

我有一个可用的 Azure CI 管道,使用 Matlab 2019 构建代码生成操作。Matlab 项目是为 Matlab 2017B 编写的。它还可以使用 Matlab 2017b 或 2019b 在本地构建/工作。

环境:

这是一台自托管的 Windows 10 计算机,使用多个版本的 Matlab 连接到 Azure Pipelines。 Matlab 2017B 是一个节点锁定许可证。 Matlab2019B 是浮动许可证。

动作:

我将脚本使用的 Matlab 版本更改为 2017B 并运行我的脚本以匹配生产服务器规范。

steps:
  - powershell: Write-Host '##vso[task.prependpath]C:\Program Files\MATLAB\R2017B\bin'  
  - task: RunMATLABCommand@0
    inputs:
      command: myscript

预期

它运行没有问题。或者,脚本中有 1-2 个兼容性问题,我可以随时调试。

结果:

它甚至不能在初始化时设置 Matlab 路径。 (这是打开 matlab 的第 1 步,甚至不是我的脚本的一部分),因此它无法访问标准的 Matlab 函数,并且一切都中断了..

C:\WINDOWS\system32\cmd.exe /D /S /C "C:\agentS\_work\_tasks\RunMATLABCommand_28fdff80-51b4-4b6e-83e1-cfcf3f3b25a6\0.2.6\bin\run_matlab_command.bat "cd('C:\agentS\_work\_temp'); command_1ae12f20_c2aa_4b55_9c6c_6da1d64c4a30""
C:\Program Files\MATLAB\R2017b\toolbox\local\pathdef.m: Cannot open file: permission denied.
[Warning: MATLAB did not appear to successfully set the search path. To recover for this session of MATLAB,
type "restoredefaultpath;matlabrc". To find out how to avoid this warning the next time you start MATLAB,
...
Undefined function or variable 'pwd'.

Error in buildSequence (line 1)
addpath(pwd); 

Error in command_1ae12f20_c2aa_4b55_9c6c_6da1d64c4a30 (line 2)
buildSequence
ERROR: MATLAB error (starter line:1202) Exit Status: 0x00000001

信息:

这是我的发现和尝试。

  1. 检查文件的访问权限

这是我对 matlab 2019、2017 的 2 个文件的访问权限。

-rw-r--r--  1 NARCISS Administrators  39652 Aug 17 13:35 pathdef.m (2017B Matlab)

-rw-r--r--  1 NARCISS Administrators  45073 Sep 14 17:11 pathdef.m (2019B Matlab)
  1. 将 Azure 和本地访问权限与文件进行比较

我知道从 从我的计算机本地运行,从非管理员模式的终端:

cat "C:\Program Files\MATLAB\R2017b\toolbox\local\pathdef.m"
cat "C:\Program Files\MATLAB\R2019b\toolbox\local\pathdef.m"

这两个文件都打印到终端。

并且 从带有自托管 Windows 计算机(与本地计算机相同)的 Azure Pipeline 运行此程序,从非管理员模式的终端:

cat "C:\Program Files\MATLAB\R2017b\toolbox\local\pathdef.m"
cat "C:\Program Files\MATLAB\R2019b\toolbox\local\pathdef.m"

第一个文件被拒绝访问,第二个打印正常。

所以这可以解释为什么脚本在 2019 年运行良好, 但在 2017 年失败,因为它无权访问该文件?

  1. 尝试在本地复制 matlab 上的错误

我在本地打开了 Matlab GUI 和 matlab CLI,并尝试了所说的有问题的行,没有任何问题。

addpath(pwd); 
  1. 尝试在线解决方案更新 pathdef.m

我尝试执行这些步骤,没有任何变化:

  1. https://www.mathworks.com/matlabcentral/answers/102432-why-do-i-receive-a-warning-regarding-missing-pathdef-m-when-starting-matlab-7-14-r2012a

  2. https://www.mathworks.com/help/matlab/matlab_env/when-path-not-successfully-set-at-startup.html

  1. 我尝试了一个用户建议(thx),但我不明白为什么 ls 可以打印文件,同时又无法访问它。文件有读权限,文件夹有可执行权限?
2020-10-02T14:02:11.6188893Z "-------------------------------------------------------"
2020-10-02T14:02:11.6473143Z ls: C:\Program Files\MATLAB\R2017b\toolbox\local\pathdef.m: Permission denied
2020-10-02T14:02:11.6486563Z 885076267 -rwxr-xr-x 1 AI*****$ Administrators 39330 Oct  1 14:10 C:\Program Files\MATLAB\R2017b\toolbox\local\pathdef.m
2020-10-02T14:02:11.6511012Z "-------------------------------------------------------"
2020-10-02T14:02:11.6702428Z 1671000 -rw-r--r-- 1 AI****$ Administrators 45073 Sep 14 17:11 C:\Program Files\MATLAB\R2019b\toolbox\local\pathdef.m
2020-10-02T14:02:11.6722373Z "-------------------------------------------------------"

问题:

我有点卡住了。我不明白本地 CLI 和 Azure 管道 CLI 的行为差异?关于如何修复此错误的任何想法?

【问题讨论】:

    标签: matlab azure-devops continuous-integration command-line-interface azure-pipelines


    【解决方案1】:

    第一个文件被拒绝访问,第二个打印正常。

    通过自托管代理访问azure devops管道中的本地文件,它通过服务帐户而不是个人帐户访问文件,因此您可以从计算机本地运行cmd,并在azure devops管道中出错。

    您需要检查C:\Program Files\MATLAB\R2017b\toolbox\local\pathdef.m文件中服务帐号的权限,然后再试一次。

    更新1

    您可以在文件C:\Program Files\MATLAB\R2019b\toolbox\local\pathdef.m中查看服务帐户的权限,并在C:\Program Files\MATLAB\R2017b\toolbox\local\pathdef.m中配置相同的权限。

    根据您分享的链接,您似乎需要r+x 权限而不是r

    更新2

    我们可以将代理服务帐号更改为您的所有者帐号。

    步骤:在代理机器上打开服务,搜索代理服务账号,查看下图,将账号名和密码改成你的,就会使用这个账号进行操作。

    【讨论】:

    • 你说得对!!!!!!,我从 azure 服务帐户访问文件的权限不同。 ``` 2020-10-02T12:39:28.2481145Z -rwxr-xr-x 1 AI******$ 管理员 39330 Oct 1 14:10 C:\Program Files\MATLAB\R2017b\toolbox\local\pathdef .m 2020-10-02T12:39:28.2684500Z -rw-r--r-- 1 AI******$ 管理员 45073 Sep 14 17:11 C:\Program Files\MATLAB\R2019b\toolbox\local \pathdef.m ```
    • 但是 AI****** 没有读取权限吗?猫不应该工作吗?还是我读错了?
    • 嗨@Weltgeist,感谢您的分享,我已经更新了答案,您可以检查一下。另外,您可以将其标记为答案,这样其他人可以直接找到有用的解决方案。谢谢。
    • 另外,您可以将代理运行服务帐号更改为您的帐号
    • 嗨@Weltgeist,我已经更新了答案,你可以试试。
    【解决方案2】:

    嗯, 在使用另一个浮动许可证(而不是节点锁定许可证)安装第二版 MATLAB2017B 后,我找到了一个修复程序。在 Azure 管道上运行它时,我拥有所有访问权限。

    cat "C:\Program Files\MATLAB\R2017b\toolbox\local\pathdef.m"
    cat "C:\Program Files\MATLAB\R2017b2\toolbox\local\pathdef.m"
    cat "C:\Program Files\MATLAB\R2019b\toolbox\local\pathdef.m"
    

    第一个仍然被拒绝访问。 但是另外两个工作。 R2017B 和 R2019B。 因此,我的 MATLAB 项目像使用 MATLAB 2019b 版本一样打开和构建。

    我不确定这是访问问题还是许可问题,请参阅下面的参考。但它有效。 ^^。就我所知,任何人都可以随意加入。

    参考: https://unix.stackexchange.com/questions/411376/ls-is-giving-a-permission-denied-error-even-though-it-worked https://www.unix.com/unix-for-dummies-questions-and-answers/41487-got-basic-doubt-cat-file-permissions.html https://desk.zoho.com/portal/simlabsoftware/en/kb/articles/what-it-is-the-difference-between-standalone-and-floating-license#:~:text=Floating%20license%3A,the%20number%20of%20concurrent%20usershttp://kb.mit.edu/confluence/pages/viewpage.action?pageId=4273647

    【讨论】: