配置GHA缓存Go依赖后构建失败,如何排查解决?
问题原因及解决方案
你的构建失败核心原因是步骤顺序错误:actions/cache 缓存步骤放在了 actions/setup-go 之前,导致缓存路径与Go环境不匹配,同时Go版本也未被正确应用到构建流程中。
具体分析:
- Go环境未初始化就执行缓存:
actions/setup-go负责安装指定版本的Go(你的配置是1.20)并设置GOPATH等核心环境变量。但你先执行了缓存步骤,此时系统默认的旧版Go(1.2.2)仍在环境中,缓存路径(~/go/pkg/mod)基于旧环境生成,后续setup-go切换到1.20后,依赖无法被正确读取。 - GOPATH未正确传递:错误信息中显示
($GOPATH not set),是因为缓存步骤执行时GOPATH还未被setup-go初始化,导致后续构建无法找到依赖存储的正确路径。
修改后的工作流配置:
name: Go on: push: branches: [ "master" ] pull_request: branches: [ "master" ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 # 先初始化Go环境,确保GOPATH等变量正确设置 - name: Set up Go uses: actions/setup-go@v3 with: go-version: 1.20 # 基于已初始化的Go环境配置缓存 - uses: actions/cache@v3 with: path: | ~/.cache/go-build ${{ env.GOPATH }}/pkg/mod # 使用环境变量而非硬编码路径,兼容性更强 key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- # 显式下载依赖,确保缓存未命中时也能正确获取包 - name: Download dependencies run: go mod download - name: Build run: go build -v ./...
关键调整点:
- 调换
setup-go与cache的顺序:先让Go环境就绪,再基于该环境配置缓存,确保缓存路径与当前Go版本的依赖目录完全匹配。 - 使用
${{ env.GOPATH }}替代硬编码的~/go/pkg/mod:避免因环境差异导致路径不匹配的问题。 - 添加
go mod download步骤:显式触发依赖下载,即使缓存未命中,也能保证构建所需的包被正确拉取。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

