【发布时间】: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