Extending Jenkins with a Shared Library
References:
- https://jenkins.io/doc/book/pipeline/shared-libraries/
- https://jenkins.io/blog/2017/10/02/pipeline-templates-with-shared-libraries/
Accessing shared libaries from within your Jenkinsfile.
Two Optios:
1.)
You can add the shared library into the configuration for Jenkins.
This can be found in Manage Jenkins->Configure System->Global Pipeline Libraries:
From there you will want to setup up the library to use git and point it at this repository:
Then use the library in your Jenkinsfile.
Example:
@Library('devops-library') _
stage('testing lib') {
def TIMESTAMP = getTimeStamp();
echo "${TIMESTAMP}"
}
2.)
Define the library location at the top of the Jenkisfile. This does not require any global Jenkins configurartion changes.
Example:
library identifier: 'devops-library@master', retriever: modernSCM(
[$class: 'GitSCMSource',
remote: 'https://github.com/BCDevOps/jenkins-pipeline-shared-lib.git'])
stage('testing lib') {
def TIMESTAMP = getTimeStamp();
echo "${TIMESTAMP}"
}
Once you have your shared library setup, you can now use the utilities within your Jenkinsfile
like so:
// @Library('devops-library') _
library identifier: 'devops-library@master', retriever: modernSCM(
[$class: 'GitSCMSource',
remote: 'https://github.com/BCDevOps/jenkins-pipeline-shared-lib.git'])
def hasRepoChanged = false;
node{
def lastCommit = getLastCommit() // <------------------- getLastCommit utility from vars/
if(lastCommit != null){
if(env.CHANGE_AUTHOR_DISPLAY_NAME == null){
env.CHANGE_AUTHOR_DISPLAY_NAME = lastCommit.author.fullName
}
if(env.CHANGE_TITLE == null){
env.CHANGE_TITLE = lastCommit.msg
}
hasRepoChanged = true;
}else{
hasRepoChanged = false;
}
}
if(hasRepoChanged){
stage('Build ' + APP_NAME) {
node{
try{
echo "Building: " + ARTIFACT_BUILD
openshiftBuild bldCfg: ARTIFACT_BUILD, showBuildLogs: 'true'
echo "Assembling Runtime: " + RUNTIME_BUILD
openshiftBuild bldCfg: RUNTIME_BUILD, showBuildLogs: 'true'
}catch(error){
slackNotify( // <------------------- slackNotify utility from shared lib vars/ folder
'Build Broken 🤕',
"The latest ${APP_NAME} build seems to have broken\n'${error.message}'",
'danger',
env.SLACK_HOOK,
SLACK_DEV_CHANNEL,
[
[
type: "button",
text: "View Build Logs",
style:"danger",
url: "${currentBuild.absoluteUrl}/console"
]
])
throw error
}
}
}
}
The utility functions that are available to be called like global helpers can be found in the vars/ folder. We currently have:
- getChangeString
- Generates a string representation of a changeset
- getLastCommit
- Get's the last commit from the changeset, returns null if the build is a repeat
- hasDirectoryChanged
- Will return
true
orfalse
whether or not a particular directory has been modified in the current changeset. Useful if multiple builds are triggered from a single repo
- Will return
- slackNotify
- Sends a notification to slack via Incoming Webhook
-
Note: The webhook URL should be placed into an environment variable and not in your repositories code base as it should be kept secret
(root)
+- src # Groovy source files
| +- org
| +- foo
| +- Bar.groovy # for org.foo.Bar class
+- vars
| +- foo.groovy # for global 'foo' variable / custom step
| +- foo.txt # help for 'foo' variable
The src directory looks like a standard Java source directory structure. This directory is added to the classpath when executing Pipelines.
The vars directory hosts scripts that define global variables accessible from Pipeline. The basename of each *.groovy file should be a Groovy (~ Java) identifier, conventionally camelCased. The matching *.txt, if present, can contain documentation, processed through the system’s configured markup formatter (so may really be HTML, Markdown, etc., though the txt extension is required).
The Groovy source files in these directories get the same “CPS transformation” as in Scripted Pipeline.
Pipeline Steps https://jenkins.io/doc/pipeline/steps/