Golang CircleCI 2.0测试失败,信号为:终止

Golang CircleCI 2.0测试失败,信号为:终止,go,circleci-2.0,Go,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 我使用了以下配置

我正在迁移到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


想知道为什么会发生此问题以及此问题的永久解决方案这里有两条线索表明您消耗了太多内存,并且操作系统正在强制杀死您的“流氓”进程。它们是:

杀死

无法分配内存

您可以通过在失败的构建结束时获取SSH会话,并使用
dmesg
检查终止历史来确认这一点。如果它给你一条消息,那么你达到了一个严重的内存限制,操作系统被迫从内存中删除一个进程

你有几个选择。我把它们按顺序放在这里,我建议您选择:

  • 通过更改Go程序来减少内存消耗
  • 请CircleCI为您设置一个更大的Docker容器(这将是一个收费选项)。默认是4G,我相信8G和16G都是可用的
  • 交换给机器执行人(目前免费,可随时更改)。这将为您提供8G RAM,但您将失去Docker方法的一些灵活性(例如,您必须使用几个预设的基本图像之一)

    • 在这种情况下,对我有效的方法是
      go-test-p1
      告诉go一次只运行一个编译


      如果没有该Go,将运行您拥有的CPU数量,CircleCI上默认为两个。

      dmesg
      不适用于CircleCI中的docker映像。除非你找到办法让它工作?…@Sardathrion:谢谢你的留言。你说得很对,我刚才在阿尔卑斯山的一个集装箱里试过了
      dmesg
      。如果某个容器中的某个进程的内存超过了容器的内存限制,那么该容器中的某个进程将被
      kill
      ed(由主机或Docker)删除,这样的想法是对的吗?我想不起我使用的与此答案相关的信息,但任何CI环境都会以某种方式遇到此问题,不管它们是否已停靠码头。我希望“killed”操作系统消息应该可以从某个地方获得-这可能在主机上运行,并且仍然可以合理地详细说明容器中被杀死的内容吗?(考虑到这一点,我认为容器级进程应该可以由主机单独杀死,因为“容器不存在”-它们只是由共享同一cgroup的多个进程建立的幻觉。但我很想听听你的想法)。根据我的一点不完美的经验,使用一些
      sleep
      语句有时会让构建通过。我可以在一个玩具虚拟机上构建代码(使用相同的命令),其容量比“正常”小得多,因此我认为添加
      sleep
      会有所帮助。然而,这创造了一个可怕的海森堡,这是不值得的。我现在正在为CircleCI付费,并转移到“xlarge”机器,问题已经消失了。