写点什么

Docker 教程:如何将 Helix QAC 创建为一个容器并运行?

  • 2023-04-10
    上海
  • 本文字数:4734 字

    阅读完需:约 16 分钟

Docker教程:如何将Helix QAC创建为一个容器并运行?

在这个 Docker 教程中,你将了解到如何将Helix QAC创建为一个容器化的镜像并运行。


Docker的基本定义是一个开源且流行的操作系统级虚拟化(通常称为“容器化”)技术,它是轻量级且可移植的,主要在 Linux 和 Windows 上运行。Docker 通过使用容器,使创建、部署和运行应用程序变得更加容易。


从根本上说,容器只是一个运行的进程,并应用了一些附加的封装特性。借助容器,开发人员(和 DevOps 管理员)可以将应用程序与运行应用程序所需的一切(包括代码、运行时刻、库、配置的环境变量和配置文件)打包在一起,并将所有内容作为一个软件包交付。


还值得一提的是,Docker 可以立即启动,并具有内置的版本控制和组件复用机制。这些 Docker 容器可以通过公共 Docker Hub 或私有存储库共享,使它们易于访问和使用。


以下是 Docker 的一些显著优势:


  • 快速部署: Docker 可以为每个进程创建一个容器,这些容器可以按需快速启动和关闭,而无需启动平台操作系统(OS)。这将部署过程时间缩短到几秒钟。此外,Docker 镜像的启动几乎是即时的。

  • 可移植性: Docker 可以将经过测试的容器化应用程序部署到任何其他运行 Docker 的系统上,并确保它的性能与测试时完全相同。Docker 镜像可以与其他团队共享。

  • 性能: 尽管虚拟机(VM)是容器的替代方案,但 VM 具有操作系统,而 Docker 容器没有。这意味着容器比 VM 占用更少的资源,创建速度更快,并且启动和关闭的时间也更快。

  • 持续集成效率: Docker 使您能够构建容器镜像,并在开发、测试和部署的每个步骤中使用它。此外,您还可以将非依赖性步骤分开,然后并行运行它们,从而缩短从构建阶段到生产部署阶段所需的时间。这缩短了设置环境和调试环境特定问题的时间,使它们更可靠且更易于维护。


但是,Docker 也有一些限制,即使它们对 Docker 的静态分析器的设置影响很小,但了解这些限制依然很重要。


  • Docker 不能替代虚拟机:在虚拟机中运行的许多应用都可以移动到容器中,但并不是说所有的应用都需要或都可以移动到容器中。例如,具有严格监管要求的行业可能无法用容器替换虚拟机,因为虚拟机提供比容器更高级别的隔离。

  • 容器中的数据:有时容器会出现故障,在这种情况下,它需要备份和恢复策略。虽然有几种解决方案,但没有一种是自动化或可以扩展的。另一个限制是,除非在容器关闭之前将其保存在某个地方,否则当容器关闭时,其中的所有数据都将永远消失。

  • 跨平台兼容性: 如果一个应用程序设计为在特定平台(例如 Windows 操作系统平台或 Linux)上的 Docker 容器中运行,则无法在任何其他平台上运行。然而,虚拟机不受此限制,因此这种限制使 Docker 对于一些由 Windows 和 Linux 服务器组成的高度异构的环境不太具有吸引力。

  • 使用图形界面运行应用程序:总的来说,Docker 是为托管在命令行上运行的应用程序而设计的。虽然有几种方法(比如使用 X11 转发或 MobaXterm)可以让我们在 Docker 容器中运行图形界面,但这些过程很繁琐。因此,可以说 Docker 对于需要丰富接口的应用程序来说不是一个好的解决方案。


为了帮助大家更好地将静态分析工具设置为 Docker,并解除这些限制,我将设置过程分解为三个简单的部分。


您可以从访问https://docs.docker.com/get-started/overview开始,里面有很多关于如何设置 Docker 引擎并验证环境是否正确设置的详细信息。

第一部分:准备 Docker 引擎


从此网站https://docs.docker.com/engine/install下载并安装适合您操作系统平台的 Docker 引擎。


通过运行名为“hello-world”的样例 Docker 镜像来验证 Docker 引擎是否已正确安装。使用此命令示例:


  • $ sudo docker 运行 hello-world

  • 该命令将下载一个简单的“hello-world”测试 Docker 镜像并在容器中运行它。因此,当容器运行时,它会打印一条信息性消息并退出。


下一部分的目标是设置一个 Docker 容器,让它作为 Helix 静态代码分析工具来运行。有几种方法可以配置 Docker 镜像以支持不同的编码合规性模块,例如 MISRA、AUTOSAR、CWE、CERT 和静态代码扫描工具等。


但是,在本教程中,我将只演示如何使用一些重要的组件来构建特定的 Docker 镜像,我们将在 Docker 容器中使用这些组件作为Helix QAC工具(DaaQT)。


