Jenkinsfile.rb
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 30 May 2016 23:21:41 +0100
changeset 25 7ef6e0216e9c
parent 24 ae6fc15070e4
child 59 9099e2455d9c
permissions -rwxr-xr-x
Jenkinsfile.rb: Wipe out `reports` directory before starting a build This is needed for two reasons: 1. There's a bug in Cobertura plugin so it does not expand variables in .xml file pattern so the pattern cannot include BUILD_NUMBER to tell reports for particular build. See https://issues.jenkins-ci.org/browse/JENKINS-30647 2. More importantly, when additional axis is used (such as JDK or Mercurial version) then value of this axis is not reflected in report filename. So again, all files, even those from previous builds would be matches which is not what we want. A workaround is to wipe-out `reports` directory before each buld, so once this script finishes, all reports there are for this build. The downside is that we have to limit number of executors to 1,
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
     1
#!/usr/bin/ruby
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
     2
DOCUMENTATION = <<DOCEND
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
     3
A help script to build a Smalltalk/X jv-branch (mainly) on a Jenkins CI. 
24
ae6fc15070e4 Jenkinsfile.rb: added new target `jenkins:job`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20
diff changeset
     4
If no TARGET is given, invokes target `jenkins:job`.
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
5
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
     6
DOCEND
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
5
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
     8
require 'optparse'
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
5
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    10
def run()
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    11
  optparse = OptionParser.new do | opts |
24
ae6fc15070e4 Jenkinsfile.rb: added new target `jenkins:job`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20
diff changeset
    12
    opts.banner = "Usage: #{$0} [TARGET1 [TARGET1 [...]]\n"
5
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    13
    opts.on('-p', '--project PROJECT', "PROJECT to build. Overrides project specified by the environment variable.") do | value |
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    14
      ENV['PROJECT'] = value
20
0b7a237a445b Fixed `Jenkinsfile.rb` to correctly propagate --project and --arch to `rake`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 5
diff changeset
    15
      self.class.const_set('PROJECT', value)  
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
    end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
5
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    18
    opts.on('-a', '--arch ARCH', "Arcitecture to build for. Overrides project specified by the environment variable.") do | value |
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    19
      ENV['ARCH'] = value
20
0b7a237a445b Fixed `Jenkinsfile.rb` to correctly propagate --project and --arch to `rake`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 5
diff changeset
    20
      self.class.const_set('ARCH', value)  
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
    end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
5
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    23
    opts.on(nil, '--help', "Prints this message") do
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    24
      puts DOCUMENTATION
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    25
      puts optparse.help()
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    26
      exit 0
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
    end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
  end
5
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    29
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    30
  optparse.parse!
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    31
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    32
  # If run outside a Jenkins build environment (such as from a command line), 
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    33
  # define some variables to make it look more like a proper  Jenkins build 
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    34
  # environment. 
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    35
  ENV['WORKSPACE'] ||= '.'
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    36
  ENV['BUILD_NUMBER'] ||= Time.now.strftime("%Y%m%d")
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    37
  ENV['JOB_NAME'] ||= 'interactive'
24
ae6fc15070e4 Jenkinsfile.rb: added new target `jenkins:job`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20
diff changeset
    38
ae6fc15070e4 Jenkinsfile.rb: added new target `jenkins:job`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20
diff changeset
    39
  # If no target is given, run target jenkins:job
ae6fc15070e4 Jenkinsfile.rb: added new target `jenkins:job`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20
diff changeset
    40
  if ARGV.size == 0 then
ae6fc15070e4 Jenkinsfile.rb: added new target `jenkins:job`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20
diff changeset
    41
    ARGV << 'jenkins:job'
ae6fc15070e4 Jenkinsfile.rb: added new target `jenkins:job`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20
diff changeset
    42
  end
25
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    43
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    44
  # Wipe out `reports` directory. This is needed for two reasons: 
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    45
  #
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    46
  # 1) There's a bug in Cobertura plugin so it does not expand 
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    47
  #    variables in .xml file pattern so the pattern cannot include
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    48
  #    BUILD_NUMBER to tell reports for particular build. 
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    49
  #    See https://issues.jenkins-ci.org/browse/JENKINS-30647
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    50
  # 2) More importantly, when additional axis is used (such as JDK
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    51
  #    or Mercurial version) then value of this axis is not reflected
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    52
  #    in report filename. So again, all files, even those from previous
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    53
  #    builds would be matches which is not what we want. 
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    54
  # 
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    55
  # A workaround is to wipe-out `reports` directory before each buld,
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    56
  # so once this script finishes, all reports there are for this build.
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    57
  # The downside is that we have to limit number of executors to 1,
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    58
  reports_dir = File.join(ENV['WORKSPACE'], 'reports')
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    59
  if File.exist? reports_dir then
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    60
    require 'fileutils'    
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    61
    FileUtils.rm_rf reports_dir
7ef6e0216e9c Jenkinsfile.rb: Wipe out `reports` directory before starting a build
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
    62
  end
5
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    63
  
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    64
  # When run under Jenkins, we do want to see full backtrace if something
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    65
  # fails. 
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    66
  ARGV << '--trace'
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    67
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    68
  require 'rake'
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    69
  Rake.application.run
0
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
end
f46260ba26b1 Initial shot of "new" rake-based builder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
5
0e2993dac13e Jenkinsfile.rb: Jenkins build script refactored and simplified.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    72
run if __FILE__ == $0