gitlab ci在阶段之间缓存/保留golang包

irg*_*wer 6 gitlab gitlab-ci gitlab-ci-runner

我使用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
Run Code Online (Sandbox Code Playgroud)

voi*_*ski 10

正如Yan Foto所提到的,您只能使用项目工作区中的路径。但是您可以$GOPATH按照extrawurst 博客的建议将 移动到您的项目中。

test:
  image: golang:1.11
  cache:
    paths:
      - .cache
  script:
    - mkdir -p .cache
    - export GOPATH="$CI_PROJECT_DIR/.cache"
    - make test
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!你和 Yan Foto 的回答都是有用的解决方法,我都赞成。你在这里的建议似乎不那么老套,所以我会接受它:) (2认同)

Yan*_*oto 5

这是一个非常棘手的任务,因为GitLab不允许在项目目录外进行缓存。一个快速而又肮脏的任务是将$GOPATH项目内某个目录下的内容(例如_GO)复制,缓存并在每个阶段开始时将其复制回$GOPATH

after_script:
  - cp -R $GOPATH ./_GO || :

before_script:
  - cp -R _GO $GOPATH

cache:
  untracked: true
  key: "$CI_BUILD_REF_NAME"
  paths:
    - _GO/
Run Code Online (Sandbox Code Playgroud)

警告:这只是一个(相当丑陋的)解决方法,我自己尚未对其进行测试。它仅应显示可能的解决方案。