另外,我还将讨论在运行分析扫描工具时,如何处理项目数据配置的持久化,这样您就可以将 Helix QAC 项目规范和项目支持配置文件存储在 Docker 容器外,比如 prqa 项目文件夹和 pqraproject.xml.<name>支持的文件。


对这些文件所做的任何更改将在 Docker 容器执行完成并关闭后持久存在。任何构建脚本的更改都会从一个构建到另一个构建输出到主机上映射的外部项目文件夹,并保持持久性。

第二部分:创建、构建和运行


首先,让我们来确定一些我选择用于构建 Docker 镜像的组件及其基本描述。


  • Helix-QAC-2022.2(C/C++静态分析解析器)

  • ASCM-3.3.0(AUTOSAR C++14 编码合规性)

  • M3CM-3.3.0(MISRA C 2012 编码合规性)

  • MCPP-2.3.0(MISRA C++ 2008 编码合规性)

  • CERTCCM-2.3.0(C 语言的安全编码标准支持)

  • CERTCCPCM-2.3.0(CPP 的安全编码标准支持)


接下来,下载您可用(或已购买)的 Helix QAC 解析器工具和编码合规性模块,并将这些安装文件放入主机上的已知文件夹位置。


  • 在我的示例中,将有六个文件(一个解析器工具文件和五个编码合规性模块)。


接下来,创建一个 Docker 构建脚本文件。例如,我将文件命名为“qacDockerfile”,没有文件扩展名(默认名称是“dockerfile”)。该文件将由 Docker 引擎用来创建您的 Docker 镜像。基本上,它有一个命令列表,将按从上到下的顺序发送给 docker 引擎来执行。


然后将这些文件(包括 qacDockerfile)放在 DaaQT 文件夹中。这些是生成此 Docker 镜像所需的唯一文件。另外,请注意我将它们放在“vDockerBuilds/DaaQT”文件夹下。



以下是“qacDockerfile”脚本文件的内容和一些解释。



  • 第 1 行选择了 Ubuntu 22.04 作为基础镜像。

  • 第 4 行到第 7 行使 Ubuntu 操作系统保持最新状态,并允许设置时区。

  • 第 10 行是可选的,但建议添加这些有用的工具,因为 Ubuntu 基础镜像是准系统。

  • 第 15 行将安装基本的构建工具、GNU 编译器依赖项和任何支持文件。这一步针对编译器工具链的使用需求会有所不同。但是,在我的示例中,这个镜像将使用 gcc/g++ 11 编译器。

  • 第 19 行和第 20 行指示 Docker 引擎创建一个名为“QacWorkspace”的工作目录,所有后续命令都将使用该目录。

  • 第 25 行将所有安装文件的权限更改为可执行。

  • 第 28 行以静默模式安装 Helix-QAC 解析器工具并接受许可协议。

  • 第 31 行至第 35 行以静默模式安装选定的编码合规性模块并接受许可协议。

  • 第 38 行清理安装文件,使 Docker 镜像尽可能减少占用空间。

接下来,要构建 Docker 镜像,我们需要运行以下命令:

$> docker build --pull --no-cache -f qacDockerfile -t qacscatools:22v2.

  • 拉取和无缓存参数用于确保始终获取最新的 ubuntu 镜像,并从头开始构建 Docker 镜像。

  • -f 是 qacDockerfile 名称,默认情况下原始名称是 Dockerfile。

  • -t 是格式“name:tag”因此名称是“qacscatools”,标签是“22v2”,以指示使用了哪个 Helix-QAC 工具版本。

  • 不要忘记末尾的“dot”,它表示这是一个本地目录。


构建镜像过程完成后,可以看到最后两行消息,指示写入文件并标记镜像。若要验证构建是否成功,请运行以下命令以显示所有可用 Docker 镜像列表。


  • $>docker images



(注意:上图中,图像标签 ID 为 bd8c9d08dc4d。)

第三部分:在本地项目上运行 DaaQT


在我们使用这个 Docker 容器化镜像(作为 QAC 工具的 Docker——DaaQT)在本地桌面项目上运行任何静态代码分析之前,我们需要确保我们有权访问许可证服务器,以获得使用该工具的权限。


在我的示例中,我将使用外部远程 Reprise 许可证管理服务器来请求要使用的许可证。


首先,我们需要创建一个本地项目运行脚本,该脚本知道在哪里以及如何访问远程 Reprise 许可证服务器。此项目运行脚本还必须知道 Helix QAC 仪表板服务器的位置,以便在分析运行完成后上传项目诊断消息结果。


