Несовместимость типа с папкой поставщика

#go #jenkins #dependency-management #vendor

#Вперед #дженкинс #управление зависимостями #поставщик

Вопрос:

Я развертываю приложение Go через Jenkins и запускаю некоторые тесты.

Все мои тесты проходят локально, даже если я удаляю все сторонние библиотеки из моего GOPATH, потому что я заполнил свою vendor папку через godep save .

Однако, когда Дженкинс запускает мои тесты, он сообщает о несовместимости типов между версией GitHub и версией поставщика:

 mypackage/MyFile_test.go:65:22: cannot use MY_VARIABLE
(type "github.com/gocql/gocql".UUID) as type 
"myproject/vendor/github.com/gocql/gocql".UUID in assignment
  

Я пытался использовать Dep (официальный менеджер поставщика команды Go) вместо godep , но это не решило проблему.

Нужно ли указывать моим тестам использовать «myproject / vendor / github.com /gocql / gocql» вместо «github.com/gocql/gocql «? (ОБНОВЛЕНИЕ: По-видимому, это незаконно и выдаст ошибку must be imported as github.com/gocql/gocql .)

Как мне это решить?

Обновления:

  • Я использую Go 1.12.1 как на своем локальном компьютере, так и на сервере Jenkins.
  • Я не использую go modules никакого вида.

Вот раздел Go моего кода конвейера Jenkins. Может ли это как-то быть связано с этой проблемой?

 steps {                                           
    // Create our project directory.
    sh 'cd ${GOPATH}/src'
    sh 'mkdir -p ${GOPATH}/src/myproject'

    // Copy all files in our Jenkins workspace to our project directory.                
    sh 'cp -r ${WORKSPACE}/* ${GOPATH}/src/myproject'

    // Copy all files in our "vendor" folder to our "src" folder.
    sh 'cp -r ${WORKSPACE}/vendor/* ${GOPATH}/src'

    // Build the app.
    sh 'go build'               

    // Remove cached test results.
    sh 'go clean -cache'

    // Run Unit Tests.
    sh 'go test ./... -v -short'    
}
  

Комментарии:

1. какую версию go вы используете? Совпадают ли версии в Jenkins и вашем локальном разработчике?

2. @Varcorb Я использую Go 1.12.1 как на моем локальном сервере, так и на сервере Jenkins, но я предполагаю, что это не должно иметь никакого отношения к этой проблеме, потому что это больше похоже на то, что Go обрабатывает vendor библиотеку как отличную от не- vendor библиотеки. Разве Go не должен быть достаточно умен, чтобы знать, что они идентичны, учитывая, что это /vendor/ единственное различие в их названии?

3. @Varcorb Я предполагаю это, потому что Дженкинс будет просматривать vendor папку только в том случае, если не сможет найти стороннюю библиотеку в GOPATH. Это означает, что он должен одинаково относиться к vendor и не- vendor библиотекам, не так ли?

4. Причина, по которой я спросил, заключается в том, что 1.12.1 имеет go modules функцию и, возможно, не ищет GOPATH ? Для GO111MODULE переменной env установлено значение on ?.

5. @Varcorb я не использую go modules , потому что я не думаю, что он еще так широко используется. Некоторые библиотеки сторонних производителей, которые я использую, не полностью совместимы с ним, что должно быть нормально, потому что я не настроил Go в Jenkins для использования go modules .

Ответ №1:

Как и предполагалось, проблема была в моей конфигурации Jenkins (потому что локально все работало нормально).

Оказывается, каждая sh строка представляла новый терминал оболочки, поэтому все, что мне нужно было сделать, это поместить все в один sh раздел вот так:

 steps {
    // Create our expected project directory inside our GOPATH's src folder.
    // Move our project codes (and its vendor folder) to that folder.
    // Build and run tests.
    sh '''                    
        mkdir -p ${GOPATH}/src/myproject
        mv ${WORKSPACE}/* ${GOPATH}/src/myproject
        cd ${GOPATH}/src/myproject
        go build
        go clean -cache
        go test ./... -v -short
       '''
}
  

Большое спасибо всем, кто помог!