From 334d586e36659fcbbb981582b7401bd71435f8b8 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Thu, 3 Aug 2017 07:18:18 -0700 Subject: [PATCH] Hacking pipeline, lulz --- ...08-03-overriding-builtin-steps-pipeline.md | 172 ++++++++++++++++++ .../overriding-steps/load-implicitly.png | Bin 0 -> 23338 bytes 2 files changed, 172 insertions(+) create mode 100644 _posts/2017-08-03-overriding-builtin-steps-pipeline.md create mode 100644 images/post-images/overriding-steps/load-implicitly.png diff --git a/_posts/2017-08-03-overriding-builtin-steps-pipeline.md b/_posts/2017-08-03-overriding-builtin-steps-pipeline.md new file mode 100644 index 0000000..f28aebd --- /dev/null +++ b/_posts/2017-08-03-overriding-builtin-steps-pipeline.md @@ -0,0 +1,172 @@ +--- +layout: post +title: "Overriding steps in Pipeline with Shared Library sleight of hand" +tags: +- pipeline +- jenkins +--- + +[Jenkins Pipeline](https://jenkins.io/doc/book/pipeline) has rapidly become one +of my favorite tools in the entire Jenkins ecosystem. Part of my job at +[CloudBees](https://www.cloudbees.com) has been advocating for its use, but I +can confidently state that I would be a passionate user of Jenkins Pipeline +regardless of who was paying me; it is simply better than what preceded it. As +Pipeline has evolved and matured, I have pushed for its unilateral adoption +within the Jenkins project's [own Jenkins environment](https://ci.jenkins.io). +Wielding Pipeline as a developer is one thing, managing infrastructure which +utilizes it is quite another. + + +As a Jenkins administrator, my two main concerns are: effective resource +utilization, and reducing my support burden. Using Jenkins Pipeline means that +developers can commit a `Jenkinsfile` to their repository and +"choose-their-own-adventure" with their continuous integration and delivery +workload. I can, and typically do, go one step further by enabling a GitHub +Organization Folder which automatically adds repositories and branches which +contain a `Jenkinsfile`, allowing new repos to be created and automatically +incorporated into the Jenkins environment. This flexibility comes at a cost, +consider the following contrived `Jenkinsfile`: + + node('some-very-expensive-instance') { + sh 'while true; do echo "Lol"; done' + } + +Perfectly valid, but as an administrator, completely annoying. The above +example will allocate resources in the Jenkins environment, and then run an +infinite loop, tying up those resources until somebody notices. While I hope +none of the developers I work with would be so intentionally abusive to the +Jenkins infrastructure, it's easy to guess how different usage patterns might +cause an infinite loop (check an external resource before proceeded, except the +external resource never gives the response desired), or more likely, an +exceptionally long Pipeline run caused by wedged tests. If only I had a mechanism for automatically +applying a timeout to operations! + +Consider a different scenario. To provide better console output, shell +scripts should have a timestamp in the log _and_ should use colorized console +output for better readability. Perfectly doable in Pipeline: + + + node { + ansiColor('xterm') { + timestamps { + sh 'make check' + } + } + } + +Unfortunately, I have no way to mandate that every Jenkins Pipeline uses this +exact same pattern. Expecting every developer to follow this pattern is +terribly unlikely. + +Fortunately, Pipeline gives me a mechanism to solve both problems here: +[Shared Libraries](https://jenkins.io/doc/book/pipeline/shared-libraries/). To +address the latter example, I could created a Shared Library, which provides a +[global +variable](https://jenkins.io/doc/book/pipeline/shared-libraries/#defining-global-variables) +`goodsh`, defined in a file named `vars/goodsh.groovy`, which encapsulates the +use of `ansiColor` and `timestamps`. A `Jenkinsfile` utilizing this Shared +Library could be made much more concise: + + node { + goodsh 'make check' + } + +Much better! Except now I am relying on _everybody_ knowing about my `goodsh` +global variable, and using it in their Pipelines. + + +### Overriding built-in steps + +Fortunately this can be accomplished by overriding built-in steps with the +Shared Library. I consider this a **feature** of Shared Libraries, but there's +no telling who might consider it a bug instead, so your mileage may vary! + +Reconsider my `goodsh` global variable above, what if I rename that file to +`vars/sh.groovy`, then I could invoke the global variable `sh` right? +**Bzzzt!** Stack overflow. Lucky for me, there is a hidden variable in the +scope called `steps`, upon which the built-in steps have been made available. +If I change `vars/sh.groovy` to the following, everything works nicely: + + def call(Map params = [:]) { + String script = params.script + Boolean returnStatus = params.get('returnStatus', false) + Boolean returnStdout = params.get('returnStdout', false) + String encoding = params.get('encoding', null) + + timeout(time: 2, unit: HOURS) { + ansiColor('xterm') { + timestamps { + /* invoke the built-in sh step */ + return steps.sh(script: script, + returnStatus: returnStatus, + returnStdout: returnStdout, + encoding: encoding) + } + } + } + } + /* Convenience overload */ + def call(String script) { + return call(script: script) + } + +In the global variable implementation above, I can define some really useful +defaults for `sh` invocations in the Jenkins environment. First, and probably +most importantly, I can apply a global 2 hour timeout for any single `sh` +invocation. And second, I can apply some nice, prettifying defaults, courtesy of +the [ANSI Color plugin](https://plugins.jenkins.io/ansicolor) and the +[Timestamper plugin](https://plugins.jenkins.io/timestamper). + + +### How it works + +When I showed my pal [Andrew](https://github.com/abayer), one of the primary +developers of Declarative Pipeline syntax, this "feature," he was surprised to +say the least. It just _feels_ weird doesn't it? The reason this works all +comes down to goofy tricks with scope in Pipeline, a Groovy-based +domain-specific language. To demonstrate, let's do something foolish: + + node { + /* assign a variable */ + def sh = 'lolwut?' + sh 'printenv' + } + + +Predictably, this will raise an exception at runtime: + + groovy.lang.MissingMethodException: No signature of method: java.lang.String.call() is applicable for argument types: (java.lang.String) values: [printenv] + + +The Pipeline is adding a `sh` variable to the current scope, which is being +resolved _first_ when we attempt to invoke `sh 'printenv'` on the next line. Of +course, a String variable is not callable, an exception is thrown. + +It is this principle that overriding steps is based upon. Since Shared +Libraries allow me to inject my own global variables, I can create a Shared +Library which overrides key built-in steps. In order to make my overrides +**default** however, I must add a "Global Shared Library" inside the "Configure +System" page: + +![Load Implicitly](/images/post-images/overriding-steps/load-implicitly.png) + +Since this is an *administrative* option, I have the power to make these +overridden steps required for all Pipelines executing in this environment. + + +Overriding steps is obviously an advanced use-case, and presents some risks. +For example, you should **never** load a Pipeline Library from an untrusted +source. Not only because steps can be overridden, but also because Shared +Libraries are considered "trusted" in the Pipeline runtime. Additionally, if +you decide to override built-in steps, **always** preserve the same call +signature as the built-in step, otherwise users will quickly find that what +they're invoking isn't what they expect, and will probably get upset. + + +This approach, implemented properly, can be quite beneficial as users get +additional functionality "for free" from their existing Jenkins Pipelines! + + +If you're interested in talking about more crazy Pipeline hacks, I invite you +to join me [at Jenkins World 2017](http://jenkinsworld.com) in San Francisco, +August 28th - 31st. diff --git a/images/post-images/overriding-steps/load-implicitly.png b/images/post-images/overriding-steps/load-implicitly.png new file mode 100644 index 0000000000000000000000000000000000000000..56e3637a8e24f5d37bec205f8ab466f68d3fa651 GIT binary patch literal 23338 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 Lds-AttC#-*oJt%> literal 0 HcmV?d00001