让我们审查一下名为“runQACSCA.sh”的脚本文件及其内容。我将逐步解释它的作用。



  • 第 3 行是对桌面计算机上项目文件夹名称的引用。

  • 第 7 行是 Helix QAC 仪表板服务器上项目持有者的名称,用于上传诊断消息和项目信息。(注意:第 8 行可用于匹配本地文件夹名称。)

  • 第 9 行到第 11 行是有关 Helix QAC 仪表板服务器的信息,例如 URL 地址(或 FQDN)、服务器端口和许可证服务器端口。

  • 第 14 行是本地桌面项目工作区名称服务器 URL 地址(或 FQDN)、服务器端口和许可证服务器端口。

  • 第 15 行和第 16 行是对 Helix QAC 解析器工具所在位置的内部 Docker 镜像的引用,以及映射项目工作区的位置。

  • 第 19 行供 Docker 与许可证服务器通信,以请求使用工具许可证。

  • 第 25 行将 Docker 镜像设置为正确的入口点,以便定位映射的项目工作区。

  • 第 28 行到第 29 行是选择一个规则配置文件用于项目。这些默认文件名是针对特定规则组配置进行标识的。您可以通过合并任何一个或多个规则配置文件来创建自己的自定义 RCF 文件,但在使用之前,必须在 Helix QAC 桌面 GUI 应用程序中完成自定义 RCF 文件的创建。此外,新的自定义名称需要与默认文件名不同。

  • 第 34 行和第 35 行是为编译器工具链进行映射。在我的示例中,我已经映射到要使用地 GNU C/CPP 11.2 版本。

  • 第 38 行用于创建 PRQA 项目配置并设置需求项目配置。

  • 第 41 行让 Helix QAC 能够监控和跟踪项目如何用其命令进行本地构建。

  • 如果项目需要执行一些关系跨模块分析(RCMA)和/或多线程分析(MTA),则通常使用第 44 行和第 45 行。

  • 第 47 行到第 49 行是选择一个编码合规性模块,用于满足您的编码合规性要求需求。请确保此设置与第 28 行至第 31 行的 RCF 设置相匹配。

  • 第 52 行是使用上述所有配置和设置参数,对您的项目执行静态代码分析。

  • 第 55 行是将项目分析扫描结果上传到 Helix QAC 的仪表板服务器,并将其放在项目持有人中。上传的信息是包含诊断消息以及项目配置设置的源文件。


运行以下 Docker 命令,这些命令会将本地项目卷映射到 Docker 项目卷,以便保留分析数据文件。请密切注意 ENTRYPOINT 参数,其中的脚本文件“runQACSCA.sh”将从项目根文件夹执行。

以下是带有一些解释的 Docker 命令:


docker run --rm -it -v

~/ProjectsSandbox/MyCppCodeQac:/QacWorkspace/MyCppCodeQac--entrypoint=/QacWorkspace/MyCppCodeQac/runQACSCA.sh qacscatools:22v2


  • “run”,就是执行。

  • “-it”以交互方式运行 Docker(因此您会获得一个带有 STDIN 的伪 TTY)。

  • “--rm”会导致 Docker 在容器退出时自动删除容器。

  • “-v”表示卷映射 LocalHostVolume:DockerVolume。

  • “--entrypoint” 为登录后的开始位置,可以是命令行开始运行带有指示内容的 location/file_name.sh。


您也可以使用 shell 脚本来运行它,而不必记住在命令行上输入的所有参数。除了不必记住所有这些细节之外,这也使我们对脚本文件进行最小的更改,以适应其他类似的项目。


在我的例子中,我创建了一个名为“runDaaQT.sh”的 shell 脚本。



显示 Docker 命令行用法的屏幕截图。



显示 shell 脚本使用情况的屏幕截图。



作为选择,您也可以为 CMakeNinja 项目运行这个 Docker 容器,它的命令行与之前演示的项目类似。这个项目使用 CMake 和 Ninja 命令行构建系统。


要使用类似的命令行或 shell 脚本文件,您需要在命令行中对正确项目卷(CMakeNinja)名称的命令语法进行一些编辑,如下所示:


$> docker run --rm -it -v

~/QacProjectsSandbox/CMakeNinja:/QacWorkspace/CMakeNinja--entrypoint=/QacWorkspace/CMakeNinja/runQACSCA.sh qacscatools:22v2



显示 CMakeNinja 项目命令行用法的屏幕截图。

作者简介:

Dzuy Tran

Klocwork 和 Helix QAC 高级解决方案架构师,Perforce 公司


DzuyTran 在硬件和软件嵌入式系统,RTOS,移动应用程序和企业系统的设计和开发方面拥有 30 多年的经验。当客户遇到技术问题时,他会帮助他们,协助进行概念验证,并演示静态代码分析工具,并帮助指导客户进行 DevOps 实施流程和持续集成部署。Dzuy 拥有国立理工大学计算机科学和计算机工程硕士学位。

文章来源:http://bit.ly/3ZTux4I

用户头像

还未添加个人签名 2021-05-18 加入

分享DevSecOps解决方案最新动态,帮助您学习与使用Atlassian, Perforce, Whitesource, Cloudbees及龙智自研产品,实现软件研发的高度协同与自动化,提高交付效率与质量,并确保开发过程可追溯、可度量。

评论

发布
暂无评论
Docker教程:如何将Helix QAC创建为一个容器并运行?_Docker_龙智—DevSecOps解决方案_InfoQ写作社区