开发区域

MATLAB的高级软件开发

快去实验室!

大家好,在这篇文章中,我想介绍Mariano Lizarraga Fernandez作为客座博主。他有一个很好的故事可以分享,他演示了Jenkins服务器和GitLab存储库之间经过很好调优的工作流。把它拿走,马里亚诺!

大局

在这篇文章中,我们将展示一个工作流程,展示我们如何在每次推送到git库分支时,在持续集成服务器上运行MATLAB或Simulink测试套件。

我们不会详细描述什么是持续集成以及它所涉及的一切。对于那些感兴趣的人,我们推荐这篇文章作为对这个主题的介绍。这篇文章介绍了将MATLAB与詹金斯,一个著名的持续集成服务器。您可以随意浏览这篇文章以及其他与CI相关的文章持续集成的范畴。

在接下来的文章中,我们假设您对git有一些基本的熟悉,并且有一个Jenkins服务器正在运行(甚至是本地运行),它可以访问被测试的git存储库。我们将展示詹金斯和GitLab(一个著名的开源git存储库管理器),因此您将需要安装GitLab插件詹金斯。

让我们一步一步地浏览工作流。

在本文中,我们将假设一个简化的持续集成工作流程如下:

  1. 对代码或模型进行更改,进行分段,并提交到git存储库的测试分支。
  2. 更改被推送到git远程的测试分支。
  3. 远程存储库(通过web钩子)通知Jenkins CI服务器有一个新的推送事件。
  4. Jenkins服务器从git存储库中提取更改并运行一个测试套件。
  5. 如果测试失败,它会在GitLab中创建一个bug问题,如果测试通过,它会创建一个合并请求。

下面是一个说明这个工作流程的图片:

准备詹金斯

我们之前在这个博客中写过如何去做设置詹金斯启动MATLAB单元测试。这里我们关注的是配置,每次你按下测试分支,触发Jenkins工作流。

首先在Jenkins中创建一个Freestyle项目,并配置您的源代码管理选项卡以使用git。输入远程git存储库的完整地址,配置您的凭证,并确保您将其设置为从您的测试分支。

接下来,配置您的项目,使其在更改被推送到GitLab时生成。请注意GitLab CI服务URL,因为您稍后将需要它来配置GitLab。

最后,配置启动MATLAB用没有显示,改变目录到项目的工作空间,并运行一个脚本,我们将在以下部分编写:

之后,保存您的更改。你的自由式项目准备好了。现在来看看GitLab。

准备GitLab

在GitLab中,要做的第一件事是配置Web Hook,它会在推送发生时通知Jenkins。要做到这一点,导航到你的设置,在集成子小节中,添加你在上一节中编写的URL,选中推送事件复选框,并单击add Webhook按钮:

此时,你可以测试你的网页钩子是否在Jenkins中触发了一个构建。要做到这一点,在GitLab的同一个集成子小节中,从列表中选择你的webhook,并使用测试按钮,选择“推送事件”。你应该立即得到一个蓝色丝带在顶部,表明你的网络钩子执行成功

最后,因为我们将使用GitLab的RESTful API来创建问题和合并请求,所以您需要获得一个个人访问令牌。要做到这一点,请转到您的个人设置(在标准GitLab实例的最右边角落),并从那里转到访问令牌小节。这将带您进入访问令牌创建页面。选择一个名称,选择一个过期日期(也可以留空),对于范围,选中API复选框。

在你点击绿色之后创建个人访问令牌按钮,您将被带到显示令牌的页面。请确保您将该标记记录在某个地方,因为您将无法再次看到它。在编写MATLAB脚本以在Jenkins中运行测试时,我们将使用该标记。

测试脚本

我们将使用该脚本的一个变体这篇Simulink的博客文章

将它转换为一个函数来接收一个参数:参数将决定它是在持续集成中运行还是在本地运行。这将允许我们在本地测试,然后将其推到服务器上运行。

函数runMyTests (ranInCI)导入matlab.unittest.TestRunner进口matlab.unittest.plugins.TAPPlugin进口matlab.unittest.plugins.ToFile工作区= pwd;如果ranInCI == 1 resultsLocation = fullfile(pwd,“结果”);。

Collect当前提交的数据:因此,我们可以在问题或合并请求上添加注释,说明哪个提交通过了,需要合并(或失败了,需要修复)。

从当前提交中收集要包含在问题或合并请求的%正文。[~, commit] = system('git rev-parse -short HEAD');[~, branch] = system(系统)'git rev-parse——abbrev-ref HEAD');

对GitLab的API做一个web GET或POST:我们将使用webwrite和webread来创建问题并根据需要合并请求。注意,你需要在GitLab中创建私有令牌。

如果ranInCI == 1 copyfile(tapResultsFile, fullfile)“TAPResults.tap”));totalFailures =总和(vertcat(结果(:)fail));writeOptions = weboptions (“MediaType”“应用程序/ x-www-form-urlencoded”...“HeaderFields”...“PRIVATE-TOKEN”, gitPrivateToken});如果totalFailures = = 0%如果没有失败,创建一个合并请求writeMergeURL = [gitLabAPI“项目/”ProjectID“/ merge_requests ?”];webwrite (writeMergeURL...“标题”...“[Jenkins]提交测试通过”strtrim(提交),...“描述”...“提交时传递的持续集成”strtrim(提交)...“分支的”strtrim(分支)...”。合并请求已准备好接受审查”),...“标签”“merge_request”...“source_branch”strtrim(分支),...“target_branch”“大师”...“approvals_before_merge”“3”...writeOptions);其他的%测试失败,在GitLab中创建测试失败问题writeIssueURL = [gitLabAPI“项目/”ProjectID“问题?”];webwrite (writeIssueURL...“标题”...“[Jenkins]测试提交失败”strtrim(提交),...“描述”...“在提交时运行持续集成失败”...strtrim(提交)“分支的”strtrim(分支)“。”),...“标签”“错误”...writeOptions);结束结束

把它们放在一起

现在您已经准备好测试完整的工作流了。你可以看看下面的视频,看看整个过程。注意,视频是默片,没有必要调高你的音频。

如果您正在使用MATLAB并使用git进行源代码控制,请考虑使用持续集成服务器来自动化测试并确保运行测试。试一试,让我们知道你的想法!

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。

Baidu
map