开发区域

高级软件开发与MATLAB

将配置作为代码的颂歌

那是一个漆黑的暴风雨之夜,这位敬业的工程师在雨中和泥泞中艰难前行,在这片臭名昭著的土地上运送她的关键包裹管道穿越.她有一次至关重要的演讲,时间是至关重要的。然而,她的信心是很强的。毕竟,她已经送过几百次类似的包裹了。她迅速但小心地引导着这一重要的交付,绕过所有熟悉的坑洼、发夹弯和壮观的悬崖峭壁。当灾难来临时,她刚刚开始真正享受她的路径的效率和精确所带来的兴奋。

你看,熟悉的路径管道穿越改变了!这已经不是她所期待的那条路线了,不幸的是,她从来没有被告知这一变化。这次崩溃是巨大的。和昂贵的。但最糟糕的是,她发现自己迷失在一条陌生的道路中间,不知道该如何分娩。她迷路了,包裹也不能按需投递。

在我全神贯注于这个故事并放弃我的日常工作去追求奶酪球小说之前,让我控制住自己。撇开奶酪不谈,我们在这个故事中的主角不是和任何参与管理软件交付管道的人都有关系吗?似乎就在我们对交付管道最有信心的时候,灾难发生了(通常是在周五下午4:30)阿米丽特吗?)

如果问题出现在您的管道或管道配置中,那么当问题出现时,调试可能会非常困难。如果您的CI/CD管道埋在UI中,尤其如此。您是否曾发现自己在嘀咕这样的事情:

“我在哪里建立了这条管道?”

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

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

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

“我究竟是如何(在三年多的时间里)重新建立起来的?”

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

“代码配置”遵循的原则是尽量减少CI服务器UI中的CI配置。我们在管道中所做的工作不应定义为CI服务器实例在某处(哪里?谁知道!)。相反,我们应该用代码定义流程和管道-更改发生的位置。更改记录的位置可以恢复,并且完全独立于特定CI服务器实例及其状态。

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

我们的詹金斯插件金宝app支持这一点。我们支持的其他平台,比如金宝appCircleCI特拉维斯CI天蓝德沃斯,GitHub操作也要遵循这个原则。

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

其实很简单。这个项目有以下步骤:

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

现在,我们将创建一个詹金斯档案它包含了管道的这些步骤,我们可以把它签入到我们的项目中,就在我们的代码旁边。

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

管道代理任何阶段} }

步骤1

记住,我们的管道有4步,所以我们从第1步开始。我们需要告诉Jenkins MATLAB在哪里。这实际上是通过设置环境来实现的这样机器本身就知道MATLAB在系统中的位置路径.当调用MATLAB时,插件将简单地从shell调用MATLAB,所以使它正确地工作简单地意味着预先路径环境变量在此管道的持续时间内,以便调用matlab将调用构建代理上设置的所需MATLAB。看起来是这样的:

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

步骤2

下一步是构建mex文件。作为提醒,我们正在处理的示例项目,libdirective,有一个很好的函数叫做compileAll这对我们很有用。记住,我们显示在这里将其以MATLAB项目的形式放置有助于正确设置环境,因此我们的命令只是快速打开项目并调用niftycompileAll函数。这里我们使用runMATLABCommand步骤是插件的一部分。我们不需要担心MATLAB如何启动(随着版本的不同而变化),我们只需要担心需要调用的命令。只需添加一个包含以下步骤的阶段即可:

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

步骤3

现在让我们运行测试!上次我们谈到这个问题时,我们运行了项目中定义的所有测试,并以TAP格式生成测试结果,以Cobertura格式生成代码覆盖。我将在这里做一个小小的调整,因为处理这些TAP结果的TAPPlugin不支持Jenkins管道,也不支持JUnit插件。金宝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”出版覆盖率适配器:[coberturaAdapter('matlabTestArtifacts/cobertura.xml')]} }

就是这样,这就是我们需要的。以下是整个Jenkinsfile供参考:

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

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

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

…现在,由于此管道配置已签入,它与代码一起传输,可以与代码一起还原,可以与代码一起查看,也可以与代码一起推理。代码非常漂亮,特别是在有一点源代码控制、MATLAB项目以及我们希望的有用CI平台集成的支持下。

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




发布与MATLAB®R2020b

|

コメント

コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。