容器是一种不断发展的标准化和便携式包装技术。它们最初是为 Web 应用程序和微服务开发和部署而引入的,在 IT 行业中得到了广泛的采用。
今天,我们也看到它们被应用于嵌入式行业,例如汽车电子控制单元(ECU)的开发。这适用于自适应 AUTOSAR 和经典 AUTOSAR,适用于深度嵌入式安全和安保关键系统,其中 C 和 C++ 是主要的编程语言。
容器可在软件开发的任何阶段为嵌入式开发、测试、暂存和生产提供相同环境的快速复制,从而提高整体生产力、代码质量、减少劳动力、节省成本等。
借助容器,组织及其供应商发现了惊人的敏捷性、灵活性和可靠性。公司使用容器来:
缩短软件开发上市时间。
提高代码质量兴趣。
应对管理日益复杂的开发生态系统方面的挑战。
在快速且不断发展的市场中动态响应软件交付试验。
正在使用的一个例子是如何将容器直接部署到当今的现代敏捷开发工作流中,如DevOps / DevSecOps。
在进入细节和好处之前,让我们将这项技术放在上下文中并回答以下问题。
为什么存在容器,它们是什么?
容器如何适应软件开发生命周期?
它们如何影响业务成果?
容器技术
开放容器计划(OCI)是一个Linux基金会项目,由多家公司于2015年建立,旨在围绕容器格式和运行时创建开放的行业标准。该标准允许兼容的容器在所有主要操作系统、硬件、CPU 架构、公共/私有云等中无缝移植。
容器是与其他组件或依赖项(如二进制文件或特定语言运行时库和配置文件)捆绑在一起的应用程序。容器有自己的进程、网络接口和挂载。它们彼此隔离,并在“容器引擎”之上运行,便于携带和灵活。
此外,容器共享一个操作系统。它们可以在以下任一设备上运行。
Linux、Windows 和 Mac 操作系统
虚拟机或物理服务器
开发人员的计算机或本地数据中心
公共云
图 1:容器化架构
了解容器引擎的作用很重要,因为它提供了以下关键功能:
操作系统级虚拟化。
容器运行时,用于管理容器的生命周期(执行、监督、映像传输、存储和网络附件)。
用于隔离资源的内核命名空间。
还有各种容器引擎,包括:Docker,runC,CoreOS rkt,LXD,CRI-O,Podman,Containerd,Microsoft Hyper-V,LXC,Google Container Engine (GKE),Amazon Elastic Container Service(ECS)等。
其他值得一目了然的概念是容器映像和容器业务流程。
容器映像是具有可执行代码的静态文件,包含容器运行所需的所有内容。因此,容器是容器映像的运行实例。此外,在大型复杂部署中,容器化体系结构中可能有许多容器。管理所有容器的生命周期变得尤为重要。
容器编排通过预配、部署、纵向扩展或缩减等方式管理工作负载和服务。流行的容器编排解决方案是Kubernetes,Docker群和Marathon。
现在,让我们考虑一下将应用程序与其所有依赖项打包在一起的灵活性带来的技术和业务收益,以便它们从一个计算环境快速可靠地运行到另一个计算环境。
技术和业务收益
嵌入式软件系统的开发生态系统可能过于复杂。让大型团队都在通用或相同的环境中工作,这增加了复杂性。例如,开发团队环境由编译器、SDK、库、IDE 组成,在某些情况下,还包括人工智能 (AI) 等现代技术的结合。所有这些工具和解决方案都在协同工作,它们的所有依赖项也是如此,以及不断发展的发布版本,这些版本提供对发现的安全漏洞的修复、对已识别缺陷的修复、许可等等。
此外,组织应该有单独的环境用于开发、测试/验证、生产,也许还有灾难恢复。借助容器,组织可以通过轻松扩展或缩减应用程序依赖项、将开发环境恢复到特定状态以及根据需要推出容器映像来有效地管理所有这些复杂的开发环境,从而确保每个团队成员都能获得一致的开发环境。如今,许多组织在每台开发人员/测试人员计算机上复制开发和测试环境,为人为错误留有余地。
我记得有一次我在桌面上开发和测试了一个嵌入式应用程序,它运行良好,所以我提交了代码。很久以后,QA 团队在验收测试期间通知我该应用程序不起作用。我开始调试报告的问题,但无法产生所描述的问题。
我让其他开发团队成员参与进来,以帮助识别和解决问题,但我们就是无法重现问题。经过几天的调查,与QA团队合作,有时抓住稻草,我们终于开始调查QA的构建环境。
一切都是相同的,除了QA团队更新了他们机器上的操作系统(OS)和编译器版本。在他们的操作系统版本中,对任务优先级处理进行了修改。代码逻辑是合理的,但正在运行的任务被具有相同优先级的另一个任务阻止。将竞争任务优先级中的任何一个减少一个都可以解决问题。
由于代码逻辑是第一个疑似罪魁祸首,因此我们花费了大量人力和时间来调查和解决问题。调查问题需要更多开发和 QA 工程师花费更多时间。我们举行了额外的会议和状态报告,并推迟了其他任务。涟漪效应尚不完全清楚,但产生了巨大的成本。如果已经使用容器对开发环境进行集中管理和部署,它将使开发和 QA 团队的部署环境保持同步,并且可以完全避免此问题。
嵌入式部署策略
可以通过多种方式配置和部署使用容器的软件开发。组织可以根据正在使用的现有工具、所需的自动化级别和团队组织来确定容器的使用并不断发展。
策略可以是在开发人员的主机上使用公共容器来制作、构建和运行其应用程序。这可确保每个开发人员都使用完全相同的构建工具和运行环境的集合和版本。
许多嵌入式团队使用 Jenkins、GitHub、Azure、GitLab 等进行持续集成和持续交付 (CI/CD)。在此示例中,有两个容器。一个容器创建并生成应用程序,而另一个容器运行应用程序。这有助于表达容器提供的灵活性。
组织也可能具有图形分布的团队。拥有容器映像库可以促进共享容器并消除重新发明轮子。这通过为不同目的重复使用现有容器来提高效率。共享容器可确保整个开发供应链的质量。
CI/CD 管道中的嵌入式测试自动化
容器也被用于DevOps工作流程中的软件测试。通过将容器化测试解决方案集成到 CI/CD 管道中,组织可以执行静态分析,以确保符合 MISRA C:2012、MISRA C++ 202x、AUTOSAR C++14、CERT、CWE、OWASP 等标准。
像Parasoft C/C++test这样的软件测试自动化工具提供了一个可以在Docker Hub中找到的容器。此外,还可以执行单元测试,包括语句、分支的结构代码覆盖和/或修改条件决策覆盖率 (MC/DC)。然后,只有在成功完成测试后,软件才会提交到主分支中。
构建过程中的这种容器化部署在代码开发和代码质量方面产生了惊人的效率。在这个快速和自动化的持续集成周期中,让多名工程师并行工作,确保在整个产品生命周期中生成和维护坚实的软件基础。
结论
构建嵌入式实时安全和安保关键系统的组织正在采用包含容器的 DevOps 工作流。其他人正在采用集装箱化战略。那些已经构建了 CI/CD 管道并已经使用它几年的公司报告说,他们已经能够更好地预测软件的交付,并轻松适应需求和设计的变化。
随着生产力的提高和测试成本的降低,开发团队报告说产品质量和上市时间都有所提高。此外,嵌入式组织已通知我们 QA 问题报告和客户票证的可衡量下降。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !