You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:37:33