Skip to content

Instantly share code, notes, and snippets.

@chinshr
Last active October 24, 2024 17:13
Show Gist options
  • Save chinshr/aa87da01ec28335e3ffd to your computer and use it in GitHub Desktop.
Save chinshr/aa87da01ec28335e3ffd to your computer and use it in GitHub Desktop.
Best of Jenkinsfile, a collection of useful workflow scripts ready to be copied into your Jenkinsfile on a per use basis.
#!groovy
# Best of Jenkinsfile
# `Jenkinsfile` is a groovy script DSL for defining CI/CD workflows for Jenkins
node {
}
# Jenkinsfile
# Build and test a Maven project
node {
git url: 'https://github.com/user/repo.git'
def mvnHome = tool 'M3'
sh "${mvnHome}/bin/mvn -B -Dmaven.test.failure.ignore verify"
step([$class: 'JUnitResultArchiver', testResults:
'**/target/foobar/TEST-*.xml'])
}
# Jenkinsfile
# Verify a Maven project
node {
git url: 'https://github.com/user/repo.git'
def mvnHome = tool 'M3'
sh "${mvnHome}/bin/mvn -B verify"
}
stage "unit test"
node {
git "[email protected]:michaelneale/oaks-trail-ride.git"
sh "echo unit test app"
}
stage "test on supported OSes"
parallel (
windows: { node {
sh "echo building on windows now"
}},
mac: { node {
sh "echo building on mac now"
}}
node {
for (int i=0; i< 2; ++i) {
stage "Stage #"+i
print 'Hello, world $i!'
}
stage "Stage Parallel"
def branches = [:]
for (int i = 0; i < numHelloMessages.toInteger(); i++) {
branches["split${i}"] = {
stage "Stage parallel- #"+i
node('remote') {
echo 'Starting sleep'
sleep 10
echo 'Finished sleep'
}
}
}
parallel branches
}
@abayer
Copy link

abayer commented Dec 1, 2015

Hi! Mind if we pull some of these examples over into https://github.com/jenkinsci/workflow-examples? Thanks!

@michaelsanford
Copy link

michaelsanford commented Apr 26, 2016

Are we missing a closing ) from opening parallel ( in parallel-stage-2.groovy?

@botchniaque
Copy link

For the parallel-stage.groovy I get this:

ERROR: The ‘stage’ step must not be used inside a ‘parallel’ block.
Finished: FAILURE

Does it mean I have older or newer version?

@damiano-migme
Copy link

@botchniaque , the error you're getting is due to a restriction recently introduced. It's not possible to use a stage step inside a parallel block.

@wohlben
Copy link

wohlben commented Jun 29, 2016

not a native speaker, so sorry for my poor english...

I was having some trouble with the parallel execution of your example and thought i could share my solution, in case somebody else stumbles upon this.

the insane restriction of no stages inside parallel (forcing us to go back to bash scripts for most tests, making the jenkins log significantly harder to read) has already been mentioned, but it hasn't been mentioned that the variable "i" inside the curly brakes isnt evaluated until the parallel execution - making it '3' in every single branch.
i solved it by using a method to create said command

def domains = ['leap42', 'opensuse13', 'sles12']
def executions = [:]

def create_execution(String dist) {
    cmd = { 
        node {
            sh "echo ${dist}"
        }
    }
    return cmd
}

for(int i = 0; i < domains.size(); i++) {
    executions[domains[i]] = create_execution(domains[i])
    }

parallel executions

@Headcult
Copy link

Headcult commented Sep 9, 2016

Thanks for this! Very useful.

Can someone tell me how to execute/run 'Jenkinsfile' when it's added as part of the project folder structure? Basically, I'm looking for a way where we can run this Jenkinsfile like how we execute docker from Dockerfile?

@SpencerMalone
Copy link

Are you asking how to run the Jenkinsfile on a local machine without jenkins?

@kevinpgrant
Copy link

@Headcult Dockerfiles can be run at the command line with a "docker build" command, but the Jenkinsfiles are not executed in this manner

When you commit and push your Jenkinsfile to your git repo (assuming you are using git, jenkins and the git plugin) then the Jenkins slave(s) will execute the steps in the Jenkinsfile for you. You will need to have configured a job pointing to the git repo and watching for changes first. Look at the Folders plugin and run Folder Computation in Jenkins - this will create a job for every branch which has a Jenkinsfile present in your repo, it's very useful!

(bonus tip: You can even setup your Jenkinsfile to run your docker build)

@hayesgm
Copy link

hayesgm commented Nov 30, 2016

For the parallel case, reading the docs from Jenkins from "Jobs in Parallel," you should use:

node {
  for (int i=0; i< 2; ++i) {  
    stage "Stage #"+i
    print 'Hello, world $i!'
  }

  stage "Stage Parallel"
  def branches = [:]
  for (int i = 0; i < numHelloMessages.toInteger(); i++) {
    def index = i
    branches["split${i}"] = {
      stage "Stage parallel- #"+index
      node('remote') {
       echo  'Starting sleep'
       sleep 10
       echo  'Finished sleep'
      }
    }
  }
  parallel branches
}

This will solve the issue of having i=4 for each iteration of the parallel loop.

Copy link

ghost commented Dec 29, 2016

Can you someone please help , That how can i deploy my 8 build artifact into the env server simultaneously via jenkins jobs through Deployit tool

@mattvonrocketstein
Copy link

Can anyone answer whether the examples with iteration actually work? JENKINS-26481 and this stack overflow indicate that loops of all kinds are broken

@stevaaa
Copy link

stevaaa commented Jan 30, 2017

Hi guys, Can you give an example to pass parameters from one job to another job? (Pipeline project)
I have been stuck with this for a while now, kindly provide suggestions.

I'm trying the below, which did not work for me:(

Project Name: test2
node() {
stage 'pass params'
paramAValue = "paramAValue"
paramBValue = "paramBValue"
build job: 'test3', parameters: [[$class: 'StringParameterValue', name: 'ParamA', value: paramAValue], [$class: 'StringParameterValue', name: 'ParamB', value: paramBValue]]
}

Project Name: test3
node() {
stage 'retrieve params'
print "${env.paramA}"
}

@grahamatgithub
Copy link

grahamatgithub commented Mar 8, 2017

stage ('pass params') {
def paramAValue = "paramAValue"
...
}

etc.

Also try:
echo paramA not print "${env.paramA}"

@bparker98
Copy link

The preferred method of getting job parameters is to use the "params" map.

So use echo params.paramA

See https://jenkins.io/doc/book/pipeline/syntax/#parameters

@fredflintstone49
Copy link

Can someone please give an example of jenkins file which shows how to connect to jenkins slave and execute the shell scripts and python scripts residing in jenkins slave itself.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment