]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Parameterise jenkinsfile
authorMatthew Newton <matthew-git@newtoncomputing.co.uk>
Thu, 14 Nov 2019 00:33:18 +0000 (00:33 +0000)
committerMatthew Newton <matthew-git@newtoncomputing.co.uk>
Thu, 14 Nov 2019 01:23:13 +0000 (01:23 +0000)
scripts/jenkins/Jenkinsfile [deleted file]
scripts/jenkins/Jenkinsfile.auto [new file with mode: 0644]
scripts/jenkins/Jenkinsfile.defs
scripts/jenkins/Jenkinsfile.params [new file with mode: 0644]

diff --git a/scripts/jenkins/Jenkinsfile b/scripts/jenkins/Jenkinsfile
deleted file mode 100644 (file)
index c146f1c..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Build FreeRADIUS packages for common Linux distributions.
- *  Function definitions are pulled in from Jenkinsfile.defs so
- *  that they can be used in other Jenkinsfiles.
- */
-
-node {
-       cleanWs(patterns: [[pattern: '**/*.deb , **/*.changes , **/*.buildinfo , **/*.rpm', type: 'INCLUDE']])
-       checkout scm
-
-       def fr = load "scripts/jenkins/Jenkinsfile.defs"
-       fr.genBuildNumber()
-
-       parallel fr.buildClosures(platforms, scm.branches, scm.userRemoteConfigs)
-
-       archiveArtifacts artifacts: artifacts, onlyIfSuccessful: true
-       cleanWs()
-}
diff --git a/scripts/jenkins/Jenkinsfile.auto b/scripts/jenkins/Jenkinsfile.auto
new file mode 100644 (file)
index 0000000..1cadc25
--- /dev/null
@@ -0,0 +1,37 @@
+def platforms = ["centos7", "debian9", "ubuntu16", "ubuntu18"]
+def server_dir = "freeradius-server"
+def artifacts = 'build-number, **/*.changes, **/*.buildinfo, **/*.deb, **/*.rpm'
+
+/*
+ *  Build FreeRADIUS packages for common Linux distributions.
+ *  Source is used as defined in the Jenkins job. Function
+ *  definitions are pulled in from Jenkinsfile.defs so that they
+ *  can be used in other Jenkinsfiles.
+ */
+
+node {
+       cleanWs(patterns: [[pattern: '**/*.deb , **/*.changes , **/*.buildinfo , **/*.rpm', type: 'INCLUDE']])
+
+       dir(server_dir) {
+               checkout scm
+       }
+
+       def fr = load server_dir + "/scripts/jenkins/Jenkinsfile.defs"
+       fr.genBuildNumber(server_dir, "build-number")
+
+       def build_opts = [:]
+       build_opts.platforms = platforms
+       build_opts.source = scm.getUserRemoteConfigs()[0].getUrl()
+       build_opts.branch = scm.getBranches()[0].getName();
+       build_opts.package_version = ''
+       build_opts.package_release = '1'
+       build_opts.use_commit = true
+       build_opts.server_dir = server_dir
+
+       print build_opts.inspect()
+
+       parallel fr.buildClosures(build_opts)
+
+       archiveArtifacts artifacts: artifacts, onlyIfSuccessful: true
+       cleanWs()
+}
index 4ef31c42706054f3a0e33c4df52e6d833d39abe6..93ae334cd1aa832dbb5d9553c58afb519f023bb0 100644 (file)
@@ -1,7 +1,3 @@
-platforms = ["centos7", "debian9", "ubuntu16", "ubuntu18"]
-artifacts = 'build-number, **/*.changes, **/*.buildinfo, **/*.deb, **/*.rpm'
-
-
 /*
  *  The detectChanges function looks at the last git commit and
  *  searches for changes to "redhat/freeradius.spec" or anything
@@ -9,7 +5,7 @@ artifacts = 'build-number, **/*.changes, **/*.buildinfo, **/*.deb, **/*.rpm'
  *  files it returns the string " --no-cache " which can be fed to
  *  a docker build command to tell docker to rebuild the image
  *  from scratch so that it can pick up any new dependencies
- *  specified in those package manifest files
+ *  specified in those package manifest files.
  */
 
 def detectChanges() {
@@ -43,23 +39,35 @@ def detectChanges() {
  *  and uses function currying to be able to pass multiple
  *  dynamically generated jenkins build commands into a jenkins
  *  parallel block. This function ensures that the docker image is
- *  built and builds FreeRADIUS packages inside the docker image
+ *  built and builds FreeRADIUS packages inside the docker image.
  */
 
-def buildClosures(arg, scmBranches, scmURC) {
-       println arg.inspect()
-       def platforms = arg
+def buildClosures(args) {
+       println args.inspect()
+
+       def platforms = args.platforms
+       def source = args.source
+       def branch = args.branch
+       def package_version = args.package_version
+       def package_release = args.package_release
+       def use_commit = args.use_commit
+       def server_dir = args.server_dir ?: "."
+
        def closures = [:]
        for (value in platforms) {
 
                closures[value] = {platform ->
                        stage("build-${platform}") {
                                rebuild = detectChanges()
-                               docker.build("${platform}-master-test","${rebuild} -f ./scripts/docker/build-${platform}/Dockerfile.deps ./scripts/docker/build-${platform}").inside {
+                               docker.build("${platform}-master-test", "${rebuild} -f " + server_dir + "/scripts/docker/build-${platform}/Dockerfile.deps " + server_dir + "/scripts/docker/build-${platform}").inside {
 
                                        checkout([$class: 'GitSCM',
-                                               branches: scmBranches,
-                                               userRemoteConfigs: scmURC,
+                                               userRemoteConfigs: [
+                                                       [url: source]
+                                               ],
+                                               branches: [
+                                                       [name: branch]
+                                               ],
                                                extensions: [
                                                        [$class: 'CleanBeforeCheckout'],
                                                        [$class: 'RelativeTargetDirectory',
@@ -76,20 +84,41 @@ def buildClosures(arg, scmBranches, scmURC) {
 
                                        sh "cat /etc/os-release || cat /etc/redhat-release"
 
-                                       def commit_num = readFile("./build-number").trim()
-       
+                                       def commit_num = "0"
+                                       if (use_commit) {
+                                               commit_num = readFile("./build-number").trim()
+                                       }
+
                                        dir("${platform}/build/") {
+
+                                               /*
+                                                *  Build up the package version number:
+                                                *    version: [ VERSION [+GITNUM] ]
+                                                *    release: -[ RELEASE ]
+                                                */
+
+                                               def version = package_version
+                                               if (version.length() == 0) {
+                                                       version = sh (script: "cat VERSION", returnStdout: true).trim()
+                                               }
+
+                                               if (use_commit) {
+                                                       version = version + "+" + commit_num
+                                               }
+
+                                               def release = package_release ?: "1"
+
                                                if (platform.contains("centos")) {
-                                                       sh "sed -i -e \"s/^Release:.*\$/Release: ${commit_num}/\" redhat/freeradius.spec"
-                                                       sh 'RADIUSD_VERSION_STRING=$(cat VERSION) make rpm'
-                                                       sh "mv rpmbuild/RPMS/x86_64/*.rpm .."
+                                                       sh 'sed -i -e "s/^Version:.*$/Version: ' + version + '/" redhat/freeradius.spec'
+                                                       sh 'sed -i -e "s/^Release:.*$/Release: ' + release + '/" redhat/freeradius.spec'
+                                                       sh 'RADIUSD_VERSION_STRING="' + version + '" make rpm'
                                                } else {
                                                        sh "apt-get install -y unixodbc-dev"
-                                                       def version = sh (script: "dpkg-parsechangelog | grep '^Version: ' | awk '{print \$2}'", returnStdout: true).trim()
+
                                                        def commit_msg = sh (script: "git log --oneline -1 \$GIT_COMMIT", returnStdout: true).trim()
+                                                       sh "dch -b -v ${version}-${release} \"${commit_msg}\""
 
-                                                       sh "dch -b -v ${version}-${commit_num} \"${commit_msg}\""
-                                                       sh "make deb"
+                                                       sh 'make deb'
                                                }
                                        }
 
@@ -109,8 +138,8 @@ def buildClosures(arg, scmBranches, scmURC) {
  *  version number.
  */
 
-def genBuildNumber() {
-       sh (script: "git describe --tags --long --match 'release_*' --match 'branch_*' | sed -e \'s/^.*-\\([0-9]*\\)-g[0-9a-f]*/\\1/\' > build-number")
+def genBuildNumber(source, file) {
+       sh "(cd \"${source}\" && git describe --tags --long --match 'release_*' --match 'branch_*' | sed -e \'s/^.*-\\([0-9]*\\)-g[0-9a-f]*/\\1/\') > \"${file}\""
 }
 
 return this
diff --git a/scripts/jenkins/Jenkinsfile.params b/scripts/jenkins/Jenkinsfile.params
new file mode 100644 (file)
index 0000000..30082a7
--- /dev/null
@@ -0,0 +1,113 @@
+def artifacts = 'build-number, **/*.changes, **/*.buildinfo, **/*.deb, **/*.rpm'
+def default_branch = 'master'
+
+
+/*
+ *  Build FreeRADIUS packages for common Linux distributions.
+ *  Function definitions are pulled in from Jenkinsfile.defs so
+ *  that they can be used in other Jenkinsfiles.
+ */
+
+properties([
+       parameters([
+               string(
+                       name: 'source',
+                       defaultValue: 'https://github.com/FreeRADIUS/freeradius-server',
+                       description: 'URL of git repository where the source tree can be found',
+                       trim: true
+               ),
+               string(
+                       name: 'branch',
+                       defaultValue: default_branch,
+                       description: 'Name of the git branch the packages are built from',
+                       trim: true
+               ),
+               string(
+                       name: 'jdbranch',
+                       defaultValue: default_branch,
+                       description: 'Branch to use to get Jenkinsfile and Docker files from',
+                       trim: true
+               ),
+               text(
+                       name: 'platforms',
+                       defaultValue: '''ubuntu14
+ubuntu16
+ubuntu18
+debian8
+debian9
+debian10
+centos7
+centos8''',
+                       description: 'List of operating systems to build packages for'
+               ),
+               string(
+                       name: 'package_version',
+                       defaultValue: '',
+                       description: 'Version number used in the built packages, e.g. "4.0.1"',
+                       trim: true
+               ),
+               string(
+                       name: 'package_release',
+                       defaultValue: '1',
+                       description: 'Release suffix used in the built packages, e.g. "2" would create "4.0.1-2". Will use "1" if not set.',
+                       trim: true
+               ),
+               booleanParam(
+                       name: 'use_commit',
+                       defaultValue: true,
+                       description: 'If enabled, uses the git commit number in the package version, e.g. 4.0.1+GIT-1 (otherwise 4.0.1-1).'
+               )
+       ])
+])
+
+
+/*
+ *  Given the provided parameters, build packages as specified and then archive them.
+ */
+
+node {
+       cleanWs(patterns: [[pattern: '**/*.deb , **/*.changes , **/*.buildinfo , **/*.rpm', type: 'INCLUDE']])
+
+       def server_dir = "freeradius-server"
+
+       checkout([
+               $class: 'GitSCM',
+               userRemoteConfigs: [
+                       [url: params.source]
+               ],
+               branches: [
+                       [name: params.jdbranch]
+               ],
+               doGenerateSubmoduleConfigurations: false,
+               extensions: [
+                       [$class: 'RelativeTargetDirectory',
+                               relativeTargetDir: server_dir
+                       ],
+                       [$class: 'CloneOption',
+                               depth: 0,
+                               noTags: false,
+                               reference: '',
+                               shallow: false
+                       ]
+               ],
+               submoduleCfg: []
+       ])
+
+
+       def fr = load server_dir + "/scripts/jenkins/Jenkinsfile.defs"
+       fr.genBuildNumber(server_dir, "build-number")
+
+       def build_opts = [:]
+       build_opts.platforms = params.platforms.trim().split()
+       build_opts.source = params.source
+       build_opts.branch = params.branch
+       build_opts.package_version = params.package_version
+       build_opts.package_release = params.package_release
+       build_opts.use_commit = params.use_commit
+       build_opts.server_dir = server_dir
+
+       parallel fr.buildClosures(build_opts)
+
+       archiveArtifacts artifacts: artifacts, onlyIfSuccessful: true
+       cleanWs()
+}