+++ /dev/null
-/*
- * 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()
-}
--- /dev/null
+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()
+}
-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
* 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() {
* 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',
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'
}
}
* 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
--- /dev/null
+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()
+}