mirror of
https://github.com/vyos/vyos-build.git
synced 2025-10-01 20:28:40 +02:00
208 lines
9.1 KiB
Groovy
208 lines
9.1 KiB
Groovy
#!/usr/bin/env groovy
|
|
// Copyright (C) 2019-2021 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
|
|
|
|
// Using a version specifier library, use 'current' branch. The underscore (_)
|
|
// is not a typo! You need this underscore if the line immediately after the
|
|
// @Library annotation is not an import statement!
|
|
@Library('vyos-build@current')_
|
|
setDescription()
|
|
|
|
node('Docker') {
|
|
stage('Setup Container') {
|
|
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.
|
|
if (isPullRequest())
|
|
branchName = env.CHANGE_TARGET.toLowerCase()
|
|
if (branchName.equals('master'))
|
|
branchName = 'current'
|
|
|
|
env.DOCKER_IMAGE = 'vyos/vyos-build:' + branchName
|
|
|
|
// Get the current UID and GID from the jenkins agent to allow use of the same UID inside Docker
|
|
env.USR_ID = sh(returnStdout: true, script: 'id -u').toString().trim()
|
|
env.GRP_ID = sh(returnStdout: true, script: 'id -g').toString().trim()
|
|
env.DOCKER_ARGS = '--privileged --sysctl net.ipv6.conf.lo.disable_ipv6=0 -e GOSU_UID=' + env.USR_ID + ' -e GOSU_GID=' + env.GRP_ID
|
|
env.BASE_VERSION = '1.4-rolling-'
|
|
}
|
|
}
|
|
}
|
|
|
|
pipeline {
|
|
agent {
|
|
docker {
|
|
label "Docker"
|
|
args "${env.DOCKER_ARGS}"
|
|
image "${env.DOCKER_IMAGE}"
|
|
alwaysPull true
|
|
reuseNode true
|
|
}
|
|
}
|
|
triggers {
|
|
cron('H 3 * * *')
|
|
}
|
|
parameters {
|
|
string(name: 'BUILD_BY', defaultValue: 'autobuild@vyos.net', description: 'Builder identifier (e.g. jrandomhacker@example.net)')
|
|
string(name: 'BUILD_VERSION', defaultValue: env.BASE_VERSION + 'ISO8601-TIMESTAMP', description: 'Version number (release builds only)')
|
|
booleanParam(name: 'BUILD_PUBLISH', defaultValue: true, description: 'Publish this build to downloads.vyos.io and AWS S3')
|
|
booleanParam(name: 'BUILD_SMOKETESTS', defaultValue: true, description: 'Include Smoketests in ISO image')
|
|
booleanParam(name: 'BUILD_SNAPSHOT', defaultValue: false, description: 'Upload image to AWS S3 snapshot bucket')
|
|
}
|
|
options {
|
|
disableConcurrentBuilds()
|
|
timeout(time: 240, unit: 'MINUTES')
|
|
timestamps()
|
|
buildDiscarder(logRotator(numToKeepStr: '20'))
|
|
}
|
|
stages {
|
|
stage('Build ISO') {
|
|
when {
|
|
beforeOptions true
|
|
beforeAgent true
|
|
// Only run ISO image build process of explicit user request or
|
|
// once a night triggered by the timer.
|
|
anyOf {
|
|
triggeredBy 'TimerTrigger'
|
|
triggeredBy cause: "UserIdCause"
|
|
}
|
|
}
|
|
steps {
|
|
script {
|
|
// 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])
|
|
|
|
def CUSTOM_PACKAGES = ''
|
|
if (params.BUILD_SMOKETESTS)
|
|
CUSTOM_PACKAGES = '--custom-package vyos-1x-smoketest'
|
|
|
|
def VYOS_VERSION = params.BUILD_BY
|
|
if (params.BUILD_VERSION == env.BASE_VERSION + 'ISO8601-TIMESTAMP')
|
|
VYOS_VERSION = env.BASE_VERSION + sh(returnStdout: true, script: 'date -u +%Y%m%d%H%M').toString().trim()
|
|
|
|
sh """
|
|
./configure \
|
|
--build-by "${params.BUILD_BY}" \
|
|
--debian-mirror http://deb.debian.org/debian/ \
|
|
--build-type release \
|
|
--version "${VYOS_VERSION}" ${CUSTOM_PACKAGES}
|
|
sudo make iso
|
|
"""
|
|
|
|
if (fileExists('build/live-image-amd64.hybrid.iso') == false) {
|
|
error('ISO build error')
|
|
}
|
|
}
|
|
}
|
|
}
|
|
stage('Test') {
|
|
when {
|
|
expression { return params.BUILD_SMOKETESTS }
|
|
}
|
|
parallel {
|
|
stage('Smoketests') {
|
|
when {
|
|
expression { fileExists 'build/live-image-amd64.hybrid.iso' }
|
|
}
|
|
steps {
|
|
sh "sudo make test"
|
|
}
|
|
}
|
|
stage('Smoketests with vyos-configd and arbitrary config loader') {
|
|
when {
|
|
expression { fileExists 'build/live-image-amd64.hybrid.iso' }
|
|
}
|
|
steps {
|
|
sh "sudo make testc"
|
|
}
|
|
}
|
|
stage('Smoketests for RAID-1 system installation') {
|
|
when {
|
|
expression { fileExists 'build/live-image-amd64.hybrid.iso' }
|
|
}
|
|
steps {
|
|
sh "sudo make testraid"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
post {
|
|
success {
|
|
script {
|
|
// only deploy ISO if build from official repository
|
|
if (isCustomBuild())
|
|
return
|
|
|
|
// only deploy ISO if requested via parameter
|
|
if (! params.BUILD_PUBLISH)
|
|
return
|
|
|
|
files = findFiles(glob: 'build/vyos*.iso')
|
|
// Publish ISO image to daily builds bucket
|
|
if (files) {
|
|
// Publish ISO image to snapshot bucket
|
|
if (files && params.BUILD_SNAPSHOT) {
|
|
withAWS(region: 'us-east-1', credentials: 's3-vyos-downloads-rolling-rw') {
|
|
s3Upload(bucket: 's3-us.vyos.io', path: 'snapshot/' + params.BUILD_VERSION + '/', workingDir: 'build', includePathPattern: 'vyos*.iso',
|
|
cacheControl: "public, max-age=2592000")
|
|
}
|
|
} else {
|
|
// Publish build result to AWS S3 rolling bucket
|
|
withAWS(region: 'us-east-1', credentials: 's3-vyos-downloads-rolling-rw') {
|
|
s3Upload(bucket: 's3-us.vyos.io', path: 'rolling/' + getGitBranchName() + '/',
|
|
workingDir: 'build', includePathPattern: 'vyos*.iso')
|
|
s3Copy(fromBucket: 's3-us.vyos.io', fromPath: 'rolling/' + getGitBranchName() + '/' + files[0].name,
|
|
toBucket: 's3-us.vyos.io', toPath: 'rolling/' + getGitBranchName() + '/vyos-rolling-latest.iso')
|
|
}
|
|
}
|
|
|
|
// Trigger GitHub action which will re-build the static community website which
|
|
// also holds the AWS download links to the generated ISO images
|
|
withCredentials([string(credentialsId: 'GitHub-API-Token', variable: 'TOKEN')]) {
|
|
sh '''
|
|
curl -X POST --header "Accept: application/vnd.github.v3+json" \
|
|
--header "authorization: Bearer $TOKEN" --data '{"ref": "production"}' \
|
|
https://api.github.com/repos/vyos/community.vyos.net/actions/workflows/main.yml/dispatches
|
|
'''
|
|
}
|
|
}
|
|
|
|
// Publish ISO image to snapshot bucket
|
|
if (files && params.BUILD_SNAPSHOT) {
|
|
withAWS(region: 'us-east-1', credentials: 's3-vyos-downloads-rolling-rw') {
|
|
s3Upload(bucket: 's3-us.vyos.io', path: 'snapshot/',
|
|
workingDir: 'build', includePathPattern: 'vyos*.iso')
|
|
}
|
|
}
|
|
}
|
|
}
|
|
failure {
|
|
archiveArtifacts artifacts: '**/build/vyos-*.iso, **/build/vyos-*.qcow2',
|
|
allowEmptyArchive: true
|
|
}
|
|
cleanup {
|
|
echo 'One way or another, I have finished'
|
|
// the 'build' directory got elevated permissions during the build
|
|
// cdjust permissions so it can be cleaned up by the regular user
|
|
sh 'sudo make purge'
|
|
deleteDir() /* cleanup our workspace */
|
|
}
|
|
}
|
|
}
|