在容器化环境中部署静态分析和单元测试(1):如何为容器化开发环境配置Parasoft C/C++test 2020.1
如何为容器化开发环境配置
的发行版带来了一系列增强功能,这些增强功能使其易于与Docker容器一起使用。我将引导您完成配置以在容器化开发环境中工作的步骤。
嵌入式开发团队喜欢Docker容器
开发工具的容器化部署正成为嵌入式开发团队的生力军。尽管最初开发容器是为了解决微服务和基于Web的应用程序部署方面的问题,但它们最近在嵌入式团队(尤其是使用容器来管理复杂工具链的大型团队)中越来越受欢迎。
在管理复杂的开发环境时,尤其是在对安全至关重要的领域中,团队通常会面临以下挑战:
- 将整个团队的升级同步到工具的新版本,例如编译器、构建工具链等。
- 动态响应库或软件开发套件(SDK)等的新安全补丁。
- 确保所有团队成员和自动化基础架构(CI/CD)的工具链的一致性。
- 能够对开发环境进行版本控制并还原它,以服务于已通过特定工具链认证的产品的旧版本。
- 入职并设置新的开发人员。
使用容器很容易解决所有这些问题。难怪团队喜欢容器!让我们看一下如何配置以在容器化环境中使用。
将与容器化编译工具链一起使用
配置可以很容易地与编译工具链和部署在容器中的执行环境一起使用。我们支持基于Linux和Docker容器的部署。以下是该类型设置外观的高级概述:
如您所见,访问容器化编译器(GNU GCC)和运行时环境。在此特定设置中,有两个单独的Docker容器:
- 一种用于编译器和构建工具
- 另一个用于执行环境(例如,嵌入式Linux的剥离版本)
编译工具链用于静态分析,以在解析之前对代码进行预处理,并用于单元测试以编译检测到的源代码。执行环境仅用于单元测试,以运行带有单元测试用例的创建的测试二进制文件。
配置
让我们看看如何配置使其与容器内编译工具链和执行环境一起使用。在示例中,我们将使用Docker集线器提供的最新GCC容器映像。
以下说明假定您已在环境中正确安装和配置了Docker引擎。与相同。
步骤1:启动
1.确保您的Docker工作正常。让我们先进行快速测试,并打印出GCC容器的“最新”映像中包含的GCC编译器的版本号:
2.在运行之前,将专用的环境变量CPPTEST_CONTAINER_NAME设置为容器的名称。这是告诉应该使用哪个容器来调用编译器或链接器的简单方法。它与Jenkins工作配合得很好。
3.另外,建议您将CPPTEST_INSTALL变量设置为指向安装目录。它使安装简单。一旦设置了变量,就可以开始。
4.对于您的工作区,在HOME目录中的某个位置选择一个位置(稍后将对此进行更多介绍)。
步骤2:创建一个演示项目
为了使创建演示项目超级简单,让我们使用标准的“新建项目”向导创建默认的“HelloWorld”项目。
1.选择File Menu> New> C++ Project,然后选择“Hello World C++ Project”。
2.输入项目的选择名称。它看起来或多或少类似于以下屏幕截图。
3.单击“完成”为我们的示例创建默认项目。
步骤3:修改编译器设置
创建项目后,在中修改几个项目。
1.右键单击项目,然后选择属性“Properties”,然后选择Parasoft>C/C++test>Build Settings。
2.在构建设置“Build Settings”面板中,修改编译器“Compiler”设置部分中的两项:
- Family——进行更改以匹配容器中安装的编译器。在撰写此文时,最新的“gcc”映像包含GNU GCC 9.2编译器,提示选择“GNU GCC 9.x (x86_64)”编译器配置。
- 默认编译器可执行文件——编译器的默认可执行文件必须替换为特殊包装,才能调用容器内编译器,而不是直接安装在主机操作系统中的常规编译器。这些包装程序remote-gcc和remote-g++随发行版一起提供。在下面的屏幕截图中,我在安装目录中使用了辅助环境变量。您可以为您的环境设置类似的变量,也可以使用完整路径查找包装脚本。
步骤4:验证容器正在运行
使用之前,请确保带有编译工具链的容器已启动并正在运行。
我们在上一步中设置的编译器包装器旨在在正在运行的容器中执行编译器命令,这比每次调用都启动容器要快。
对于CI/CD部署,可以在运行之前启动容器,然后在运行之后停止容器,这是Jenkins作业的一部分。在此示例中,我们假定使用GUI base。为此,我们可以创建Eclipse运行配置。我建议创建两个“C/C++应用程序”类型的配置,并将其命名如下:
- “启动gcc容器”
- “停止gcc容器”
1.选择运行菜单>运行配置......
2.创建两个名为“启动gcc容器”和“停止gcc容器”的运行配置。
3.在两种配置的“Main”选项卡中,将您的Docker路径作为“C/C++应用程序”输入,如下所示:
4.对于“启动gcc容器”,在参数选项卡中输入以下命令:
run --rm -d -it --name gcc -v ${env_var:HOME}:${env_var:HOME}
-v ${env_var:CPPTEST_INSTALL}:${env_var:CPPTEST_INSTALL} gcc
如下面的屏幕截图所示:
该命令有趣的部分是-v选项,用于映射卷。
第一个-v选项将本地HOME目录映射到容器文件系统。这样做的目的是使访问在容器内运行的编译器以及在主机操作系统中运行的Parasoft C/C++test的源代码成为可能。
为了方便起见,我在示例中使用HOME是因为我将工作区直接放置在HOME中。
对于实际设置,您只能严格地将文件系统中包含源树和Eclipse工作区的部分与项目映射。
第二个-v选项映射安装目录的位置,以允许访问容器内的头文件。
5.对于“停止gcc容器”,在参数选项卡中输入以下命令,如下图所示:
stop gcc
6.让我们使用“启动gcc容器”运行配置来运行容器。
Eclipse控制台应向您显示容器的哈希值。为确保一切正常,您可以切换到命令行并调用以下命令:
如果您在列表中看到我们的“gcc”容器,则可以开始使用来测试代码了。
7.让我们在导航器中选择项目。使用菜单,选择Test Using> Builtin> Unit Testing> Generate Unit Tests。
您应该看到在项目内部创建了一个新的“tests”目录,并为“main”功能创建了一个单元测试。
8.生成测试用例后,就可以执行它们了。对于执行,请在容器中选择Test Using> Builtin> Unit Testing> Run Unit Tests。
应该调用容器内部编译和链接命令行的集合,最后在容器中创建和执行测试二进制文件。
于是,通过这些步骤,您准备了以使用容器内编译工具链执行测试活动。
如果需要为项目更改编译器或在运行时执行环境中进行某些修改,则可以更新容器映像或将其更改为其他版本。(记住要更新CPPTEST_CONTAINER_NAME变量。)
请继续关注第二部分。我将解释如何使用Parasoft C/C++test Standard创建容器映像。