我正在迁移到 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 方法的一些灵活性(例如,您必须使用几个预设基础映像之一)。
心有法竹
TA贡献1866条经验 获得超5个赞
在这种情况下对我有用的是go test -p 1
告诉 Go 一次只运行一个编译。
如果没有它,Go 将运行你拥有的 CPU 数量,在 CircleCI 上默认是两个。
- 2 回答
- 0 关注
- 132 浏览
添加回答
举报
0/150
提交
取消