summaryrefslogtreecommitdiff
path: root/Jenkinsfile
diff options
context:
space:
mode:
authorChristian Poessinger <christian@poessinger.com>2019-09-22 09:02:17 +0200
committerChristian Poessinger <christian@poessinger.com>2019-09-22 13:58:48 +0200
commit2b9c84594a693c66b949183a25cc32dfcdee72e1 (patch)
treea0a9781511ad146c2f15b4d5dd46ebeeaec1d009 /Jenkinsfile
parentf6838cb7a625dfb78af50357492a3569eba1e235 (diff)
downloadvyos-1x-2b9c84594a693c66b949183a25cc32dfcdee72e1.tar.gz
vyos-1x-2b9c84594a693c66b949183a25cc32dfcdee72e1.zip
Jenkins: ease Pipeline
vyos-1x is a Debian package with architecture all. This means we only have to build it once as it can run on any other architecture - that's what Python is made for.
Diffstat (limited to 'Jenkinsfile')
-rw-r--r--Jenkinsfile263
1 files changed, 147 insertions, 116 deletions
diff --git a/Jenkinsfile b/Jenkinsfile
index 78112ce63..c48136b34 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -1,131 +1,162 @@
-pipeline {
- agent none
- stages {
- stage('build-package') {
- parallel {
- stage('Build package amd64') {
- agent {
- docker {
- label 'jessie-amd64'
- args '--privileged --sysctl net.ipv6.conf.lo.disable_ipv6=0 -e GOSU_UID=1006 -e GOSU_GID=1006 -v /tmp:/tmp'
- image 'vyos/vyos-build:current'
- }
+// Copyright (C) 2019 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/>.
+
+@NonCPS
+
+def getGitBranchName() {
+ def branch = scm.branches[0].name
+ return branch.split('/')[-1]
+}
+
+def getGitRepoURL() {
+ return scm.userRemoteConfigs[0].url
+}
+
+// Returns true if this is a custom build launched on any project fork,
+// returns false if this is build from git@github.com:vyos/env.JOB_NAME
+// env.JOB_NAME is e.g. vyos-build or vyos-1x and so on ....
+def isCustomBuild() {
+ // GitHub organisation base URL
+ def gitURI = 'git@github.com:vyos/' + env.JOB_NAME
+ def httpURI = 'https://github.com/vyos' + env.JOB_NAME
+
+ return ! ((getGitRepoURL() == gitURI) || (getGitRepoURL() == httpURI))
+}
+
+def setDescription() {
+ def item = Jenkins.instance.getItemByFullName(env.JOB_NAME)
+
+ // build up the main description text
+ def description = ""
+ description += "<h2>Build VyOS ISO image</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()
+}
- }
- steps {
- sh '''#!/bin/bash
-git clone --single-branch --branch $GIT_BRANCH $GIT_URL $BUILD_NUMBER
-cd $BUILD_NUMBER
-sudo pip3 uninstall vyos -y || true
-sudo pip3 install -r test-requirements.txt
-python3 -m "pylint" src -r n --msg-template="{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}" > pylint-report.txt || true
-make test
-sudo apt-get -o Acquire::Check-Valid-Until=false update
-sudo mk-build-deps -i -r -t \'apt-get --no-install-recommends -yq\' debian/control
-dpkg-buildpackage -b -us -uc -tc
-mkdir -p /tmp/$GIT_BRANCH/packages/script
-mv ../*.deb /tmp/$GIT_BRANCH/packages/'''
- }
+/* Only keep the 10 most recent builds. */
+def projectProperties = [
+ [$class: 'BuildDiscarderProperty',strategy: [$class: 'LogRotator', numToKeepStr: '1']],
+]
+
+properties(projectProperties)
+setDescription()
+
+pipeline {
+ agent {
+ docker {
+ label 'Docker'
+ args '--sysctl net.ipv6.conf.lo.disable_ipv6=0 -e GOSU_UID=1006 -e GOSU_GID=1006'
+ image 'vyos/vyos-build:current'
}
- stage('Build package armhf') {
- agent {
- docker {
- label 'jessie-amd64'
- image 'vyos-build-armhf:current'
- args '--privileged --sysctl net.ipv6.conf.lo.disable_ipv6=0 -e GOSU_UID=1006 -e GOSU_GID=1006 -v /tmp:/tmp'
+ }
+ options {
+ disableConcurrentBuilds()
+ skipDefaultCheckout()
+ timeout(time: 30, unit: 'MINUTES')
+ timestamps()
+ }
+ stages {
+ stage('Fetch') {
+ steps {
+ script {
+ dir('build') {
+ git branch: getGitBranchName(), url: getGitRepoURL()
+ }
+ }
}
-
- }
- steps {
- sh '''#!/bin/bash
-git clone --single-branch --branch $GIT_BRANCH $GIT_URL $BUILD_NUMBER
-cd $BUILD_NUMBER
-sudo pip3 uninstall vyos -y || true
-sudo pip3 install -r test-requirements.txt
-python3 -m "pylint" src -r n --msg-template="{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}" > pylint-report.txt || true
-make test
-sudo apt-get -o Acquire::Check-Valid-Until=false update
-sudo mk-build-deps -i -r -t \'apt-get --no-install-recommends -yq\' debian/control
-dpkg-buildpackage -b -us -uc -tc
-mkdir -p /tmp/$GIT_BRANCH/packages/script
-mv ../*.deb /tmp/$GIT_BRANCH/packages/'''
- }
}
- stage('Build package arm64') {
- agent {
- docker {
- label 'jessie-amd64'
- args '--privileged --sysctl net.ipv6.conf.lo.disable_ipv6=0 -e GOSU_UID=1006 -e GOSU_GID=1006 -v /tmp:/tmp'
- image 'vyos-build-arm64:current'
+ stage('Build') {
+ steps {
+ script {
+ dir('build') {
+ sh """
+ #!/bin/bash
+ sudo apt-get -o Acquire::Check-Valid-Until=false update
+ sudo mk-build-deps -i -r -t \'apt-get --no-install-recommends -yq\' debian/control
+ dpkg-buildpackage -b -us -uc -tc
+ """
+ }
+ }
}
-
- }
- steps {
- sh '''#!/bin/bash
-git clone --single-branch --branch $GIT_BRANCH $GIT_URL $BUILD_NUMBER
-cd $BUILD_NUMBER
-sudo pip3 uninstall vyos -y || true
-sudo pip3 install -r test-requirements.txt
-python3 -m "pylint" src -r n --msg-template="{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}" > pylint-report.txt || true
-make test
-sudo apt-get -o Acquire::Check-Valid-Until=false update
-sudo mk-build-deps -i -r -t \'apt-get --no-install-recommends -yq\' debian/control
-dpkg-buildpackage -b -us -uc -tc
-mkdir -p /tmp/$GIT_BRANCH/packages/script
-mv ../*.deb /tmp/$GIT_BRANCH/packages/'''
- }
}
- }
}
- stage('Deploy packages') {
- agent {
- node {
- label 'jessie-amd64'
+ post {
+ cleanup {
+ deleteDir()
}
+ success {
+ script {
+ // archive *.deb artifact on custom builds, deploy to repo otherwise
+ if ( isCustomBuild()) {
+ archiveArtifacts artifacts: '*.deb', fingerprint: 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!
- }
- steps {
- sh '''#!/bin/bash
-cd /tmp/$GIT_BRANCH/packages/script
-/var/lib/vyos-build/pkg-build.sh $GIT_BRANCH'''
- }
- }
- stage('Cleanup') {
- parallel {
- stage('Cleanup amd64') {
- agent {
- node {
- label 'jessie-amd64'
- }
+ def VYOS_REPO_PATH = '/home/sentrium/web/dev.packages.vyos.net/public_html/repositories/' + getGitBranchName() + '/'
+ if (getGitBranchName() != "equuleus")
+ VYOS_REPO_PATH += 'vyos/'
- }
- steps {
- cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, cleanupMatrixParent: true, deleteDirs: true, disableDeferredWipeout: true)
- }
- }
- stage('Cleanup armhf') {
- agent {
- node {
- label 'jessie-amd64'
- }
+ def SSH_OPTS = '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=ERROR'
+ def SSH_REMOTE = 'khagen@10.217.48.113'
- }
- steps {
- cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, cleanupMatrixParent: true, deleteDirs: true, disableDeferredWipeout: true)
- }
- }
- stage('Cleanup arm64') {
- agent {
- node {
- label 'jessie-amd64'
- }
+ echo "Uploading package(s) and updating package(s) in the repository ..."
+
+ files = findFiles(glob: '*.deb')
+ files.each { PACKAGE ->
+ def RELEASE = getGitBranchName()
+ def ARCH = sh(returnStdout: true, script: "dpkg-deb -f ${pkg} Architecture").trim()
+ def SUBSTRING = sh(returnStdout: true, script: "dpkg-deb -f ${pkg} Package").trim()
+ def SSH_DIR = '~/VyOS/' + RELEASE + '/' + ARCH
- }
- steps {
- cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, cleanupMatrixParent: true, deleteDirs: true, disableDeferredWipeout: true)
- }
+ // No need to explicitly check the return code. The pipeline
+ // will fail if sh returns a non 0 exit code
+ sh """
+ ssh ${SSH_OPTS} ${SSH_REMOTE} -t "bash --login -c 'mkdir -p ${SSH_DIR}'"
+ """
+ sh """
+ scp ${SSH_OPTS} ${PACKAGE} ${SSH_REMOTE}:${SSH_DIR}/
+ """
+ sh """
+ ssh ${SSH_OPTS} ${SSH_REMOTE} -t "uncron-add 'reprepro -v -b ${VYOS_REPO_PATH} -A ${ARCH} remove ${RELEASE} ${SUBSTRING}'"
+ """
+ sh """
+ ssh ${SSH_OPTS} ${SSH_REMOTE} -t "uncron-add 'reprepro -v -b ${VYOS_REPO_PATH} deleteunreferenced'"
+ """
+ sh """
+ ssh ${SSH_OPTS} ${SSH_REMOTE} -t "uncron-add 'reprepro -v -b ${VYOS_REPO_PATH} -A ${ARCH} includedeb ${RELEASE} ${SSH_DIR}/${PACKAGE}'"
+ """
+ }
+ }
+ }
+ }
}
- }
}
- }
}
+