如何从CircleCI将IoT固件制品上传至AWS S3存储桶?
实现CircleCI构建产物上传到AWS S3的修改方案
准备工作
- 在CircleCI项目的「环境变量」中添加以下变量:
AWS_ACCESS_KEY_ID:拥有S3写入权限的AWS用户访问密钥IDAWS_SECRET_ACCESS_KEY:对应密钥的密码S3_BUCKET:目标S3存储桶名称(例如my-iot-firmwares)
- 确保AWS用户权限配置包含目标S3桶的
PutObject操作权限
修改后的完整CircleCI配置
version: 2.1 orbs: python: circleci/python@1.4.0 aws-s3: circleci/aws-s3@3.1.1 # 引入官方AWS S3 orb,简化上传操作 jobs: build: executor: python/default steps: - checkout # 拉取源码到工作目录 - run: name: Install PlatformIO command: pip install --upgrade platformio - run: name: Compile Project command: pio run - run: name: 确认固件文件存在 command: | FIRMWARE_PATH="./.pio/build/esp32dev/firmware.bin" if [ ! -f "$FIRMWARE_PATH" ]; then echo "错误:固件文件 $FIRMWARE_PATH 不存在" exit 1 fi echo "固件文件路径:$FIRMWARE_PATH" - aws-s3/cp: # 使用orb命令上传单个文件到S3 from: ./.pio/build/esp32dev/firmware.bin to: "s3://${S3_BUCKET}/firmwares/esp32dev-$(git rev-parse --short HEAD).bin" # 用Git短哈希命名,避免版本覆盖 arguments: | --acl public-read # 可选:如需公开访问则保留,否则删除此参数 - store_artifacts: # 保留CircleCI内置制品存储,方便控制台直接下载 path: ./.pio/build/esp32dev/firmware.bin destination: esp32dev-firmware.bin workflows: main: jobs: - build
关键修改说明
- 引入AWS S3官方Orb:
circleci/aws-s3@3.1.1封装了AWS CLI的上传逻辑,无需手动安装配置AWS CLI - 替换Dummy制品步骤:移除生成假文件的操作,新增固件文件存在性校验,避免上传空文件或错误路径
- S3上传逻辑:
- 使用
aws-s3/cp上传单个固件文件,通过Git短哈希作为文件名后缀,确保每个构建版本的文件唯一 - 可选的
--acl public-read参数用于设置文件公开访问权限,根据实际需求选择保留或删除
- 使用
- 保留CircleCI制品存储:同时将固件文件存入CircleCI自带的制品库,方便构建失败排查或快速下载测试
内容的提问来源于stack exchange,提问作者enomis
相关产品推荐
相关产品推荐

