diff --git a/Jenkinsfile b/Jenkinsfile index 81f7c8156..757729e33 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,18 +1,71 @@ -#!/usr/bin/env groovy - -def alpineStaticTask(distro, platform) { - def myNode = { - node ('linux-build') { - checkout scm - def runtime = docker.image("ztbuild/${distro}-${platform}:latest") - runtime.inside { - sh 'make -j8 ZT_STATIC=1 all' - sh "mv zerotier-one zerotier-one-static-${platform}" - archiveArtifacts artifacts: 'zerotier-one-*', fingerprint: true, onlyIfSuccessful: true +pipeline { + options { + disableConcurrentBuilds() + preserveStashes(buildCount: 10) + timestamps() + } + parameters { + booleanParam(name: "BUILD_ALL", defaultValue: false, description: "Build all supported platform/architecture combos. Defaults to x86/x64 only") + } + + agent none + + stages { + stage ("Build") { + steps { + script { + def tasks = [:] + tasks << buildStaticBinaries() + tasks << buildDebianNative() + tasks << buildCentosNative() + + parallel tasks + } + } + } + stage ("Package Static") { + steps { + script { + parallel packageStatic() + } } } } - return myNode +} + +def buildStaticBinaries() { + def tasks = [:] + def dist = ["alpine"] + def archs = [] + if (params.BUILD_ALL == true) { + archs = ["arm64", "amd64", "i386", "armhf", "armel", "ppc64le", "s390x"] + } else { + archs = ["amd64", "i386"] + } + + tasks << getTasks(dist, archs, { distro, platform -> + def myNode = { + node ('linux-build') { + dir ("build") { + checkout scm + } + sh "echo ${distro}-${platform}" + def runtime = docker.image("ztbuild/${distro}-${platform}:latest") + runtime.inside { + dir("build") { + sh 'make -j8 ZT_STATIC=1 all' + sh "file ./zerotier-one" + sh "mv zerotier-one zerotier-one-static-${platform}" + stash includes: 'zerotier-one-static-*', name: "static-${platform}" + } + cleanWs deleteDirs: true, disableDeferredWipeout: true, notFailBuild: true + } + } + } + return myNode + }) + + return tasks } def getTasks(axisDistro, axisPlatform, task) { @@ -27,25 +80,286 @@ def getTasks(axisDistro, axisPlatform, task) { return tasks } -pipeline { - options { - disableConcurrentBuilds() +def packageStatic() { + def tasks = [:] + + def centos6 = ["centos6"] + def centos6Arch = ["i386", "amd64"] + tasks << getTasks(centos6, centos6Arch, { distro, arch -> + def myNode = { + node ('linux-build') { + dir ("build") { + checkout scm + } + def runtime = docker.image("ztbuild/${distro}-${arch}:latest") + runtime.inside { + dir("build") { + unstash "static-${arch}" + sh "mv zerotier-one-static-${arch} zerotier-one && chmod +x zerotier-one" + sh "make redhat" + sh "mkdir -p ${distro}" + sh "cp -av `find ~/rpmbuild/ -type f -name \"*.rpm\"` ${distro}/" + archiveArtifacts artifacts: "${distro}/*.rpm", onlyIfSuccessful: true + } + } + cleanWs deleteDirs: true, disableDeferredWipeout: true, notFailBuild: true + } + } + return myNode + }) + + def centos7 = ["centos7"] + def centos7Arch = ["i386"] + tasks << getTasks(centos7, centos7Arch, { distro, arch -> + def myNode = { + node ('linux-build') { + dir ("build") { + checkout scm + } + def runtime = docker.image("ztbuild/${distro}-${arch}:latest") + runtime.inside { + dir("build") { + unstash "static-${arch}" + sh "mv zerotier-one-static-${arch} zerotier-one && chmod +x zerotier-one" + sh "make redhat" + sh "mkdir -p ${distro}" + sh "cp -av `find ~/rpmbuild/ -type f -name \"*.rpm\"` ${distro}/" + archiveArtifacts artifacts: "${distro}/*.rpm", onlyIfSuccessful: true + } + } + cleanWs deleteDirs: true, disableDeferredWipeout: true, notFailBuild: true + } + } + return myNode + }) + + if (params.BUILD_ALL == true) { + def clefos7 = ["clefos"] + def clefos7Arch = ["s390x"] + tasks << getTasks(clefos7, clefos7Arch, { distro, arch -> + def myNode = { + node ('linux-build') { + dir ("build") { + checkout scm + } + def runtime = docker.image("ztbuild/${distro}-${arch}:latest") + runtime.inside { + dir("build/") { + unstash "static-${arch}" + sh "mv zerotier-one-static-${arch} zerotier-one && chmod +x zerotier-one" + sh "make redhat" + sh "mkdir -p ${distro}" + sh "cp -av `find ~/rpmbuild/ -type f -name \"*.rpm\"` ${distro}/" + archiveArtifacts artifacts: "${distro}/*.rpm", onlyIfSuccessful: true + } + } + cleanWs deleteDirs: true, disableDeferredWipeout: true, notFailBuild: true + } + } + return myNode + }) + } + + def debianJessie = ["debian-jessie"] + def debianJessieArchs = [] + if (params.BUILD_ALL == true) { + debianJessieArch = ["armhf", "armel", "amd64", "i386"] + } else { + debianJessieArch = ["amd64", "i386"] + } + tasks << getTasks(debianJessie, debianJessieArch, { distro, arch -> + def myNode = { + node ('linux-build') { + dir ("build") { + checkout scm + } + def runtime = docker.image("ztbuild/${distro}-${arch}:latest") + runtime.inside { + sh "ls -la ." + dir('build/') { + sh "ls -la ." + unstash "static-${arch}" + sh "pwd" + sh "mv zerotier-one-static-${arch} zerotier-one && chmod +x zerotier-one && file ./zerotier-one" + sh "mv -f debian/rules.static debian/rules" + sh "make debian" + } + sh "mkdir -p ${distro}" + sh "mv *.deb ${distro}" + archiveArtifacts artifacts: "${distro}/*.deb", onlyIfSuccessful: true + } + cleanWs deleteDirs: true, disableDeferredWipeout: true, notFailBuild: true + } + } + return myNode + }) + + def ubuntuTrusty = ["ubuntu-trusty"] + def ubuntuTrustyArch = [] + if (params.BUILD_ALL == true) { + ubuntuTrustyArch = ["i386", "amd64", "armhf", "arm64", "ppc64le"] + } else { + ubuntuTrustyArch = ["i386", "amd64"] + } + tasks << getTasks(ubuntuTrusty, ubuntuTrustyArch, { distro, arch -> + def myNode = { + node ('linux-build') { + dir ("build") { + checkout scm + } + def runtime = docker.image("ztbuild/${distro}-${arch}:latest") + runtime.inside { + sh "ls -la ." + dir('build/') { + sh "ls -la ." + unstash "static-${arch}" + sh "pwd" + sh "mv zerotier-one-static-${arch} zerotier-one && chmod +x zerotier-one && file ./zerotier-one" + sh "mv -f debian/rules.static debian/rules" + sh "make debian" + } + sh "mkdir -p ${distro}" + sh "mv *.deb ${distro}" + archiveArtifacts artifacts: "${distro}/*.deb", onlyIfSuccessful: true + } + cleanWs deleteDirs: true, disableDeferredWipeout: true, notFailBuild: true + } + } + return myNode + }) + + def debianWheezy = ["debian-wheezy"] + def debianWheezyArchs = [] + if (params.BUILD_ALL == true) { + debianWheezyArchs = ["armhf", "armel", "amd64", "i386"] + } else { + debianWheezyArchs = ["amd64", "i386"] + } + tasks << getTasks(debianJessie, debianJessieArch, { distro, arch -> + def myNode = { + node ('linux-build') { + dir ("build") { + checkout scm + } + def runtime = docker.image("ztbuild/${distro}-${arch}:latest") + runtime.inside { + dir('build/') { + unstash "static-${arch}" + sh "mv zerotier-one-static-${arch} zerotier-one && chmod +x zerotier-one && file ./zerotier-one" + sh "mv -f debian/rules.wheezy.static debian/rules" + sh "mv -f debian/control.wheezy debian/control" + sh "make debian" + } + sh "mkdir -p ${distro}" + sh "mv *.deb ${distro}" + archiveArtifacts artifacts: "${distro}/*.deb", onlyIfSuccessful: true + } + cleanWs deleteDirs: true, disableDeferredWipeout: true, notFailBuild: true + } + } + return myNode + }) + + return tasks +} + +def buildDebianNative() { + def tasks = [:] + def buster = ["debian-buster", "debian-stretch", "debian-bullseye", "debian-sid"] + def busterArchs = [] + if (params.BUILD_ALL) { + busterArchs = ["s390x", "ppc64le", "i386", "armhf", "armel", "arm64", "amd64"] + } else { + busterArchs = ["amd64", "i386"] } - agent none - - stages { - stage ("Static Build") { - steps { - script { - def dist = ["alpine"] - def archs = ["aarch64", "amd64", "i386", "armhf", "armel", "ppc64le", "s390x"] - parallel getTasks(dist, archs, this.&alpineStaticTask) + def build = { distro, arch -> + def myNode = { + node ('linux-build') { + dir ("build") { + checkout scm + } + def runtime = docker.image("ztbuild/${distro}-${arch}:latest") + runtime.inside { + dir("build") { + sh 'make debian' + } + sh "mkdir -p ${distro}" + sh "mv *.deb ${distro}" + archiveArtifacts artifacts: "${distro}/*.deb", onlyIfSuccessful: true + cleanWs deleteDirs: true, disableDeferredWipeout: true, notFailBuild: true } } } + return myNode } + + tasks << getTasks(buster, busterArchs, build) + + // bash is broken when running under QEMU-s390x on Xenial + def xenial = ["ubuntu-xenial"] + def xenialArchs = [] + if (params.BUILD_ALL == true) { + xenialArchs = ["i386", "amd64", "armhf", "arm64", "ppc64le"] + } else { + xenialArchs = ["i386", "amd64"] + } + tasks << getTasks(xenial, xenialArchs, build) + + def ubuntu = ["ubuntu-bionic", "ubuntu-eoan"] + def ubuntuArchs = [] + if (params.BUILD_ALL == true) { + ubuntuArchs = ["i386", "amd64", "armhf", "arm64", "ppc64le", "s390x"] + } else { + ubuntuArchs = ["i386", "amd64"] + } + tasks << getTasks(ubuntu, ubuntuArchs, build) + + def kali = ["kali-rolling"] + def kaliArchs = ["amd64"] + tasks << getTasks(kali, kaliArchs, build) + + return tasks } - -mattermostSend color: "#00ff00", message: "${env.JOB_NAME} #${env.BUILD_NUMBER} Complete (<${env.BUILD_URL}|Show More...>)" +def buildCentosNative() { + def tasks = [:] + + def build = { distro, arch -> + def myNode = { + node ('linux-build') { + dir ("build") { + checkout scm + } + def runtime = docker.image("ztbuild/${distro}-${arch}:latest") + runtime.inside { + dir("build") { + sh 'make -j4' + sh 'make redhat' + sh "mkdir -p ${distro}" + sh "cp -av `find ~/rpmbuild/ -type f -name \"*.rpm\"` ${distro}/" + archiveArtifacts artifacts: "${distro}/*.rpm", onlyIfSuccessful: true + } + + cleanWs deleteDirs: true, disableDeferredWipeout: true, notFailBuild: true + } + } + } + return myNode + } + + def centos8 = ["centos8"] + def centos8Archs = [] + if (params.BUILD_ALL == true) { + centos8Archs = ["amd64", "arm64", "ppc64le"] + } else { + centos8Archs = ["amd64"] + } + tasks << getTasks(centos8, centos8Archs, build) + + def centos7 = ["centos7"] + def centos7Archs = ["amd64"] + tasks << getTasks(centos7, centos7Archs, build) + + return tasks +}