Shippable和Packet合作提供原生ARM CI/CD

Shippable与Packet合作推出了面向ARM v8-A架构的CI/CD托管服务,支持开发者在Packet提供的云服务上构建和验证软件。此服务允许开源和商业项目按需使用基于ARM的基础设施,通过‘自带ARM节点’的方式实现更灵活的测试和部署。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DevOps自动化平台Shippable和裸金属云服务提供商Packet联合发布了一种新的持续集成和交付(CI/CD)托管服务,适用于在Arm®v8-A架构上开发软件应用的开发人员。该解决方案支持开源和商业软件项目,用于在Packet提供的基于ARM的云服务上按需(on-demand)构建和验证软件。

\\

在原生ARM支持服务尚未推出之前,开发人员构建和验证代码时需要使用模拟器,而模拟器无法检测到代码库中一些特定于架构的缺陷。现在,开源项目的ARM开发人员在构建并测试工作流时,可以使用Packet提供的基于32位和64位ARM设备的云服务。而商业项目可以在Packet云上开通(provisioning)设备,并将设备添加为Shippable预定的构建节点,进而采用“构建自己的ARM节点(BYON,Bring Your Own Arm Node)”方式,使用Shippable执行软件验证工作流。一个组织也可将自身所具有ARM设备添加到其中。

\\

如果一个组织出于安全原因并不希望自己的源代码脱离防火墙或是架构的可控范围,或是作业需要访问在组织网络之外无法访问的一些依赖关系,这时组织通常会选择采用BYON方式。BYON支持开发人员在按需节点并不提供原生支持的一些平台(例如MacOS等)上运行作业。

\\

就此次发布,InfoQ采访了Shippable的CEO Avi Cavale

\\

InfoQ: 工程师需要部署到ARM时,除了Ubuntu、MacOS和Windows之外,还可以使用什么操作系统?

\\
AVi Cavale:工程师可以使用Ubuntu的一些变种,或是Linux、Android等操作系统的一些变种。因此,可在ARM上运行多种操作系统,其中包括一些专为ARM编写的操作系统。ARM是移动计算的标准选择。此外,对于那些需要考虑能耗和芯片大小情况,例如物联网,同样如此。
\\

InfoQ:Shippable解决方案可执行哪些测试?它是否使用了其它一些工具?

\\
Cavale:Shippable可用于自动化软件交付的各个方面,包括各种类型的测试(单元测试、功能测试、性能测试等)、多阶段部署(Dev、测试、预上线、生产环境等)以及IT运维(架构开通、安全补丁等)。使用Shippable,用户可以为这些活动创建事件驱动的工作流,实现持续交付,并且对每个活动,可以使用Shippable的原生功能,也支持使用一些用户用得顺手的工具。
\\

InfoQ:Shippable是如何与Jira集成的?

\\
Cavale:用户可以在Shippable的界面中打开或更新Jira问题(issue)、报告软件缺陷,或是对更新做里程碑。
\\

InfoQ: Packet的ARM解决方法是如何与Kubernetes及容器技术一并工作的?

\\
Cavale:用户可使用Shippable将容器部署到Kubernetes,而Kubernetes是运行在Packet云提供的ARM设备上的。
\\

InfoQ: 对终端用户,解决方案的收费是怎样的?

\\
Cavale:Shippable是一种免费增值服务(freemium service)。用户开始使用时,需要在www.shippable.com注册,这时做单个并行构建是免费的。如果用户考虑采用并行构建,就需要考虑收费计划。Shippable对每个并行构建的收费为每月25美元。针对ARM服务,我们提供了一个设备共享池。开源项目可免费运行构建,而商业项目的收费是每个节点每月25美元。Shippable也提供本地部署服务器,收费的起点是每个用户每月20美元。
\\

InfoQ:ARM具有什么独到之处?用户何时会考虑选用ARM?

\\
Cavale:ARM的优点在于节能和芯片尺寸小,因此它是那些由电池供电设备的首选,也是嵌入系统和系统芯片(SoC,system-on-a-chip)的首选。ARM生态系统目前在多个市场中得到了迅速的发展,包括移动、数据中心、物联网、人工智能、汽车、健康、智能家居和可穿戴设备等。
\\

InfoQ:Shippable是否已与DevOps工具链中的其它工具集成?如果是这样,能介绍一下有哪些工具吗?

\\
Cavale:好的。Shippable已经与DevOps工具链中80多种广为使用的工具集成。其中耳熟能详的包括:Docker、Kubernetes、Ansible、Terraform、Packer、Helm和Capistrano等工具,Sauce Labs和Nouvola等测试平台,所有的测试框架,GCP、AWS和Azure等所有主要的云服务提供商,所有基于Git的源码控制提供商、一些软件工件(artefact)库等。我们也实现了与Jenkins的集成,适用于那些希望继续使用Jenkins实现持续集成但考虑使用更为现代的持续交付平台的用户。
\\

