开发区域

MATLAB高级软件开发

作为代码的配置颂歌

那是一个漆黑的暴风雨之夜。这位敬业的工程师倾身穿过雨水和泥泞,穿过恶名昭彰的充满挑战的地形,递送她的关键包裹管道穿越。她有一份极其重要的文件,时间是至关重要的。然而,她的信心很强。毕竟,她已经送过几百次类似的包裹了。她迅速而小心地护送着这重要的货物,绕过了所有熟悉的坑洼、急转弯和壮观的悬崖峭壁。她刚开始真正享受着这条道路的高效和精确所带来的快感,就在这时,灾难降临了。

你看,熟悉的路径管道穿越改变了!这不再是她期待的同一条路线,不幸的是,她从未被告知这一变化。这次事故很严重。和昂贵的。但最糟糕的是,她现在发现自己迷失在一条陌生的道路中间,不知道如何分娩。她迷路了,包裹也没能按要求送到。

在我太沉迷于这个故事而放弃我的日常工作去追求奶酪球小说之前,让我控制一下自己。撇开奶酪不谈,这个故事中的主人公难道不是与任何参与管理软件交付管道的人都有关系吗?似乎就在我们对我们的交付管道最有信心的时候,灾难来了(通常是在周五下午4:30)amirite吗?)

如果问题出现在您的管道或管道配置中,那么当问题出现时,调试将非常具有挑战性。如果您的CI/CD管道隐藏在UI中,则尤其如此。你有没有发现自己在喃喃自语:

“我在哪里安装了这条管道?”

“谁改变了我的管道?!”

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

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

“我究竟是如何(在3年的时间里,经历了多次变化)重新建立起这一切的?”

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

配置即代码遵循最小化CI服务器UI中的CI配置的原则。我们在管道中所做的不应该被定义为由某个CI服务器实例(在哪里?谁知道!)相反,我们应该用代码定义流程和管道——变化发生的地方。在记录更改的地方,可以恢复更改,并且完全独立于特定的CI服务器实例及其状态。

我们的主角沿着管道穿越虽然她可能无法避免所有的事故,但当问题出现时,诊断和确定原因以及最终走出峡谷的方法要容易得多。

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

要查看Jenkins插件的工作,让我向您展示如何翻译我们讨论的项目在这里使用插件对Jenkins pipeline特性的支持,转移到Jenkinsfile金宝app。该项目包括一个MEX编译步骤和一个后续步骤,以运行测试并生成测试结果和覆盖率工件。

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

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

现在我们不是在UI中定义这些,而是创建一个Jenkinsfile它包含管道的这些步骤,我们可以将其与代码一起签入到项目中。

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

管道代理任何阶段}}

步骤1

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

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

步骤2

下一步是构建mex文件。提醒一下我们正在做的例子项目,libDirectional,有一个很好的函数叫做compileAll这对我们很有用。还记得吗,我们展示过在这里把它放在MATLAB项目的形式有助于正确设置我们的环境。因此,我们的命令只是快速打开项目和调用niftycompileAll函数。这里我们使用runMATLABCommand这一步是插件的一部分。我们不需要担心MATLAB如何启动(它随不同的版本而变化),我们只需要担心我们需要调用的命令。这就像在其中添加一个台阶一样简单:

阶段(“编译MEX文件”){步骤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)]}}

就是这样,这就是我们所需要的。以下是整个詹金斯档案供参考:

管道代理任何环境路径=“/应用程序/ MATLAB_R2020b.app / bin: ${路径}”}阶段阶段(“编译MEX文件”){步骤runMATLABCommand“openProject (pwd);compileAll”}} stage(“运行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帐户或创建一个新帐户。