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

我正在迁移到 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时,我的所有测试都会运行


想知道为什么会出现此问题以及此问题的永久解决方案


30秒到达战场
浏览 102回答 2
2回答

海绵宝宝撒

这里有两条线索表明您消耗了太多内存,并且操作系统正在强行杀死您的“流氓”进程。他们是:被杀无法分配内存您可以通过在构建失败结束时获取 SSH 会话并使用dmesg. 如果它给你一个“牺牲孩子”的消息,那么你就达到了内存限制,以至于操作系统被迫从内存中删除一个进程。您有多种选择。我按照建议您喜欢它们的顺序将它们放在这里:通过更改 Go 程序来减少内存消耗请 CircleCI 为您设置一个更大的 Docker 容器(这将是一个收费选项)。默认是4G,相信8G和16G都可以交换到机器执行器(目前免费,可能会发生变化)。这为您提供了 8G 的 RAM,但是您失去了 Docker 方法的一些灵活性(例如,您必须使用几个预设基础映像之一)。

心有法竹

在这种情况下对我有用的是go test -p 1告诉 Go 一次只运行一个编译。如果没有它,Go 将运行你拥有的 CPU 数量,在 CircleCI 上默认是两个。
打开App,查看更多内容
随时随地看视频慕课网APP