3.2 KiB
3.2 KiB
Building Continuous Delivery (CD) Pipelines
Writing and Using a Shared Library
- 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. - Add the file
vars/standard.groovythat defines the declarative pipeline as global variable. Make the Go tool name and golang-ci version configurable with the help of parameters. - Push the changes to the
masterbranch and configure the shared library in Jenkins. - Configure the shared library for consumption in Jenkins with the name
go-pipeline. - Set up a new GitHub repository named
go-project-by-template. Initialize a new Go project by runninggo mod init github.com/bmuschko/hello-worldand adding a simplemain.gofile. - Add a new
Jenkinsfile. Consume the shared library and call the global variable. - 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.
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.

