Building Go app with “vendor” directory on Jenkins with Docker

I’m trying to set up a Jenkins Pipeline to build and deploy my first Go project using a Jenkinsfile and docker.image().inside . I can’t figure out how to get go to pick up the dependencies in the vendor/ directory.

When I run the build, I get a bunch of errors:

  • Browserify/Babelify gulp build malfunction in Docker container - cannot find component module
  • expose heroku $PORT with gulp task
  • What is the easiest method to copy files and directories in dockerfile
  • Docker containers starts at different subtnets
  • ERROR - Docker-compose/docker Windows
  • Django models foreign key not recognizing 'QueryString' BaseObject
  • + goapp test ./...
    src/dao/demo_dao.go:8:2: cannot find package "github.com/dgrijalva/jwt-go" in any of:
        /usr/lib/go_appengine/goroot/src/github.com/dgrijalva/jwt-go (from $GOROOT)
        /usr/lib/go_appengine/gopath/src/github.com/dgrijalva/jwt-go (from $GOPATH)
        /workspace/src/github.com/dgrijalva/jwt-go
    

    …why isn’t it picking up the Vendor directory?

    When I throw in some logging, it seems that after running sh "cd /workspace/src/bitbucket.org/nalbion/go-demo" the next sh command is still in the original ${WORKSPACE} directory. I really like the idea of the Jenkins file, but I can’t find any decent documentation for it.

    (Edit – there is decent documentation here but dir("/workspace/src/bitbucket.org/nalbion/go-demo") {} doesn’t seem to work within docker.image().inside)

    My Docker file resembles:

    FROM golang:1.6.2
    # Google's App Engine Go SDK
    RUN wget https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.40.zip -q -O go_appengine_sdk.zip && \
        unzip -q go_appengine_sdk.zip -d /usr/lib/ && \
        rm go_appengine_sdk.zip
    ENV PATH /usr/lib/go_appengine:/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    ENV GOPATH /usr/lib/go_appengine/gopath
    # Add Jenkins user
    RUN groupadd -g 132 jenkins && useradd -d "/var/jenkins_home" -u 122 -g 132 -m -s /bin/bash jenkins
    

    And my Jenkinsfile:

    node('docker') {
        currentBuild.result = "SUCCESS"
    
        try {
            stage 'Checkout'
            checkout scm
    
            stage 'Build and Test'
            env.WORKSPACE = pwd()
            docker.image('nalbion/go-web-build:latest').inside(
                    "-v ${env.WORKSPACE}:/workspace/src/bitbucket.org/nalbion/go-demo " +
                    "-e GOPATH=/usr/lib/go_appengine/gopath:/workspace") {
    
                // Debugging
                sh 'echo GOPATH: $GOPATH'
                sh "ls -al /workspace/src/bitbucket.org/nalbion/go-demo"
                sh "cd /workspace/src/bitbucket.org/nalbion/go-demo"
                sh "pwd"
    
                sh "go vet ./src/..."
                sh "goapp test ./..."
            }
    
            stage 'Deploy to DEV'
            docker.image('nalbion/go-web-build').inside {
                sh "goapp deploy --application go-demo --version v${v} app.yaml"
            }
    
            timeout(time:5, unit:'DAYS') {
                input message:'Approve deployment?', submitter: 'qa'
            }
    
            stage 'Deploy to PROD'
            docker.image('nalbion/go-web-build').inside {
                sh "goapp deploy --application go-demo --version v${v} app.yaml"
            }
        } catch (err) {
            currentBuild.result = "FAILURE"
            // send notifications
            throw err
        }
    }
    

  • Docker Socket Without TLS
  • Empty response from server running inside Docker container
  • Gitlab CI Runner - change git repo url for docker
  • Running Kubernetes Example on CoreOS, Part 1 not work
  • Automatically create docker container and launch python script
  • Trying to run Cloudera Image in Docker
  • One Solution collect form web for “Building Go app with “vendor” directory on Jenkins with Docker”

    I managed to get it working by including the cd in the same sh statement:

    docker.image('nalbion/go-web-build:latest')
          .inside("-v ${env.WORKSPACE}:/workspace/src/bitbucket.org/nalbion/go-demo " +
                  "-e GOPATH=/usr/lib/go_appengine/gopath:/workspace") {
       sh """
           cd /workspace/src/bitbucket.org/nalbion/go-demo
           go vet ./src/...
           goapp test ./...
          """
    }
    
    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.