查看英文原文: Shippable and Packet Collaborate on Native Arm CI/CD

<think>好的,我现在需要解释这段代码: #if defined ( __CC_ARM ) #pragma anon_unions #endif 用户可能不太了解ARM编译器匿名联合,所以得一步步拆解。首先,这段代码是C/C++预处理指令,包含条件编译编译器特定的杂注。 首先,分析#if defined (__CC_ARM)。这里检查是否定义了__CC_ARM宏,这个宏通常由ARM的编译器(比如Keil MDK-ARM)定义,用来识别编译器。所以这部分的作用是判断当前是否在使用ARM的编译器。 接下来是#pragma anon_unions。#pragma指令用于向编译器传递特定指示,不同编译器支持的杂注不同。anon_unions这个杂注应该是允许匿名联合的使用。匿名联合在C11C++中是被允许的,但有些旧的C标准可能需要这个杂注来启用支持。 然后,整个代码块的作用就是:当使用ARM编译器时,启用匿名联合的支持。这可能在旧版本的编译器或特定配置下需要,因为编译器默认可能不开启这个功能。 用户可能想知道这个代码的实际应用场景。比如在嵌入式开发中,特别是使用ARM架构的微控制器时,处理硬件寄存器或协议结构时常用匿名联合来访问不同数据类型的同一内存位置。这时候需要编译器支持,而某些情况下必须通过杂注来启用。 还要注意,在C11标准之后,匿名联合是标准的一部分,所以如果编译器支持C11或更高,可能不需要这个杂注。但老版本或严格模式下可能需要。另外,C++中匿名联合本来就是允许的,所以这个杂注可能在C++项目中影响不大,但在C项目中比较关键。 需要确认用户是否了解匿名联合的概念,可能需要简单解释一下。比如,匿名联合是没有名称的联合体,可以直接访问其成员,而无需通过联合体实例的名称。例如: typedef union { int i; float f; } Data; Data d; d.i = 10; 而匿名联合的话,可能直接嵌入在结构体中,比如: struct S { int type; union { int i; float f; }; // 匿名联合 }; 这样访问时可以直接用s.i而不是s.union_name.i。 总结这段代码的作用使用场景,确保用户理解条件编译杂注的作用,以及匿名联合的必要性。同时提醒用户注意编译器的版本标准设置,可能影响是否需要这段代码。</think>这段代码属于 **C/C++预处理指令**,主要用于在特定编译器环境下启用对**匿名联合(anonymous unions)**的支持。下面分步解释其作用: --- ### 1. 条件编译指令 `#if defined (__CC_ARM)` - **作用**:检查是否使用了 **ARM编译器**(如 Keil MDK-ARM)。`__CC_ARM` 是 ARM 编译器预定义的宏,用于标识当前编译环境。 - **意义**:这段代码仅在 ARM 编译器下生效,其他编译器(如 GCC、Clang)会忽略它。 --- ### 2. 编译器杂注 `#pragma anon_unions` - **作用**:启用对**匿名联合**的支持。 - **匿名联合**:允许直接访问联合体成员,无需通过联合体变量名。例如: ```c struct Example { int type; union { int i; float f; }; // 匿名联合,可直接访问 i 或 f }; ``` - **必要性**:在 C11 标准前,匿名联合是**非标准特性**,需通过编译器扩展支持。ARM 编译器需此杂注才能启用该特性。 --- ### 3. 整体代码逻辑 ```c #if defined (__CC_ARM) // 如果是 ARM 编译器 #pragma anon_unions // 启用匿名联合 #endif ``` - **翻译**:若使用 ARM 编译器,则允许代码中使用匿名联合;否则忽略此指令。 --- ### 4. 典型应用场景 - **嵌入式开发**:常见于 ARM 架构的固件代码,尤其是需要**内存对齐**或**硬件寄存器映射**的场景。 - **协议解析**:通过匿名联合直接访问同一内存区域的不同数据类型。 - **示例**: ```c typedef struct { uint32_t header; union { uint8_t data_bytes[4]; uint32_t data_word; }; // 匿名联合,可直接用 data_bytes 或 data_word } Packet; ``` --- ### 5. 注意事项 - **C11 标准**:C11 及更高版本已标准化匿名联合,无需杂注。此代码适用于**旧版本编译器**或**严格模式**。 - **C++**:C++ 原生支持匿名联合,无需此杂注。 - **可移植性**:此代码依赖 ARM 编译器,移植到其他平台需调整。 希望这个解释能帮助你理解代码的作用!如果有更多问题,欢迎继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值