为了账号安全,请及时绑定邮箱和手机立即绑定

Golang CircleCI 2.0 测试失败并发出信号:被杀死

Golang CircleCI 2.0 测试失败并发出信号:被杀死

Go
30秒到达战场 2023-03-29 15:40:17
我正在迁移到 circleci2.0 并且在成功构建后执行测试时它们随机失败并显示以下错误消息/usr/local/go/pkg/tool/linux_amd64/link: signal: killed/usr/local/go/pkg/tool/linux_amd64/link: flushing $WORK/b462/payment_step_svc.test: write $WORK/b462/svc.test: cannot allocate memory我使用了以下配置jobs:  build:    docker:      - image: circleci/golang:latest      - image: rabbitmq:3.5.4      - image: redis    working_directory: /go/src/github.com/soniabhishek/taskrunner    environment:      GOOS: linux      GOARCH: amd64      GOPATH: /go    steps:      - checkout      - run:          name: Get dependencies          command: go get -t -d -v ./...      - run:          name: Build all          command: go build ./...      - run:          name: Test all          command: go test -v ./...除了最新版本(1.10.3)之外,我已经尝试过许多 golang 版本。虽然我找到了破解方法,但我不确定为什么会这样,当我使用CGO_ENABLED=0时,我的所有测试都会运行想知道为什么会出现此问题以及此问题的永久解决方案
查看完整描述

2 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

这里有两条线索表明您消耗了太多内存,并且操作系统正在强行杀死您的“流氓”进程。他们是:

被杀

无法分配内存

您可以通过在构建失败结束时获取 SSH 会话并使用dmesg. 如果它给你一个“牺牲孩子”的消息,那么你就达到了内存限制,以至于操作系统被迫从内存中删除一个进程。

您有多种选择。我按照建议您喜欢它们的顺序将它们放在这里:

  • 通过更改 Go 程序来减少内存消耗

  • 请 CircleCI 为您设置一个更大的 Docker 容器(这将是一个收费选项)。默认是4G,相信8G和16G都可以

  • 交换到机器执行器(目前免费,可能会发生变化)。这为您提供了 8G 的 RAM,但是您失去了 Docker 方法的一些灵活性(例如,您必须使用几个预设基础映像之一)。


查看完整回答
反对 回复 2023-03-29
?
心有法竹

TA贡献1866条经验 获得超5个赞

在这种情况下对我有用的是go test -p 1告诉 Go 一次只运行一个编译。

如果没有它,Go 将运行你拥有的 CPU 数量,在 CircleCI 上默认是两个。


查看完整回答
反对 回复 2023-03-29
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信