如何通过GitLab Pipeline构建Windows平台Go可执行文件?
嘿,你遇到的这个需求其实有两个非常实用的解决方向——要么用你现有的Linux镜像做交叉编译(这应该是最快最省心的方案),要么找合适的Windows Go镜像来构建。我给你详细拆解一下:
方案一:用现有Linux镜像交叉编译Windows可执行文件
Go本身天生支持跨平台交叉编译,完全不需要切换到Windows环境,这也是Go的一大优势。你只需要在构建阶段设置几个环境变量,就能直接生成Windows下的.exe文件。
修改后的.gitlab-ci.yml配置如下:
stages: - test - build - art image: golang:1.9.2 variables: BIN_NAME: example ARTIFACTS_DIR: artifacts GO_PROJECT: example GOPATH: /go # 新增Windows目标平台的环境变量 GOOS: windows GOARCH: amd64 # 要是需要32位Windows,改成386就行 before_script: - mkdir -p ${GOPATH}/src/${GO_PROJECT} - mkdir -p ${CI_PROJECT_DIR}/${ARTIFACTS_DIR} - go get -u github.com/golang/dep/cmd/dep - cp -r ${CI_PROJECT_DIR}/* ${GOPATH}/src/${GO_PROJECT}/ - cd ${GOPATH}/src/${GO_PROJECT} test: stage: test script: # 测试环节还是在Linux环境正常跑,完全不受影响 go test -run '' build: stage: build script: # 交叉编译生成Windows可执行文件,记得加.exe后缀 - go build -o hello.exe - pwd - ls -l hello.exe # 注意:Linux环境没法直接运行Windows的.exe,所以删掉原来的执行步骤 # 要是想验证编译结果,可以加个file命令检查文件类型:file hello.exe # 把产物移到指定目录,方便GitLab上传artifacts - mv ./hello.exe ${CI_PROJECT_DIR}/${ARTIFACTS_DIR}/ artifacts: paths: - ${ARTIFACTS_DIR}/hello.exe # 可选:设置产物过期时间,避免占用过多存储资源 expire_in: 7 days
关键说明:
- 只需要设置
GOOS=windows(指定目标操作系统)和GOARCH=amd64(指定CPU架构),Go就会自动生成对应平台的可执行文件 - 不用更换现有镜像,你的Linux Runner可以直接跑这个配置,节省环境切换的成本
- 产物会以
.exe格式存储,后续定时脚本直接下载这个文件就能在Windows上运行
方案二:使用Windows镜像构建(适合依赖Windows特定工具的场景)
如果你确实需要在Windows原生环境下构建(比如项目依赖Windows专属的库或工具链),可以用官方的Windows Go镜像,但有个前提:你的GitLab Runner必须是Windows环境(Linux Runner没法运行Windows Docker镜像)。
推荐的镜像:
golang:1.9.2-windowsservercore:对应你用的Go 1.9.2版本,基于Windows Server Core,工具链完整golang:1.9.2-nanoserver:更轻量的镜像,但可能缺少一些系统工具
修改后的配置示例:
stages: - test - build - art # 切换到Windows Go镜像 image: golang:1.9.2-windowsservercore variables: BIN_NAME: example ARTIFACTS_DIR: artifacts GO_PROJECT: example GOPATH: C:\go before_script: # Windows下要用PowerShell语法,路径分隔符是\ - New-Item -ItemType Directory -Path "${GOPATH}\src\${GO_PROJECT}" -Force - New-Item -ItemType Directory -Path "${CI_PROJECT_DIR}\${ARTIFACTS_DIR}" -Force - go get -u github.com/golang/dep/cmd/dep - Copy-Item -Path "${CI_PROJECT_DIR}\*" -Destination "${GOPATH}\src\${GO_PROJECT}" -Recurse - Set-Location "${GOPATH}\src\${GO_PROJECT}" test: stage: test script: go test -run '' build: stage: build script: # Windows下编译默认生成.exe文件 - go build -o hello.exe - pwd - Get-ChildItem hello.exe # 可以直接在Windows环境运行测试 - .\hello.exe # 移动到产物目录 - Move-Item -Path .\hello.exe -Destination "${CI_PROJECT_DIR}\${ARTIFACTS_DIR}\" artifacts: paths: - ${ARTIFACTS_DIR}/hello.exe expire_in: 7 days
关键说明:
- 必须使用Windows环境的GitLab Runner,要么配置Docker executor,要么用Shell executor直接在Windows机器上运行
- 命令语法要换成PowerShell(GitLab Windows Runner默认用PowerShell),路径分隔符从
/改成\
后续产物下载与运行建议
- 定时脚本下载产物:GitLab提供了API可以直接下载artifacts,你可以写个简单的脚本用curl调用,比如:
curl --header "PRIVATE-TOKEN: 你的GitLab私有令牌" "https://你的GitLab地址/api/v4/projects/项目ID/jobs/构建任务ID/artifacts" -o artifacts.zip - 关于Windows服务器运行Go二进制:如果是交叉编译出来的
.exe,直接在Windows服务器上运行就行,完全不需要Linux虚拟机;要是你确实需要跑Linux版本的二进制,推荐用WSL2(Windows子系统Linux),比虚拟机轻量得多,性能也更好。
内容的提问来源于stack exchange,提问作者user3755946
相关产品推荐
相关产品推荐

