开发区域

用MATLAB进行高级软件开发

作为代码的配置Ode

那是一个漆黑的暴风雨之夜。这位敬业的工程师在雨和泥中疾驰,穿过臭名昭著的地形,递送她关键的包裹管道穿越。她有一件至关重要的事要传达,时间是关键。然而,她的信心很强。毕竟,类似的包裹她送过几百次了。她迅速而谨慎地完成了这次重要的分娩,绕过了所有熟悉的坑洼、急转弯和壮观的悬崖。当灾难来临时,她才刚刚开始真正享受她的道路的高效率和精确性带来的激动。

你看,熟悉的路径管道穿越改变了!这不是她所期待的路线,不幸的是,她从未被告知这一变化。这次崩溃很严重。和昂贵的。但最糟糕的是,她发现自己迷失在一条不熟悉的小路上,不知道该怎么接生。她迷路了,包裹不能按需要递送。

让我控制一下自己,不要太沉迷于这个故事,不要辞掉白天的工作去读奶酪球小说。除了Cheese之外,这个故事的主角不是与管理软件交付管道的任何人都有共鸣吗?似乎就在我们对自己的运输渠道最有信心的时候,灾难降临了(通常是在周五下午4:30)amirite吗?)

如果问题出现在您的管道或管道配置中,那么当它出现时,调试就会变得非常困难。如果你的CI/CD管道被埋藏在UI中,这一点尤其正确。你有没有发现自己在喃喃自语:

“我把这条管道设置在哪里了?”

“谁换了我的管道?!”

“我希望我所有的项目都不需要这个锅板!”

…或者,如果你曾经有过数据丢失或CI配置数据损坏的不愉快经历……

“我到底是怎么重新建立起这种关系的(经过3年的时间和多次改变)?”

这些情绪总是通向更好的道路。大多数项目迟早都是通过这一原则来解决管道管理问题的配置代码。这是我向你承诺过的众多博客主题之一,我们将在这里讨论,所以我们终于来到了这里。

配置代码遵循在CI服务器UI中最小化CI配置的原则。我们在管道中所做的不应该被定义为模糊的、不透明的元数据,这些元数据被某个CI服务器实例(在哪里?谁知道!)相反,我们应该用代码定义这个过程和管道——更改发生的地方。记录更改的位置可以被还原,并且完全独立于特定CI服务器实例及其状态。

我们的主角在传送管道穿越虽然她可能无法避免所有的事故,但当问题出现时,诊断并查明原因,最终找到走出峡谷的路要容易得多。

我们的詹金斯插件金宝app支持这一点。我们支持的大多数其他平台,比如金宝appCircleCI,特拉维斯CI,Azure DevOps,GitHub的行为也要遵循这个原则。

为了看看我们Jenkins插件的工作,让我告诉你如何翻译我们讨论过的项目在这里下面是使用该插件支持的Jenkins管道特性的Jenkins文件。金宝app该项目包括一个MEX编译步骤,以及运行测试并产生测试结果和覆盖工件的后续步骤。

其实很简单。该项目在其流程中有以下步骤:

  1. 告诉Jenkins MATLAB在哪里(实际上有更多新闻这也使它更容易管理,但也许这是未来的博客帖子)
  2. 编译mex文件
  3. 运行测试
  4. 处理测试结果和覆盖工件

现在我们不再在UI中定义这些,我们将创建一个Jenkinsfile它包含了管道的这些步骤,我们可以在代码的同时检入项目。

让我们从一个基本的管道开始,该管道指定它可以使用任何可用的Jenkins代理,并拥有一个占位符来将我们的阶段添加到管道中。

管道{代理任何阶段{}}

步骤1

记住,我们的管道有4个步骤,所以我们从步骤1开始。我们得告诉詹金斯MATLAB在哪里。实际上,这是通过设置环境来完成的,这样机器本身就知道MATLAB在系统中的位置路径。当调用MATLAB时,插件将简单地从外壳调用MATLAB,因此使其正确工作只是意味着预先路径环境变量用MATLAB进行此管道的持续时间调用matlabshell将在构建代理上调用所需的MATLAB设置。看起来是这样的:

环境{路径=“/应用程序/ MATLAB_R2020b.app / bin: ${路径}”}

步骤2

下一步是构建mex文件。提醒一下,我们正在进行的示例项目,libDirectional,有一个很好的函数叫做compileAll这对我们很有帮助。记住,我们显示在这里将其置于MATLAB项目的形式有助于正确设置环境。因此,我们的命令只是一个快速打开项目和调用俏蒂compileAll函数。这里我们使用runMATLABCommand步骤,作为插件的一部分。我们不需要担心MATLAB如何启动(随版本的不同而不同),我们只需要担心需要调用的命令。这很简单,只要添加一个舞台,里面有这个步骤:

阶段(“墨西哥人编译文件”){步骤{runMATLABCommand“openProject (pwd);compileAll”}}

步骤3

现在让我们运行测试!上次我们谈到这个问题时,我们运行了项目中定义的所有测试,并以TAP格式生成了测试结果,以Cobertura格式生成了代码覆盖率。这里我要做一点小小的调整,因为处理这些TAP结果的TAPPlugin不像JUnit插件那样支持Jenkins管道。金宝app正如您可能开始看到的,这可以通过一些简单的管道语法来完成,这些语法与我们在UI中可以做的事情相同。

阶段(“运行MATLAB测试”){步骤{runMATLABTests (testResultsJUnit:“matlabTestArtifacts / junittestreport.xml”codeCoverageCobertura:“matlabTestArtifacts / cobertura.xml”)}}

步骤4

…最后,现在我们已经构建了我们的项目,测试了它并生成了一些测试结果和覆盖工件,现在我们可以使用其他的插件来处理这些工件了JUnit插件代码覆盖API插件)。我会把它们加到测试运行的同一阶段。

阶段(“运行MATLAB测试”){步骤{runMATLABTests (testResultsJUnit:“matlabTestArtifacts / junittestreport.xml”codeCoverageCobertura:“matlabTestArtifacts / cobertura.xml”junit)“matlabTestArtifacts / junittestreport.xml”publishCoverage适配器:[coberturaAdapter (matlabTestArtifacts / cobertura.xml)]}}

这就是我们需要的。这里是整个jenkins文件供参考:

管道{代理任何环境{路径=“/应用程序/ MATLAB_R2020b.app / bin: ${路径}”}阶段{阶段(“墨西哥人编译文件”){步骤{runMATLABCommand“openProject (pwd);compileAll”}}阶段(“运行MATLAB测试”){步骤{runMATLABTests (testResultsJUnit:“matlabTestArtifacts / junittestreport.xml”codeCoverageCobertura:“matlabTestArtifacts / cobertura.xml”junit)“matlabTestArtifacts / junittestreport.xml”publishCoverage适配器:[coberturaAdapter (matlabTestArtifacts / cobertura.xml)]} } } }

现在,只需将类似的内容签入存储库的根目录,就可以了。以下是如何创建一个使用它的Jenkins工作:

…现在你可以看到管道运行得很好,因为它从Jenkins文件而不是Jenkins UI中提取了管道指令:

…现在,由于这个管道配置被签入,它与代码一起移动,它可以与代码一起被恢复,它可以与代码一起被检查,它可以与代码一起被推理。代码很漂亮,特别是在有源代码控制、MATLAB项目和我们希望的有用的CI平台集成的支持下。

现在让我们一起放声歌唱吧!!




使用MATLAB®R2020b发布

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。