GOPATH в декларативном Jenkinsfile

Я настраиваю многоотраслевой конвейер Jenkins для нашего моно репо Go на работе. Как мне установить GOPATH Значит, инструмент go может найти, где Дженкинс взял репо?

Я пытался установить его с environment синтаксис, вот так:

pipeline {
    agent {
        docker {
            image 'golang:1.9.2'
        }
    }

    triggers {
        gitlab(triggerOnPush: true, triggerOnMergeRequest: true, branchFilterType: 'All')
    }

    post {
        failure {
            updateGitlabCommitStatus name: 'jenkins-build', state: 'failed'
        }
        success {
            updateGitlabCommitStatus name: 'jenkins-build', state: 'success'
        }
    }

    environment {
        GOPATH = "${pwd}"
    }

    stages {
        stage('Build') {
            steps {
                updateGitlabCommitStatus name: 'jenkins-build', state: 'pending'
                echo 'Linting...'
                sh 'go version'
                sh 'go get -u -v github.com/golang/lint/golint'
                sh 'golint -set_exit_status ./...'
                echo 'Building...'
                sh '''
                cd my_app
                go build
                '''
            }
        }
    }
}

golint Команда работает нормально, так как она находится в нужном каталоге, но команда go build не может найти другие зависимости внутри корневого каталога. Например работает go build в my_repo/my_app он не найдет никаких зависимостей в my_repo, сказать my_repo/my_dep,

Я тоже пробовал настройку GOPATH на этапе сборки:

stage('Build') {
            steps {
                updateGitlabCommitStatus name: 'jenkins-build', state: 'pending'
                echo 'Building...'
                sh '''
                GOPATH=$(pwd)
                cd fpweb
                go build
                '''
            }
        }

Но то же самое происходит.

my_app.go:19:2: cannot find package "my_repo/my_db" in any of:
    /usr/local/go/src/my_repo/my_db (from $GOROOT)
    /data/jenkins_slave/workspace/my_repo-pipeline_master-JHGTBESY3LSHGFEUYYM2777JIAFVR4R7E4Y2YPZA2MI4XW6BBTQQ/src/my_repo/my_db (from $GOPATH)

РЕДАКТИРОВАТЬ: Что я должен установить мой GOPATH к?

ОБНОВЛЕНИЕ: когда я установил GOPATH к WORKSPACE:

environment {
        GOPATH = "$WORKSPACE"
    }

Я получаю ошибку:

[my_repo-pipeline_master-JHGTBESY3LSHGFEUYYM2777JIAFVR4R7E4Y2YPZA2MI4XW6BBTQQ] Running shell script
+ pwd
+ // GOPATH=/data/jenkins_slave/workspace/my_repo-pipeline_master-JHGTBESY3LSHGFEUYYM2777JIAFVR4R7E4Y2YPZA2MI4XW6BBTQQ
/data/jenkins_slave/workspace/my_repo-pipeline_master-JHGTBESY3LSHGFEUYYM2777JIAFVR4R7E4Y2YPZA2MI4XW6BBTQQ@tmp/durable-18853a9e/script.sh: 3: /data/jenkins_slave/workspace/my_repo-pipeline_master-JHGTBESY3LSHGFEUYYM2777JIAFVR4R7E4Y2YPZA2MI4XW6BBTQQ@tmp/durable-18853a9e/script.sh: //: Permission denied

1 ответ

Решение

Вы должны сделать $GOPATH/src/my_repo/my_db существовать. Значение $GOPATH не очень важно для Go. $GOPATH/src/my_repo/my_db может быть символической ссылкой. Мы создаем эту символическую ссылку как часть тестового скрипта в нашей системе CI.

Я не очень знаком с Дженкинсом, но я собираюсь предположить, что $WORKSPACE - это место, где код извлекается (например, существует $WORKSPACE/.git). В этом случае посмотрите, можете ли вы выполнить следующий скрипт перед выполнением любой команды go:

mkdir -p $GOPATH/src/my_repo
ln -s $WORKSPACE $GOPATH/src/my_repo/my_db

Опять же, важно то, что $GOPATH/src/my_repo/my_db существует. Как вы сделаете это, зависит от вас.

Другие вопросы по тегам