The repository contains a library of reusable Jenkins Pipeline steps and functions for that are used in Hyperledger Indy projects' CI/CD pipelines.
- merges PR if changes consists only of updates for dependencies versions
- makes sense for PR jobs only
indyAutoMergePR {
node = 'node-label-with-linux-docker'
// default: indyConfig.indyNodeLabel
prDetails = [
owner: 'github-repo-owner',
// default: parsed from env.CHANGE_URL or env.ghprbPullLink
repo: 'github-repo-name',
// default: parsed from env.CHANGE_URL or env.ghprbPullLink
number: 1, // PR number
// default: env.CHANGE_ID or env.ghprbPullId
]
credentialsId = 'GitHub-token-with-PRs-write-permissions'
// default: indyConfig.credentials.gitHubToken
approveMessage = 'comment-in-PR'
// default: 'Approved'
statusState = 'pending|success|error|failure'
// default: 'success'
statusUrl = 'status-url'
// default: env.RUN_DISPLAY_URL
statusDescr = 'status-description'
// default: 'Success: This commit looks good for auto merge'
statusContext = 'status-context'
// default: indyConfig.prStatusContext
}
- wrapper for cleanWS step
- doesn't fail if ws-clenup plugin is not installed
indyCleanWs()
- sets indy pipelines environment
- most of fields could be conigured by environment variables
- returns a Map with the following fields
- rsBasePath: classpath to resources, org/hyperledger/pipeline/indy, non-configurable
- steps: a list of Maps, where key is name of one of indy steps and values are:
- active: is step active of not, depends on env.$stepName (default:
true
) - ref: groovy closure reference to the step, depends on indyStagesInit (default: indy step closure)
- active: is step active of not, depends on env.$stepName (default:
- failFast: turns on/off failFast mode for parallel steps, depends on env.indyFailFast (default:
false
) - dryRun: turns on/off dry run mode, depends on env.indyDryRun (default:
false
) - logLevel: sets logging level, depends on env.indyLogLevel (default:
'DEBUG
') - indyNodeLabel: node label where linux docker container could be run, depends on env.indyNodeLabel (default:
null
) - credentials:
- gitHubToken: GitHub token with rights to add comments and set statuses for PRs and merge them, depends on env.indyGitHubTokenCredId (default:
null
)
- gitHubToken: GitHub token with rights to add comments and set statuses for PRs and merge them, depends on env.indyGitHubTokenCredId (default:
- prStatusContext: PR status set for the PR by indyAutoMergePR, depends on env.indyPRStatusContext (default:
null
)
- check if current commit has been already tested in scope of any PR
- makes sense for branch jobs only
indyIsTested {
node = 'node-label-with-linux-docker'
// default: indyConfig.indyNodeLabel
branch = 'PRs-target-branch-filter'
// default: env.$BRANCH_NAME
contexts = ['PRs-context-filters', ...] //default: ['continuous-integration/jenkins/pr-merge']
age = 5 // filter PRs by number of days from the last update, default: 7
// default: 7
}
- wrapper for node step
- guarantees that indyCleanWs will be called after node is finished
indyJNode(nodeLabel)
- defines a set of log levels and provides API for each
- log levels: TRACE, DEBUG, INFO, WARNING, ERROR
- methods:
- trace(message, prefix=null)
- debug(message, prefix=null)
- info(message, prefix=null)
- warning(message, prefix=null)
- error(message, prefix=null)
- provides API to send notifications
indyNotify.email message
Please check docs for details about message attributes.
Default message:
[
body: '$DEFAULT_CONTENT',
replyTo: '$DEFAULT_REPLYTO',
subject: '$DEFAULT_SUBJECT',
to: '$DEFAULT_RECIPIENTS'
]
indyNotify.slack message
Please check docs for details about message attributes.
- performs packaging calling package builders
- each builder should return volumeOrPath - docker volume name or host system absolute path to the directory where package(s) is(are) placed
indyPackaging {
node = 'node-label-with-linux-docker'
// default: indyConfig.indyNodeLabel
builders = [deb: debBuilderClosure]
// default: not-defined
version = '1.2.3'
// default: not-defined
}
- calls steps in order defined via parameters
- optionally limit execution time
- optionally call failure and/or success closure callbacks
indyPipeline {
:
timeout = 90 // minutes
// default: not defined
onFail = onFailCallback
// default: not defined
onSuccess = onSuccessCallback
// default: not defined
// format = stageName, stageConfigClosure],
// config closures are empty by default
stages = [
['indyVerifyStatic', {}],
['indyVerify', {
...
}],
['indyAutoMergePR', {}],
['indyPackaging', {
version = "1.2.3"
builders.deb = buildDebUbuntu
}]
]
// default: all steps from indyConfig with dummy closures {}
}
- dummy step, just a definition of API
- expected that it is implemented in another shared library
- please, use indyStagesInit to pass the reference to the actual implementation
indyPublish {
packageName = 'myPackage'
// default: not defined
releaseVersion = '1.2.3'
// default: not defined
projectName = 'myProject'
// default: not defined
builders = [deb: debBuilderClosure]
// default: not defined
}
- runs unit/integration tests
indyVerify {
labels = ['linux', 'windows']
// default: not defined
tests = [
common: [
resFile: { "test-result-filename.${NODE_NAME}.xml" },
// default: 'test-result.txt'
testDir: 'indy_common',
// default: '.'
python: 'python-executable-to-use',
// default: 'python'
useRunner: true, // run or not the custom runner for tests
// default: false
docker: 'ubuntu' // reference to item in 'dockers'
// default: not defined
],
// ...
]
// default: not defined
dockers = [
ubuntu: [
imgName: 'ci-image-name',
// default: not defined
dockerfile: "path-to-dockerfile",
// default: not defined
contextDir: "path-to-docker-build-context-dir"
// default: not defined
]
]
// default: not defined
}
- runs flake8 based static code verification
indyVerifyStatic {
node = 'node-label-with-linux-docker'
// default: indyConfig.indyNodeLabel
dockerEnv = [
imgName: 'ci-image-name',
// default: 'code-validation'
dockerfile: "path-to-dockerfile",
// default: 'ci/code-validation.dockerfile'
contextDir: "path-to-docker-build-context-dir"
// default: 'ci'
]
}
- virtual step: could be used by other shared libraries to set (replace) references for standard steps
- should return a Map:
- key - indy step
- value - step closure reference
e.g.
def call() {
return [
indyPublish: myLibraryPublishStep
]
}