Files
cje-prep/14-shared-library.md
2019-07-28 11:27:26 +02:00

3.2 KiB

Building Continuous Delivery (CD) Pipelines

Writing and Using a Shared Library

  1. Set up a new GitHub repository named jenkins-standard-go-pipeline. It will define a standard pipeline definition for Go projects implemented as shared library.
  2. Add the file vars/standard.groovy that defines the declarative pipeline as global variable. Make the Go tool name and golang-ci version configurable with the help of parameters.
  3. Push the changes to the master branch and configure the shared library in Jenkins.
  4. Configure the shared library for consumption in Jenkins with the name go-pipeline.
  5. Set up a new GitHub repository named go-project-by-template. Initialize a new Go project by running go mod init github.com/bmuschko/hello-world and adding a simple main.go file.
  6. Add a new Jenkinsfile. Consume the shared library and call the global variable.
  7. Trigger a build and visualize the pipeline in Jenkins.
Show Solution

The directory structure of shared library repository should have the following structure.

.
└── vars
    └── standard.groovy

1 directory, 1 file

Define the pipeline as global variable in the file standard.groovy.

def call(String goToolName = 'go-1.12', String golangCiVersion = 'v1.12.5') {
    pipeline {
        agent any
        tools {
            go "$goToolName"
        }
        environment {
            GO111MODULE = 'on'
        }
        stages {
            stage('Compile') {
                steps {
                    sh 'go build'
                }
            }
            stage('Test') {
                environment {
                    CODECOV_TOKEN = credentials('CODECOV_TOKEN')
                }
                steps {
                    sh 'go test ./... -coverprofile=coverage.txt'
                    sh "curl -s https://codecov.io/bash | bash -s -"
                }
            }
            stage('Code Analysis') {
                steps {
                    sh "curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | bash -s -- -b $GOPATH/bin $golangCiVersion"
                    sh 'golangci-lint run'
                }
            }
            stage('Release') {
                when {
                    buildingTag()
                }
                environment {
                    GITHUB_TOKEN = credentials('GITHUB_TOKEN')
                }
                steps {
                    sh 'curl -sL https://git.io/goreleaser | bash'
                }
            }
        }
    }
}

Configure the shared library under Manage Jenkins > Configure System.

Shared Library Configuration

The directory structure should look as shown below.

.
├── Jenkinsfile
├── go.mod
└── main.go

0 directories, 3 files

The Jenkinsfile uses the shared library and calls the global variable. Optionally, you can configure the pipeline by passing in parameters.

@Library('go-pipeline') _

standard()

The resulting build will go through all the pipeline stages defined in the shared library.

Pipeline View