Jenkins: lib: add programmable package build Pipeline

This commit is contained in:
Christian Poessinger 2020-06-20 17:30:12 +02:00
parent 7ab2724c33
commit b213775285
3 changed files with 160 additions and 146 deletions

View File

@ -14,151 +14,37 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
@NonCPS
/* Using a version specifier library, use 'current' branch */
// Using a version specifier library, use 'current' branch
@Library('vyos-build@current')
/* Only keep the 10 most recent builds. */
def projectProperties = [
[$class: 'BuildDiscarderProperty',strategy: [$class: 'LogRotator', numToKeepStr: '10']],
def pkgList = [
// pkg-libnftnl
['name': 'pkg-libnftnl',
'scmCommit': 'debian/1.1.7-1',
'scmUrl': 'https://salsa.debian.org/pkg-netfilter-team/pkg-libnftnl.git',
'buildCmd': 'dpkg-buildpackage -uc -us -tc -b'],
// pkg-nftables
['name': 'pkg-nftables',
'scmCommit': 'debian/0.9.6-1',
'scmUrl': 'https://salsa.debian.org/pkg-netfilter-team/pkg-nftables.git',
'buildCmd': '''sudo dpkg -i ../libnftnl*.deb;
sed -i "s/debhelper-compat.*/debhelper-compat (= 12),/" debian/control;
dpkg-buildpackage -uc -us -tc -b'''],
// pkg-conntrack-tools
['name': 'pkg-conntrack-tools',
'scmCommit': 'debian/1%1.4.6-1',
'scmUrl': 'https://salsa.debian.org/pkg-netfilter-team/pkg-conntrack-tools.git',
'buildCmd': 'dpkg-buildpackage -uc -us -tc -b'],
// pkg-conntrack-tools
['name': 'pkg-conntrack-tools',
'scmCommit': 'debian/1.0.8-1',
'scmUrl': 'https://salsa.debian.org/pkg-netfilter-team/pkg-libnetfilter-conntrack.git',
'buildCmd': '''sudo dpkg -i ../libnetfilter*.deb;
dpkg-buildpackage -uc -us -tc -b''']
]
properties(projectProperties)
setDescription()
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 {
BASE_DIR = "packages/netfilter/"
CHANGESET_DIR = "**/${env.BASE_DIR}*"
}
options {
disableConcurrentBuilds()
timeout(time: 60, unit: 'MINUTES')
timestamps()
}
stages {
stage('Fetch') {
when {
beforeOptions true
beforeAgent true
anyOf {
changeset "${env.CHANGESET_DIR}"
triggeredBy 'TimerTrigger'
triggeredBy cause: "UserIdCause"
}
}
steps {
script {
dir('build') {
checkout scm
}
}
}
}
stage('Git Clone') {
when {
changeset "${env.CHANGESET_DIR}"
}
steps {
dir(env.BASE_DIR + 'pkg-libnftnl') {
checkout([$class: 'GitSCM',
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'CleanCheckout']],
branches: [[name: 'debian/1.1.7-1' ]],
userRemoteConfigs: [[url: 'https://salsa.debian.org/pkg-netfilter-team/pkg-libnftnl.git']]])
}
dir(env.BASE_DIR + 'pkg-nftables') {
checkout([$class: 'GitSCM',
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'CleanCheckout']],
branches: [[name: 'debian/0.9.6-1' ]],
userRemoteConfigs: [[url: 'https://salsa.debian.org/pkg-netfilter-team/pkg-nftables.git']]])
}
dir(env.BASE_DIR + 'pkg-conntrack-tools') {
checkout([$class: 'GitSCM',
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'CleanCheckout']],
branches: [[name: 'debian/1%1.4.6-1' ]],
userRemoteConfigs: [[url: 'https://salsa.debian.org/pkg-netfilter-team/pkg-conntrack-tools.git']]])
}
dir(env.BASE_DIR + 'pkg-libnetfilter-conntrack') {
checkout([$class: 'GitSCM',
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'CleanCheckout']],
branches: [[name: 'debian/1.0.8-1' ]],
userRemoteConfigs: [[url: 'https://salsa.debian.org/pkg-netfilter-team/pkg-libnetfilter-conntrack.git']]])
}
}
}
stage('Build') {
when {
changeset "${env.CHANGESET_DIR}"
}
steps {
script {
dir(env.BASE_DIR + 'pkg-libnftnl') {
sh 'dpkg-buildpackage -uc -us -tc -b'
}
dir(env.BASE_DIR + 'pkg-nftables') {
sh """
# we need the newly generated library for this build
sudo dpkg -i ../libnftnl*.deb
# Debian debhelper-compat level 12 works, too and
# is available in buster
sed -i 's/debhelper-compat.*/debhelper-compat (= 12),/' debian/control
dpkg-buildpackage -uc -us -tc -b
"""
}
dir(env.BASE_DIR + 'pkg-libnetfilter-conntrack') {
sh 'dpkg-buildpackage -uc -us -tc -b'
}
dir(env.BASE_DIR + 'pkg-conntrack-tools') {
sh """
# we need the newly generated library for this build
sudo dpkg -i ../libnetfilter*.deb
dpkg-buildpackage -uc -us -tc -b
"""
}
}
}
}
}
post {
cleanup {
deleteDir()
}
success {
script {
// archive *.deb artifact on custom builds, deploy to repo otherwise
if ( isCustomBuild()) {
archiveArtifacts artifacts: '**/*.deb', allowEmptyArchive: true
}
}
}
}
}
buildPackage('Netfilter', pkgList)

124
vars/buildPackage.groovy Normal file
View File

@ -0,0 +1,124 @@
#!/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, pkgList) {
/* 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 = currentBuild.rawBuild.parent.definition.scriptPath.replace('Jenkinsfile', '')
CHANGESET_DIR = "**/${env.BASE_DIR}*"
}
options {
disableConcurrentBuilds()
timeout(time: 60, unit: 'MINUTES')
timestamps()
}
stages {
stage('Fetch Source') {
when {
beforeOptions true
beforeAgent true
anyOf {
changeset "${env.CHANGESET_DIR}"
triggeredBy 'TimerTrigger'
triggeredBy cause: "UserIdCause"
}
}
steps {
script {
checkout scm
pkgList.each { pkg ->
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 "${env.CHANGESET_DIR}"
triggeredBy 'TimerTrigger'
triggeredBy cause: "UserIdCause"
}
}
steps {
script {
pkgList.each { pkg ->
dir(pkg.name) {
sh pkg.buildCmd
}
}
}
}
}
}
post {
cleanup {
deleteDir()
}
success {
script {
if (isCustomBuild()) {
// archive *.deb artifact on custom builds, deploy to repo otherwise
archiveArtifacts artifacts: '**/*.deb', allowEmptyArchive: true
}
}
}
}
}
}

View File

@ -14,12 +14,16 @@
// 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 call(text = null) {
def item = Jenkins.instance.getItemByFullName(env.JOB_NAME)
// build up the main description text
def description = ""
description += "<h2>VyOS individual package build: " + getGitRepoName().replace('.git', '') + "</h2>"
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%;'>"