【问题标题】:CircleCI vs Bitbucket Go Build IssueCircleCI vs Bitbucket Go 构建问题
【发布时间】:2019-08-13 11:40:47
【问题描述】:

我在两个单独的 CI 工具上对 golang:1.11-alpine 运行 go build 命令。可以看到命令一模一样,docker镜像也一模一样。

由于某种原因,当我在 alpine:3.9 docker 映像上运行编译后的可执行文件时,只有 bitbucket 运行。

对于 Circle CI 构建,我收到以下错误:

standard_init_linux.go:207: exec 用户进程导致“exec 格式错误”

我在网上读到这可能是一个架构问题,所以我在终端中做了一个file <file>,看起来两者的编译方式相同。这是我收到的两个文件的响应(相同):

云:ELF 64 位 LSB 可执行文件,x86-64,版本 1 (SYSV),动态链接,解释器 /lib/ld-musl-x86_64.so.1,剥离

圈子CI

docker:
  - image: golang:1.11-alpine

steps:
  - checkout
  - run:
      name: Build Go Server
      command: |
        apk add --no-cache git build-base
        export GOPATH="$HOME/go"
        export PATH="$PATH:$GOPATH/bin"
        go get -u github.com/golang/lint/golint@v0.0.0-20190227174305-8f45f776aaf1
        go mod vendor
        golint -set_exit_status $(go list ./... | grep -v /vendor/)
        go test -short $(go list ./... | grep -v /vendor/)
        go build -ldflags="-s -w"

Bitbucket CI

steps:
    - step: &step-test-and-build-go
            name: Test and Build Go Server
            image: golang:1.11-alpine
            script:
                - apk add --no-cache git build-base
                - export GOPATH="$HOME/go"
                - export PATH="$PATH:$GOPATH/bin"
                - go get -u github.com/golang/lint/golint@v0.0.0-20190227174305-8f45f776aaf1
                - go mod vendor
                - golint -set_exit_status $(go list ./... | grep -v /vendor/)
                - go test -short $(go list ./... | grep -v /vendor/)
                - go build -ldflags="-s -w"

圈子CIgo env

GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/root/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/root/project/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build122963699=/tmp/go-build -gno-record-gcc-switches"

Bitbucket CI go env

GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/root/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/opt/atlassian/pipelines/agent/build/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build179086021=/tmp/go-build -gno-record-gcc-switches"

我已经交叉发布了这个问题to the CircleCI forum

【问题讨论】:

  • go env 在每个平台上显示什么?
  • @Peter 我已经更新了我的问题以显示这一点。除了-fdebug-prefix-map之外,它们似乎几乎相同
  • 可能与alpine使用musl的事实有关?
  • @Zyl 也许,但奇怪的是为什么我在不同 CI 的同一个高山图像上得到不同的结果。
  • 是否有任何平台/环境可以运行由 Circle CI 构建生成的二进制文件,并且来自 Bitbucket 的二进制文件是否也可以在那里运行?我知道这是在黑暗中敲击,但也许这是一个开始。

标签: go circleci alpine bitbucket-cli


【解决方案1】:

这个issue 可能是相关的。

在 alpine 上设置 CGO_ENABLED=0 可能会解决它,除非您的构建需要它。要添加的行可能如下所示: export CGO_ENABLED=0

【讨论】:

  • 不幸的是,我不认为这是问题所在,因为两者都已经启用并且一个可以工作。
  • 澄清一下,禁用意味着将 CGO_ENABLED 设置为 0。要启用,值必须为 1,这是通常的默认值。 Go release 发挥作用,安装可以定制。这就是为什么在 CircleCI 中强制 0 可以解决它。
【解决方案2】:

GOMOD="/root/project/go.mod"

好吧,考虑到这两种环境之间只有一个区别,我会说你的 GOMOD 值是罪魁祸首。

Bitbucket CI 去环境 GOMOD="/opt/atlassian/pipelines/agent/build/go.mod"

顺便说一句,还要检查你的 go 版本,如果我没记错我的 gopher 琐事,模块在 golang 1.6 之前没有运行。

【讨论】:

  • GOMOD不是从环境中读取的(所以设置它没有效果),它是go env提供的附加信息,它是主模块的go.mod的绝对路径。
猜你喜欢
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多