├── resources └── .gitkeep ├── test ├── java │ └── .gitkeep └── groovy │ ├── HelloPipeline.groovy │ └── SayHelloTest.groovy ├── .travis.yml ├── vars └── sayHello.groovy ├── src ├── io │ └── nextlayer │ │ └── ci │ │ └── UtilExample.groovy └── pipeline.gdsl ├── .gitignore ├── assembly └── assembly.xml ├── README.md └── pom.xml /resources/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/java/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: java 2 | jdk: 3 | - oraclejdk8 4 | script: mvn test -------------------------------------------------------------------------------- /vars/sayHello.groovy: -------------------------------------------------------------------------------- 1 | // vars/sayHello.groovy 2 | 3 | def call(String name = "human") { 4 | echo "Hello, ${name}." 5 | } -------------------------------------------------------------------------------- /src/io/nextlayer/ci/UtilExample.groovy: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env groovy 2 | package io.nextlayer.ci 3 | 4 | class UtilExample { 5 | 6 | String doSomething() { 7 | return "Something done" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # ---> Java 2 | *.class 3 | 4 | # Mobile Tools for Java (J2ME) 5 | .mtj.tmp/ 6 | 7 | # Package Files # 8 | *.jar 9 | *.war 10 | *.ear 11 | 12 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 13 | hs_err_pid* 14 | 15 | .classpath 16 | .project 17 | .settings 18 | target 19 | build 20 | 21 | .gradle 22 | 23 | .idea/ 24 | *.iml 25 | -------------------------------------------------------------------------------- /assembly/assembly.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | artifact 4 | 5 | zip 6 | 7 | / 8 | 9 | 10 | src 11 | lib/src 12 | 13 | 14 | vars 15 | lib/vars 16 | 17 | 18 | resources 19 | lib/resources 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /test/groovy/HelloPipeline.groovy: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env groovy 2 | 3 | import com.lesfurets.jenkins.unit.global.lib.Library 4 | 5 | @Library('nextlayerci-example@master') _ 6 | 7 | import io.nextlayer.ci.UtilExample 8 | 9 | def execute() { 10 | node() { 11 | stage("First") { 12 | echo "Something" 13 | sayHello "Traveller" 14 | } 15 | stage("Middle") { 16 | UtilExample util = new UtilExample() 17 | echo util.doSomething() 18 | } 19 | stage("Last") { 20 | echo "We're done" 21 | } 22 | } 23 | } 24 | 25 | return this -------------------------------------------------------------------------------- /test/groovy/SayHelloTest.groovy: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env groovy 2 | import org.junit.Before 3 | import org.junit.Test 4 | 5 | import java.util.regex.Pattern 6 | 7 | import static com.lesfurets.jenkins.unit.global.lib.LibraryConfiguration.library 8 | import static com.lesfurets.jenkins.unit.global.lib.LocalSource.localSource 9 | 10 | import com.lesfurets.jenkins.unit.BasePipelineTest 11 | 12 | class SayHelloTest extends BasePipelineTest { 13 | 14 | @Override 15 | @Before 16 | void setUp() throws Exception { 17 | 18 | String sharedLibs = this.class.getResource('./').getFile() 19 | 20 | def library = library() 21 | .name('nextlayerci-example') 22 | .allowOverride(false) 23 | .retriever(localSource(sharedLibs)) 24 | .targetPath(sharedLibs) 25 | .defaultVersion("master") 26 | .implicit(true) 27 | .build() 28 | helper.registerSharedLibrary(library) 29 | 30 | setScriptRoots([ 'src', 'vars', 'test/groovy' ] as String[]) 31 | setScriptExtension('groovy') 32 | 33 | super.setUp() 34 | } 35 | 36 | @Test 37 | void should_execute_without_errors() throws Exception { 38 | Script script = loadScript("HelloPipeline.groovy") 39 | script.execute() 40 | printCallStack() 41 | assertJobStatusSuccess() 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Jenkins Shared Library Example 2 | 3 | This repository contains examples of a Jenkins Shared/Global Library with Unit tests. 4 | 5 | [![Build Status](https://travis-ci.org/nextlayer-ops/jenkins-pipeline-shared-library-example-maven.svg?branch=master)](https://travis-ci.org/nextlayer-ops/jenkins-pipeline-shared-library-example-maven) 6 | 7 | ## Features 8 | 9 | * **Maven** for dependency management and test configuration (using *maven-resources*, *gmavenplus* and *surefire* plugin ) 10 | * IDE support for IntelliJ (Project detection + Auto-Completion) 11 | * Unit tests with JenkinsPipelineUnit 12 | 13 | 14 | ## Testing 15 | 16 | Using Jenkins and writing pipeline-as-code is very powerful but can get pretty complex. 17 | To speed up the development cycle this example uses [JenkinsPipelineUnit](https://github.com/jenkinsci/JenkinsPipelineUnit), 18 | which lets you write unit tests on the configuration and conditional logic of the pipeline code, by providing a mock execution of the pipeline. You can mock built-in Jenkins commands, job configurations, see the stacktrace of the whole execution and even track regressions. 19 | 20 | Run the tests with the following command: 21 | ``` 22 | mvn test 23 | ``` 24 | 25 | ## Read more 26 | 27 | * https://jenkins.io/doc/book/pipeline/shared-libraries/ 28 | * https://www.cloudbees.com/blog/top-10-best-practices-jenkins-pipeline-plugin 29 | * https://github.com/jenkinsci/JenkinsPipelineUnit 30 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | io.nextlayer.ci 7 | jenkins-pipeline-shared-library-example-maven 8 | 0.1-SNAPSHOT 9 | pom 10 | 11 | Jenkins Pipeline Shared Global Library Example 12 | 13 | 14 | Nextlayer 15 | https://nextlayer.io 16 | 17 | 18 | 19 | 3.2.1 20 | 21 | 22 | 23 | 1.8 24 | 1.8 25 | UTF-8 26 | 2.4.12 27 | 4.12 28 | 1.1 29 | 30 | 31 | 32 | 33 | org.codehaus.groovy 34 | groovy-all 35 | ${groovy.version} 36 | 37 | 38 | junit 39 | junit 40 | ${junit.version} 41 | test 42 | 43 | 44 | com.lesfurets 45 | jenkins-pipeline-unit 46 | ${jenkins-pipeline-unit.version} 47 | test 48 | 49 | 50 | 51 | 52 | ${project.basedir}/src 53 | 54 | 55 | maven-resources-plugin 56 | 3.0.2 57 | 58 | 59 | copy-test-resources 60 | validate 61 | 62 | testResources 63 | 64 | 65 | ${basedir}/target/test-classes/nextlayerci-example@master 66 | 67 | 68 | ${project.basedir} 69 | true 70 | 71 | src/**/*.* 72 | vars/**/*.* 73 | resources/**/*.* 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | org.codehaus.gmavenplus 85 | gmavenplus-plugin 86 | 1.6 87 | 88 | 89 | 90 | addSources 91 | addTestSources 92 | generateStubs 93 | compile 94 | generateTestStubs 95 | compileTests 96 | 97 | 98 | 99 | 100 | 101 | 102 | ${project.basedir}/src 103 | 104 | **/*.groovy 105 | 106 | 107 | 108 | 109 | 110 | ${project.basedir}/test/java 111 | 112 | **/*.java 113 | 114 | 115 | 116 | ${project.basedir}/test/groovy 117 | 118 | **/*.groovy 119 | 120 | 121 | 122 | 123 | 124 | 125 | org.apache.maven.plugins 126 | maven-surefire-plugin 127 | 2.20 128 | 129 | true 130 | 131 | 132 | 133 | test 134 | test 135 | 136 | 137 | **/*Test.java 138 | **/*Test.groovy 139 | 140 | 141 | 142 | test 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | org.apache.maven.plugins 151 | maven-assembly-plugin 152 | 3.0.0 153 | 154 | 155 | create-distribution 156 | package 157 | 158 | single 159 | 160 | 161 | 162 | assembly/assembly.xml 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | -------------------------------------------------------------------------------- /src/pipeline.gdsl: -------------------------------------------------------------------------------- 1 | 2 | //The global script scope 3 | def ctx = context(scope: scriptScope()) 4 | contributor(ctx) { 5 | method(name: 'ansiColor', type: 'Object', params: [colorMapName:java.lang.String, body:'Closure'], doc: 'Color ANSI Console Output') 6 | method(name: 'build', type: 'Object', params: [job:'java.lang.String'], doc: 'Build a job') 7 | method(name: 'build', type: 'Object', namedParams: [parameter(name: 'job', type: 'java.lang.String'), parameter(name: 'parameters', type: 'Map'), parameter(name: 'propagate', type: 'boolean'), parameter(name: 'quietPeriod', type: 'java.lang.Integer'), parameter(name: 'wait', type: 'boolean'), ], doc: 'Build a job') 8 | method(name: 'echo', type: 'Object', params: [message:'java.lang.String'], doc: 'Print Message') 9 | method(name: 'error', type: 'Object', params: [message:'java.lang.String'], doc: 'Error signal') 10 | method(name: 'input', type: 'Object', params: [message:'java.lang.String'], doc: 'Wait for interactive input') 11 | method(name: 'input', type: 'Object', namedParams: [parameter(name: 'message', type: 'java.lang.String'), parameter(name: 'id', type: 'java.lang.String'), parameter(name: 'ok', type: 'java.lang.String'), parameter(name: 'parameters', type: 'Map'), parameter(name: 'submitter', type: 'java.lang.String'), parameter(name: 'submitterParameter', type: 'java.lang.String'), ], doc: 'Wait for interactive input') 12 | method(name: 'isUnix', type: 'Object', params: [:], doc: 'Checks if running on a Unix-like node') 13 | method(name: 'jiraComment', type: 'Object', namedParams: [parameter(name: 'issueKey', type: 'java.lang.String'), parameter(name: 'body', type: 'java.lang.String'), ], doc: 'JIRA: Add a comment to issue(s)') 14 | method(name: 'jiraIssueSelector', type: 'Object', params: [:], doc: 'JIRA: Issue selector') 15 | method(name: 'jiraIssueSelector', type: 'Object', namedParams: [parameter(name: 'issueSelector', type: 'Map'), ], doc: 'JIRA: Issue selector') 16 | method(name: 'jiraSearch', type: 'Object', params: [jql:'java.lang.String'], doc: 'JIRA: Search issues') 17 | method(name: 'library', type: 'Object', params: [identifier:'java.lang.String'], doc: 'Load a shared library on the fly') 18 | method(name: 'library', type: 'Object', namedParams: [parameter(name: 'identifier', type: 'java.lang.String'), parameter(name: 'changelog', type: 'java.lang.Boolean'), parameter(name: 'retriever', type: 'Map'), ], doc: 'Load a shared library on the fly') 19 | method(name: 'libraryResource', type: 'Object', params: [resource:'java.lang.String'], doc: 'Load a resource file from a shared library') 20 | method(name: 'mail', type: 'Object', namedParams: [parameter(name: 'subject', type: 'java.lang.String'), parameter(name: 'body', type: 'java.lang.String'), parameter(name: 'bcc', type: 'java.lang.String'), parameter(name: 'cc', type: 'java.lang.String'), parameter(name: 'charset', type: 'java.lang.String'), parameter(name: 'from', type: 'java.lang.String'), parameter(name: 'mimeType', type: 'java.lang.String'), parameter(name: 'replyTo', type: 'java.lang.String'), parameter(name: 'to', type: 'java.lang.String'), ], doc: 'Mail') 21 | method(name: 'milestone', type: 'Object', params: [ordinal:'java.lang.Integer'], doc: 'The milestone step forces all builds to go through in order') 22 | method(name: 'milestone', type: 'Object', namedParams: [parameter(name: 'ordinal', type: 'java.lang.Integer'), parameter(name: 'label', type: 'java.lang.String'), ], doc: 'The milestone step forces all builds to go through in order') 23 | method(name: 'node', type: 'Object', params: [label:java.lang.String, body:'Closure'], doc: 'Allocate node') 24 | method(name: 'properties', type: 'Object', params: [properties:'Map'], doc: 'Set job properties') 25 | method(name: 'readJSON', type: 'Object', params: [:], doc: 'Read JSON from files in the workspace.') 26 | method(name: 'readJSON', type: 'Object', namedParams: [parameter(name: 'file', type: 'java.lang.String'), parameter(name: 'text', type: 'java.lang.String'), ], doc: 'Read JSON from files in the workspace.') 27 | method(name: 'readManifest', type: 'Object', params: [:], doc: 'Read a Jar Manifest') 28 | method(name: 'readManifest', type: 'Object', namedParams: [parameter(name: 'file', type: 'java.lang.String'), parameter(name: 'text', type: 'java.lang.String'), ], doc: 'Read a Jar Manifest') 29 | method(name: 'readProperties', type: 'Object', params: [:], doc: 'Read properties from files in the workspace or text.') 30 | method(name: 'readProperties', type: 'Object', namedParams: [parameter(name: 'defaults', type: 'java.util.Map'), parameter(name: 'file', type: 'java.lang.String'), parameter(name: 'text', type: 'java.lang.String'), ], doc: 'Read properties from files in the workspace or text.') 31 | method(name: 'readTrusted', type: 'Object', params: [path:'java.lang.String'], doc: 'Read trusted file from SCM') 32 | method(name: 'readYaml', type: 'Object', params: [:], doc: 'Read yaml from files in the workspace or text.') 33 | method(name: 'readYaml', type: 'Object', namedParams: [parameter(name: 'file', type: 'java.lang.String'), parameter(name: 'text', type: 'java.lang.String'), ], doc: 'Read yaml from files in the workspace or text.') 34 | method(name: 'resolveScm', type: 'Object', namedParams: [parameter(name: 'source', type: 'Map'), parameter(name: 'targets', type: 'Map'), parameter(name: 'ignoreErrors', type: 'boolean'), ], doc: 'Resolves an SCM from an SCM Source and a list of candidate target branch names') 35 | method(name: 'retry', type: 'Object', params: [count:int, body:'Closure'], doc: 'Retry the body up to N times') 36 | method(name: 'script', type: 'Object', params: [body:'Closure'], doc: 'Run arbitrary Pipeline script') 37 | method(name: 'sleep', type: 'Object', params: [time:'int'], doc: 'Sleep') 38 | method(name: 'sleep', type: 'Object', namedParams: [parameter(name: 'time', type: 'int'), parameter(name: 'unit', type: 'java.util.concurrent.TimeUnit'), ], doc: 'Sleep') 39 | method(name: 'stage', type: 'Object', params: [name:java.lang.String, body:'Closure'], doc: 'Stage') 40 | method(name: 'stage', type: 'Object', params: [body:Closure], namedParams: [parameter(name: 'name', type: 'java.lang.String'), parameter(name: 'concurrency', type: 'java.lang.Integer'), ], doc: 'Stage') 41 | method(name: 'timeout', type: 'Object', params: [time:int, body:'Closure'], doc: 'Enforce time limit') 42 | method(name: 'timeout', type: 'Object', params: [body:Closure], namedParams: [parameter(name: 'time', type: 'int'), parameter(name: 'unit', type: 'java.util.concurrent.TimeUnit'), ], doc: 'Enforce time limit') 43 | method(name: 'tool', type: 'Object', params: [name:'java.lang.String'], doc: 'Use a tool from a predefined Tool Installation') 44 | method(name: 'tool', type: 'Object', namedParams: [parameter(name: 'name', type: 'java.lang.String'), parameter(name: 'type', type: 'java.lang.String'), ], doc: 'Use a tool from a predefined Tool Installation') 45 | method(name: 'waitUntil', type: 'Object', params: [body:'Closure'], doc: 'Wait for condition') 46 | method(name: 'withCredentials', type: 'Object', params: [bindings:Map, body:'Closure'], doc: 'Bind credentials to variables') 47 | method(name: 'withEnv', type: 'Object', params: [overrides:Map, body:'Closure'], doc: 'Set environment variables') 48 | method(name: 'ws', type: 'Object', params: [dir:java.lang.String, body:'Closure'], doc: 'Allocate workspace') 49 | method(name: 'catchError', type: 'Object', params: [body:'Closure'], doc: 'Advanced/Deprecated Catch error and set build result') 50 | method(name: 'dockerFingerprintRun', type: 'Object', params: [containerId:'java.lang.String'], doc: 'Advanced/Deprecated Record trace of a Docker image run in a container') 51 | method(name: 'dockerFingerprintRun', type: 'Object', namedParams: [parameter(name: 'containerId', type: 'java.lang.String'), parameter(name: 'toolName', type: 'java.lang.String'), ], doc: 'Record trace of a Docker image run in a container') 52 | method(name: 'envVarsForTool', type: 'Object', namedParams: [parameter(name: 'toolId', type: 'java.lang.String'), parameter(name: 'toolVersion', type: 'java.lang.String'), ], doc: 'Fetches the environment variables for a given tool in a list of \'FOO=bar\' strings suitable for the withEnv step.') 53 | method(name: 'getContext', type: 'Object', params: [type:'Map'], doc: 'Advanced/Deprecated Get contextual object from internal APIs') 54 | method(name: 'withContext', type: 'Object', params: [context:java.lang.Object, body:'Closure'], doc: 'Advanced/Deprecated Use contextual object from internal APIs within a block') 55 | property(name: 'docker', type: 'org.jenkinsci.plugins.docker.workflow.DockerDSL') 56 | property(name: 'pipeline', type: 'org.jenkinsci.plugins.pipeline.modeldefinition.ModelStepLoader') 57 | property(name: 'env', type: 'org.jenkinsci.plugins.workflow.cps.EnvActionImpl.Binder') 58 | property(name: 'params', type: 'org.jenkinsci.plugins.workflow.cps.ParamsVariable') 59 | property(name: 'currentBuild', type: 'org.jenkinsci.plugins.workflow.cps.RunWrapperBinder') 60 | property(name: 'scm', type: 'org.jenkinsci.plugins.workflow.multibranch.SCMVar') 61 | property(name: 'fileLoader', type: 'org.jenkinsci.plugins.workflow.remoteloader.FileLoaderDSL') 62 | } 63 | //Steps that require a node context 64 | def nodeCtx = context(scope: closureScope()) 65 | contributor(nodeCtx) { 66 | def call = enclosingCall('node') 67 | if (call) { 68 | method(name: 'bat', type: 'Object', params: [script:'java.lang.String'], doc: 'Windows Batch Script') 69 | method(name: 'bat', type: 'Object', namedParams: [parameter(name: 'script', type: 'java.lang.String'), parameter(name: 'encoding', type: 'java.lang.String'), parameter(name: 'returnStatus', type: 'boolean'), parameter(name: 'returnStdout', type: 'boolean'), ], doc: 'Windows Batch Script') 70 | method(name: 'checkout', type: 'Object', params: [scm:'Map'], doc: 'General SCM') 71 | method(name: 'checkout', type: 'Object', namedParams: [parameter(name: 'scm', type: 'Map'), parameter(name: 'changelog', type: 'boolean'), parameter(name: 'poll', type: 'boolean'), ], doc: 'General SCM') 72 | method(name: 'deleteDir', type: 'Object', params: [:], doc: 'Recursively delete the current directory from the workspace') 73 | method(name: 'dir', type: 'Object', params: [path:java.lang.String, body:'Closure'], doc: 'Change current directory') 74 | method(name: 'fileExists', type: 'Object', params: [file:'java.lang.String'], doc: 'Verify if file exists in workspace') 75 | method(name: 'findFiles', type: 'Object', params: [:], doc: 'Find files in the workspace') 76 | method(name: 'findFiles', type: 'Object', namedParams: [parameter(name: 'glob', type: 'java.lang.String'), ], doc: 'Find files in the workspace') 77 | method(name: 'git', type: 'Object', params: [url:'java.lang.String'], doc: 'Git') 78 | method(name: 'git', type: 'Object', namedParams: [parameter(name: 'url', type: 'java.lang.String'), parameter(name: 'branch', type: 'java.lang.String'), parameter(name: 'changelog', type: 'boolean'), parameter(name: 'credentialsId', type: 'java.lang.String'), parameter(name: 'poll', type: 'boolean'), ], doc: 'Git') 79 | method(name: 'load', type: 'Object', params: [path:'java.lang.String'], doc: 'Evaluate a Groovy source file into the Pipeline script') 80 | method(name: 'nexusArtifactUploader', type: 'Object', namedParams: [parameter(name: 'nexusVersion', type: 'java.lang.String'), parameter(name: 'protocol', type: 'java.lang.String'), parameter(name: 'nexusUrl', type: 'java.lang.String'), parameter(name: 'groupId', type: 'java.lang.String'), parameter(name: 'version', type: 'java.lang.String'), parameter(name: 'repository', type: 'java.lang.String'), parameter(name: 'credentialsId', type: 'java.lang.String'), parameter(name: 'artifacts', type: 'Map'), ], doc: 'Nexus Artifact Uploader') 81 | method(name: 'powershell', type: 'Object', params: [script:'java.lang.String'], doc: 'PowerShell Script') 82 | method(name: 'powershell', type: 'Object', namedParams: [parameter(name: 'script', type: 'java.lang.String'), parameter(name: 'encoding', type: 'java.lang.String'), parameter(name: 'returnStatus', type: 'boolean'), parameter(name: 'returnStdout', type: 'boolean'), ], doc: 'PowerShell Script') 83 | method(name: 'publishHTML', type: 'Object', params: [target:'Map'], doc: 'Publish HTML reports') 84 | method(name: 'pwd', type: 'Object', params: [:], doc: 'Determine current directory') 85 | method(name: 'pwd', type: 'Object', namedParams: [parameter(name: 'tmp', type: 'boolean'), ], doc: 'Determine current directory') 86 | method(name: 'readFile', type: 'Object', params: [file:'java.lang.String'], doc: 'Read file from workspace') 87 | method(name: 'readFile', type: 'Object', namedParams: [parameter(name: 'file', type: 'java.lang.String'), parameter(name: 'encoding', type: 'java.lang.String'), ], doc: 'Read file from workspace') 88 | method(name: 'readMavenPom', type: 'Object', params: [:], doc: 'Read a maven project file.') 89 | method(name: 'readMavenPom', type: 'Object', namedParams: [parameter(name: 'file', type: 'java.lang.String'), ], doc: 'Read a maven project file.') 90 | method(name: 'sh', type: 'Object', params: [script:'java.lang.String'], doc: 'Shell Script') 91 | method(name: 'sh', type: 'Object', namedParams: [parameter(name: 'script', type: 'java.lang.String'), parameter(name: 'encoding', type: 'java.lang.String'), parameter(name: 'returnStatus', type: 'boolean'), parameter(name: 'returnStdout', type: 'boolean'), ], doc: 'Shell Script') 92 | method(name: 'sha1', type: 'Object', params: [file:'java.lang.String'], doc: 'Compute the SHA1 of a given file') 93 | method(name: 'stash', type: 'Object', params: [name:'java.lang.String'], doc: 'Stash some files to be used later in the build') 94 | method(name: 'stash', type: 'Object', namedParams: [parameter(name: 'name', type: 'java.lang.String'), parameter(name: 'allowEmpty', type: 'boolean'), parameter(name: 'excludes', type: 'java.lang.String'), parameter(name: 'includes', type: 'java.lang.String'), parameter(name: 'useDefaultExcludes', type: 'boolean'), ], doc: 'Stash some files to be used later in the build') 95 | method(name: 'step', type: 'Object', params: [delegate:'Map'], doc: 'General Build Step') 96 | method(name: 'tm', type: 'Object', params: [stringWithMacro:'java.lang.String'], doc: 'Expand a string containing macros') 97 | method(name: 'touch', type: 'Object', params: [file:'java.lang.String'], doc: 'Create a file (if not already exist) in the workspace, and set the timestamp') 98 | method(name: 'touch', type: 'Object', namedParams: [parameter(name: 'file', type: 'java.lang.String'), parameter(name: 'timestamp', type: 'java.lang.Long'), ], doc: 'Create a file (if not already exist) in the workspace, and set the timestamp') 99 | method(name: 'unstash', type: 'Object', params: [name:'java.lang.String'], doc: 'Restore files previously stashed') 100 | method(name: 'unzip', type: 'Object', params: [zipFile:'java.lang.String'], doc: 'Extract Zip file') 101 | method(name: 'unzip', type: 'Object', namedParams: [parameter(name: 'zipFile', type: 'java.lang.String'), parameter(name: 'charset', type: 'java.lang.String'), parameter(name: 'dir', type: 'java.lang.String'), parameter(name: 'glob', type: 'java.lang.String'), parameter(name: 'read', type: 'boolean'), parameter(name: 'test', type: 'boolean'), ], doc: 'Extract Zip file') 102 | method(name: 'validateDeclarativePipeline', type: 'Object', params: [path:'java.lang.String'], doc: 'Validate a file containing a Declarative Pipeline') 103 | method(name: 'withMaven', type: 'Object', params: [body:'Closure'], doc: 'Provide Maven environment') 104 | method(name: 'withMaven', type: 'Object', params: [body:Closure], namedParams: [parameter(name: 'globalMavenSettingsConfig', type: 'java.lang.String'), parameter(name: 'globalMavenSettingsFilePath', type: 'java.lang.String'), parameter(name: 'jdk', type: 'java.lang.String'), parameter(name: 'maven', type: 'java.lang.String'), parameter(name: 'mavenLocalRepo', type: 'java.lang.String'), parameter(name: 'mavenOpts', type: 'java.lang.String'), parameter(name: 'mavenSettingsConfig', type: 'java.lang.String'), parameter(name: 'mavenSettingsFilePath', type: 'java.lang.String'), parameter(name: 'options', type: 'Map'), ], doc: 'Provide Maven environment') 105 | method(name: 'wrap', type: 'Object', params: [delegate:Map, body:'Closure'], doc: 'General Build Wrapper') 106 | method(name: 'writeFile', type: 'Object', namedParams: [parameter(name: 'file', type: 'java.lang.String'), parameter(name: 'text', type: 'java.lang.String'), parameter(name: 'encoding', type: 'java.lang.String'), ], doc: 'Write file to workspace') 107 | method(name: 'writeJSON', type: 'Object', namedParams: [parameter(name: 'file', type: 'java.lang.String'), parameter(name: 'json', type: 'Map'), parameter(name: 'pretty', type: 'int'), ], doc: 'Write JSON to a file in the workspace.') 108 | method(name: 'writeMavenPom', type: 'Object', params: [model:'Map'], doc: 'Write a maven project file.') 109 | method(name: 'writeMavenPom', type: 'Object', namedParams: [parameter(name: 'model', type: 'Map'), parameter(name: 'file', type: 'java.lang.String'), ], doc: 'Write a maven project file.') 110 | method(name: 'writeYaml', type: 'Object', namedParams: [parameter(name: 'file', type: 'java.lang.String'), parameter(name: 'data', type: 'java.lang.Object'), ], doc: 'Write a yaml from an object.') 111 | method(name: 'zip', type: 'Object', params: [zipFile:'java.lang.String'], doc: 'Create Zip file') 112 | method(name: 'zip', type: 'Object', namedParams: [parameter(name: 'zipFile', type: 'java.lang.String'), parameter(name: 'archive', type: 'boolean'), parameter(name: 'dir', type: 'java.lang.String'), parameter(name: 'glob', type: 'java.lang.String'), ], doc: 'Create Zip file') 113 | method(name: 'archive', type: 'Object', params: [includes:'java.lang.String'], doc: 'Advanced/Deprecated Archive artifacts') 114 | method(name: 'archive', type: 'Object', namedParams: [parameter(name: 'includes', type: 'java.lang.String'), parameter(name: 'excludes', type: 'java.lang.String'), ], doc: 'Archive artifacts') 115 | method(name: 'dockerFingerprintFrom', type: 'Object', namedParams: [parameter(name: 'dockerfile', type: 'java.lang.String'), parameter(name: 'image', type: 'java.lang.String'), parameter(name: 'toolName', type: 'java.lang.String'), ], doc: 'Record trace of a Docker image used in FROM') 116 | method(name: 'unarchive', type: 'Object', params: [:], doc: 'Advanced/Deprecated Copy archived artifacts into the workspace') 117 | method(name: 'unarchive', type: 'Object', namedParams: [parameter(name: 'mapping', type: 'Map'), ], doc: 'Copy archived artifacts into the workspace') 118 | method(name: 'withDockerContainer', type: 'Object', params: [image:java.lang.String, body:'Closure'], doc: 'Advanced/Deprecated Run build steps inside a Docker container') 119 | method(name: 'withDockerContainer', type: 'Object', params: [body:Closure], namedParams: [parameter(name: 'image', type: 'java.lang.String'), parameter(name: 'args', type: 'java.lang.String'), parameter(name: 'toolName', type: 'java.lang.String'), ], doc: 'Run build steps inside a Docker container') 120 | method(name: 'withDockerRegistry', type: 'Object', params: [registry:Map, body:'Closure'], doc: 'Advanced/Deprecated Sets up Docker registry endpoint') 121 | method(name: 'withDockerServer', type: 'Object', params: [server:Map, body:'Closure'], doc: 'Advanced/Deprecated Sets up Docker server endpoint') 122 | } 123 | } 124 | 125 | // Errors on: 126 | // class org.jenkinsci.plugins.workflow.cps.steps.ParallelStep: There's no @DataBoundConstructor on any constructor of class org.jenkinsci.plugins.workflow.cps.steps.ParallelStep --------------------------------------------------------------------------------