我使用gitlab-ci来测试,编译和部署一个小的golang应用程序,但问题是这些阶段需要的时间超过了必要的时间,因为它们每次都必须获取所有依赖项。
如何在两个阶段(测试和构建)之间保持golang依赖关系?
这是我当前gitlab-ci配置的一部分:
test:
stage: test
script:
# get dependencies
- go get github.com/foobar/...
- go get github.com/foobar2/...
# ...
- go tool vet -composites=false -shadow=true *.go
- go test -race $(go list ./... | grep -v /vendor/)
compile:
stage: build
script:
# getting the same dependencies again
- go get github.com/foobar/...
- go get github.com/foobar2/...
# ...
- go build -race -ldflags "-extldflags '-static'" -o foobar
artifacts:
paths:
- foobar
答案 0 :(得分:3)
这是一个非常棘手的任务,GitLab does not allow caching outside the project directory。一个快速而肮脏的任务是将$GOPATH
的内容复制到项目内的某个目录下(比如_GO
),将其缓存并在每个阶段将其复制回$GOPATH
:< / p>
after_script:
- cp -R $GOPATH ./_GO || :
before_script:
- cp -R _GO $GOPATH
cache:
untracked: true
key: "$CI_BUILD_REF_NAME"
paths:
- _GO/
警告:这只是一个(相当丑陋)的解决方法,我自己没有测试过。它应该只展示一种可能的解决方案。
答案 1 :(得分:1)
如Yan Foto,you can only use paths that are within the project workspace.所述,但是您可以按照extrawurst blog的建议将$GOPATH
移动到项目内部。
test:
image: golang:1.11
cache:
paths:
- .cache
script:
- mkdir -p .cache
- export GOPATH="$CI_PROJECT_DIR/.cache"
- make test