summaryrefslogtreecommitdiff
path: root/vars
diff options
context:
space:
mode:
Diffstat (limited to 'vars')
-rw-r--r--vars/README.md6
-rw-r--r--vars/buildPackage.groovy197
-rw-r--r--vars/getChangeSetPath.groovy25
-rw-r--r--vars/getGitBranchName.groovy21
-rw-r--r--vars/getGitRepoName.groovy20
-rw-r--r--vars/getGitRepoURL.groovy20
-rw-r--r--vars/getJenkinsfilePath.groovy24
-rw-r--r--vars/isCustomBuild.groovy26
-rw-r--r--vars/setDescription.groovy42
9 files changed, 381 insertions, 0 deletions
diff --git a/vars/README.md b/vars/README.md
new file mode 100644
index 00000000..ca2f821f
--- /dev/null
+++ b/vars/README.md
@@ -0,0 +1,6 @@
+# Jenkins Build Library
+
+Instead of writing the same code over and over again, place the common
+parts into a Jenkins Library which is then consumed by every individual
+build Job. This not only makes it less complex, it also increases
+maintainability by several magnitudes.
diff --git a/vars/buildPackage.groovy b/vars/buildPackage.groovy
new file mode 100644
index 00000000..edd854b7
--- /dev/null
+++ b/vars/buildPackage.groovy
@@ -0,0 +1,197 @@
+#!/usr/bin/env groovy
+
+// Copyright (C) 2020 VyOS maintainers and contributors
+//
+// This program is free software; you can redistribute it and/or modify
+// in order to easy exprort images built to "external" world
+// it under the terms of the GNU General Public License version 2 or later as
+// published by the Free Software Foundation.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+def call(description=null, pkgList=null, buildCmd=null) {
+ // - description: Arbitrary text to print on Jenkins Job Description
+ // instead of package name
+ // - pkgList: Multiple packages can be build at once in a single Pipeline run
+ // - buildCmd: replace default build command "dpkg-buildpackage -uc -us -tc -b"
+ // with this custom version
+
+ // Only keep the 10 most recent builds
+ def projectProperties = [
+ [$class: 'BuildDiscarderProperty',strategy: [$class: 'LogRotator', numToKeepStr: '10']],
+ ]
+
+ properties(projectProperties)
+ setDescription(description)
+
+ node('Docker') {
+ stage('Define Agent') {
+ script {
+ // create container name on demand
+ def branchName = getGitBranchName()
+ // Adjust PR target branch name so we can re-map it to the proper
+ // Docker image. CHANGE_ID is set only for pull requests, so it is
+ // safe to access the pullRequest global variable
+ if (env.CHANGE_ID) {
+ branchName = "${env.CHANGE_TARGET}".toLowerCase()
+ }
+ if (branchName.equals("master")) {
+ branchName = "current"
+ }
+ env.DOCKER_IMAGE = "vyos/vyos-build:" + branchName
+ }
+ }
+ }
+ pipeline {
+ agent {
+ docker {
+ args "--sysctl net.ipv6.conf.lo.disable_ipv6=0 -e GOSU_UID=1006 -e GOSU_GID=1006"
+ image "${env.DOCKER_IMAGE}"
+ alwaysPull true
+ }
+ }
+ environment {
+ // get relative directory path to Jenkinsfile
+ BASE_DIR = getJenkinsfilePath()
+ CHANGESET_DIR = getChangeSetPath()
+ DEBIAN_ARCH = sh(returnStdout: true, script: 'dpkg --print-architecture').trim()
+ }
+ options {
+ skipDefaultCheckout()
+ timeout(time: 60, unit: 'MINUTES')
+ timestamps()
+ }
+ stages {
+ stage('Fetch Source') {
+ steps {
+ script {
+ // package build must be done in "any" subdir. Without it the Debian build system
+ // is unable to generate the *.deb files in the sources parent directory, which
+ // will cause a "Permission denied" error.
+ dir ('build') {
+ // checkout git repository which hold 'Jenkinsfile'
+ checkout scm
+
+ // Display Git commit Id used with the Jenkinsfile on the Job "Build History" pane
+ def commitId = sh(returnStdout: true, script: 'git rev-parse --short=11 HEAD').trim()
+ currentBuild.description = sprintf('Git SHA1: %s', commitId[-11..-1])
+
+ if (pkgList) {
+ // Fetch individual package source code, but only if a URL is defined, this will
+ // let us reuse this script for packages like vyos-1x which ship a Jenkinfile in
+ // their repositories root folder.
+ pkgList.each { pkg ->
+ dir(env.BASE_DIR + pkg.name) {
+ checkout([$class: 'GitSCM',
+ doGenerateSubmoduleConfigurations: false,
+ extensions: [[$class: 'CleanCheckout']],
+ branches: [[name: pkg.scmCommit]],
+ userRemoteConfigs: [[url: pkg.scmUrl]]])
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ stage('Build Source') {
+ when {
+ beforeOptions true
+ beforeAgent true
+ anyOf {
+ changeset pattern: "${env.CHANGESET_DIR}"
+ triggeredBy 'TimerTrigger'
+ triggeredBy cause: "UserIdCause"
+ }
+ }
+ steps {
+ script {
+ // package build must be done in "any" subdir. Without it the Debian build system
+ // is unable to generate the *.deb files in the sources parent directory, which
+ // will cause a "Permission denied" error.
+ dir ('build') {
+ if (pkgList) {
+ pkgList.each { pkg ->
+ dir(env.BASE_DIR + pkg.name) {
+ sh pkg.buildCmd
+ }
+ }
+ } else if (buildCmd) {
+ sh buildCmd
+ } else {
+ sh "dpkg-buildpackage -uc -us -tc -b"
+ }
+ }
+ }
+ }
+ }
+ }
+ post {
+ cleanup {
+ deleteDir()
+ }
+ success {
+ script {
+ // package build must be done in "any" subdir. Without it the Debian build system
+ // is unable to generate the *.deb files in the sources parent directory, which
+ // will cause a "Permission denied" error.
+ def BIN_DIR = ''
+ if (env.BASE_DIR) {
+ BIN_DIR = 'build/' + env.BASE_DIR
+ }
+ dir (BIN_DIR) {
+ if (isCustomBuild()) {
+ // archive *.deb artifact on custom builds, deploy to repo otherwise
+ archiveArtifacts artifacts: '**/*.deb', allowEmptyArchive: true
+ } else {
+ // publish build result, using SSH-dev.packages.vyos.net Jenkins Credentials
+ sshagent(['SSH-dev.packages.vyos.net']) {
+ // build up some fancy groovy variables so we do not need to write/copy
+ // every option over and over again!
+ def RELEASE = getGitBranchName()
+ if (getGitBranchName() == "master") {
+ RELEASE = 'current'
+ }
+
+ def VYOS_REPO_PATH = '/home/sentrium/web/dev.packages.vyos.net/public_html/repositories/' + RELEASE + '/'
+ if (getGitBranchName() == "crux")
+ VYOS_REPO_PATH += 'vyos/'
+
+ def SSH_OPTS = '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=ERROR'
+ def SSH_REMOTE = 'khagen@10.217.48.113'
+
+ def SSH_DIR = '~/VyOS/' + RELEASE + '/' + env.DEBIAN_ARCH
+ def ARCH_OPT = ''
+ if (env.DEBIAN_ARCH != 'all')
+ ARCH_OPT = '-A ' + env.DEBIAN_ARCH
+
+ files = findFiles(glob: '*.deb')
+ if (files) {
+ echo "Uploading package(s) and updating package(s) in the repository ..."
+ files.each { FILE ->
+ def PKG = sh(returnStdout: true, script: "dpkg-deb -f ${FILE} Package").trim()
+ // No need to explicitly check the return code. The pipeline
+ // will fail if sh returns a noni-zero exit code
+ sh """
+ ssh ${SSH_OPTS} ${SSH_REMOTE} -t "bash --login -c 'mkdir -p ${SSH_DIR}'"
+ scp ${SSH_OPTS} ${FILE} ${SSH_REMOTE}:${SSH_DIR}/
+ ssh ${SSH_OPTS} ${SSH_REMOTE} -t "uncron-add 'reprepro -v -b ${VYOS_REPO_PATH} ${ARCH_OPT} remove ${RELEASE} ${PKG}'"
+ ssh ${SSH_OPTS} ${SSH_REMOTE} -t "uncron-add 'reprepro -v -b ${VYOS_REPO_PATH} deleteunreferenced'"
+ ssh ${SSH_OPTS} ${SSH_REMOTE} -t "uncron-add 'reprepro -v -b ${VYOS_REPO_PATH} ${ARCH_OPT} includedeb ${RELEASE} ${SSH_DIR}/${FILE}'"
+ """
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/vars/getChangeSetPath.groovy b/vars/getChangeSetPath.groovy
new file mode 100644
index 00000000..f046d7cc
--- /dev/null
+++ b/vars/getChangeSetPath.groovy
@@ -0,0 +1,25 @@
+#!/usr/bin/env groovy
+// Copyright (C) 2020 VyOS maintainers and contributors
+//
+// This program is free software; you can redistribute it and/or modify
+// in order to easy exprort images built to "external" world
+// it under the terms of the GNU General Public License version 2 or later as
+// published by the Free Software Foundation.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+def call() {
+ tmp = getJenkinsfilePath()
+ if (tmp)
+ tmp = "**/" + tmp + "*"
+ else
+ tmp = "**/*"
+ return tmp
+}
+
diff --git a/vars/getGitBranchName.groovy b/vars/getGitBranchName.groovy
new file mode 100644
index 00000000..133734da
--- /dev/null
+++ b/vars/getGitBranchName.groovy
@@ -0,0 +1,21 @@
+#!/usr/bin/env groovy
+// Copyright (C) 2020 VyOS maintainers and contributors
+//
+// This program is free software; you can redistribute it and/or modify
+// in order to easy exprort images built to "external" world
+// it under the terms of the GNU General Public License version 2 or later as
+// published by the Free Software Foundation.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+def call() {
+ def branch = scm.branches[0].name
+ return branch.split('/')[-1]
+}
+
diff --git a/vars/getGitRepoName.groovy b/vars/getGitRepoName.groovy
new file mode 100644
index 00000000..058e4ff5
--- /dev/null
+++ b/vars/getGitRepoName.groovy
@@ -0,0 +1,20 @@
+#!/usr/bin/env groovy
+// Copyright (C) 2020 VyOS maintainers and contributors
+//
+// This program is free software; you can redistribute it and/or modify
+// in order to easy exprort images built to "external" world
+// it under the terms of the GNU General Public License version 2 or later as
+// published by the Free Software Foundation.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+def call() {
+ return getGitRepoURL().split('/').last()
+}
+
diff --git a/vars/getGitRepoURL.groovy b/vars/getGitRepoURL.groovy
new file mode 100644
index 00000000..d36b48e6
--- /dev/null
+++ b/vars/getGitRepoURL.groovy
@@ -0,0 +1,20 @@
+#!/usr/bin/env groovy
+// Copyright (C) 2020 VyOS maintainers and contributors
+//
+// This program is free software; you can redistribute it and/or modify
+// in order to easy exprort images built to "external" world
+// it under the terms of the GNU General Public License version 2 or later as
+// published by the Free Software Foundation.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+def call() {
+ return scm.userRemoteConfigs[0].url
+}
+
diff --git a/vars/getJenkinsfilePath.groovy b/vars/getJenkinsfilePath.groovy
new file mode 100644
index 00000000..a6690f5e
--- /dev/null
+++ b/vars/getJenkinsfilePath.groovy
@@ -0,0 +1,24 @@
+#!/usr/bin/env groovy
+// Copyright (C) 2020 VyOS maintainers and contributors
+//
+// This program is free software; you can redistribute it and/or modify
+// in order to easy exprort images built to "external" world
+// it under the terms of the GNU General Public License version 2 or later as
+// published by the Free Software Foundation.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+def call() {
+ tmp = currentBuild.rawBuild.parent.definition.scriptPath.replace('Jenkinsfile', '')
+ if (tmp == null) {
+ tmp = ''
+ }
+ return tmp
+}
+
diff --git a/vars/isCustomBuild.groovy b/vars/isCustomBuild.groovy
new file mode 100644
index 00000000..301fdd42
--- /dev/null
+++ b/vars/isCustomBuild.groovy
@@ -0,0 +1,26 @@
+#!/usr/bin/env groovy
+// Copyright (C) 2020 VyOS maintainers and contributors
+//
+// This program is free software; you can redistribute it and/or modify
+// in order to easy exprort images built to "external" world
+// it under the terms of the GNU General Public License version 2 or later as
+// published by the Free Software Foundation.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+def call() {
+ // Returns true if this is a custom build launched on any project fork.
+ // Returns false if this is build from git@github.com:vyos/<reponame>.
+ // <reponame> can be e.g. vyos-1x.git or vyatta-op.git
+ // GitHub organisation base URL
+ def gitURI = 'git@github.com:vyos/' + getGitRepoName()
+ def httpURI = 'https://github.com/vyos/' + getGitRepoName()
+
+ return !((getGitRepoURL() == gitURI) || (getGitRepoURL() == httpURI)) || env.CHANGE_ID
+}
diff --git a/vars/setDescription.groovy b/vars/setDescription.groovy
new file mode 100644
index 00000000..683dc20c
--- /dev/null
+++ b/vars/setDescription.groovy
@@ -0,0 +1,42 @@
+#!/usr/bin/env groovy
+// Copyright (C) 2020 VyOS maintainers and contributors
+//
+// This program is free software; you can redistribute it and/or modify
+// in order to easy exprort images built to "external" world
+// it under the terms of the GNU General Public License version 2 or later as
+// published by the Free Software Foundation.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+def call(text = null) {
+ def item = Jenkins.instance.getItemByFullName(env.JOB_NAME)
+
+ // build up the main description text
+ def description = ""
+ if (text) {
+ description += "<h2>VyOS package build: " + text + "</h2>"
+ } else {
+ description += "<h2>VyOS package build: " + getGitRepoName().replace('.git', '') + "</h2>"
+ }
+
+ if (isCustomBuild()) {
+ description += "<p style='border: 3px dashed red; width: 50%;'>"
+ description += "<b>Build not started from official Git repository!</b><br>"
+ description += "<br>"
+ description += "Repository: <font face = 'courier'>" + getGitRepoURL() + "</font><br>"
+ description += "Branch: <font face = 'courier'>" + getGitBranchName() + "</font><br>"
+ description += "</p>"
+ } else {
+ description += "Sources taken from Git branch: <font face = 'courier'>" + getGitBranchName() + "</font><br>"
+ }
+
+ item.setDescription(description)
+ item.save()
+}
+