mirror of
				https://github.com/vyos/vyos-build.git
				synced 2025-10-01 20:28:40 +02:00 
			
		
		
		
	T6674: remove all references to Jenkins
This commit is contained in:
		
							parent
							
								
									3b95165b03
								
							
						
					
					
						commit
						38395e86d5
					
				
							
								
								
									
										32
									
								
								.github/workflows/check-scripts-executable.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								.github/workflows/check-scripts-executable.yml
									
									
									
									
										vendored
									
									
								
							| @ -1,32 +0,0 @@ | |||||||
| name: "Check for Jenkins build scripts has executable bit" |  | ||||||
| 
 |  | ||||||
| on: |  | ||||||
|   pull_request: |  | ||||||
|     branches: |  | ||||||
|       - current |  | ||||||
|       - circinus |  | ||||||
|       - sagitta |  | ||||||
|       - equuleus |  | ||||||
| 
 |  | ||||||
| permissions: |  | ||||||
|   contents: read |  | ||||||
| 
 |  | ||||||
| jobs: |  | ||||||
|   check-scripts-executable: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
| 
 |  | ||||||
|     steps: |  | ||||||
|       - uses: actions/checkout@v3 |  | ||||||
|         with: |  | ||||||
|           repository: ${{ github.repository }} |  | ||||||
|       - name: Checking scripts are executable |  | ||||||
|         run: | |  | ||||||
|           files=$(find packages/ -type f -name '*.py' -or -name '*.sh' -not -executable -print) |  | ||||||
|           if [[ -n $files ]]; then |  | ||||||
|             echo "Found files without executable bit:" |  | ||||||
|             for file in $files; do |  | ||||||
|               echo $file; |  | ||||||
|             done; |  | ||||||
|             exit 1; |  | ||||||
|           fi |  | ||||||
|         shell: bash |  | ||||||
| @ -40,7 +40,7 @@ task first. Once there is an entry in Phabricator, you should reference its id | |||||||
| in your commit message, as shown below: | in your commit message, as shown below: | ||||||
| 
 | 
 | ||||||
| * `ddclient: T1030: auto create runtime directories` | * `ddclient: T1030: auto create runtime directories` | ||||||
| * `Jenkins: add current Git commit ID to build description` | * `keepalived: T1234: do not autostart service, will be done by CLI` | ||||||
| 
 | 
 | ||||||
| If there is no [Phabricator](https://vyos.dev) reference in the | If there is no [Phabricator](https://vyos.dev) reference in the | ||||||
| commits of your pull request, we have to ask you to amend the commit message. | commits of your pull request, we have to ask you to amend the commit message. | ||||||
|  | |||||||
| @ -1,84 +0,0 @@ | |||||||
| #!/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() |  | ||||||
| 
 |  | ||||||
| pipeline { |  | ||||||
|     agent none |  | ||||||
|     environment { |  | ||||||
|         GIT_BRANCH_NAME = getGitBranchName() |  | ||||||
|     } |  | ||||||
|     options { |  | ||||||
|         disableConcurrentBuilds() |  | ||||||
|         timeout(time: 240, unit: 'MINUTES') |  | ||||||
|         timestamps() |  | ||||||
|         buildDiscarder(logRotator(numToKeepStr: '20')) |  | ||||||
|     } |  | ||||||
|     stages { |  | ||||||
|         stage('Build containers') { |  | ||||||
|             when { |  | ||||||
|                 beforeOptions true |  | ||||||
|                 beforeAgent true |  | ||||||
|                 // Only run ISO image build process of explicit user request or |  | ||||||
|                 // once a night triggered by the timer. |  | ||||||
|                 anyOf { |  | ||||||
|                     changeset pattern: "**/docker/*" |  | ||||||
|                     changeset pattern: "**/Jenkinsfile.docker" |  | ||||||
|                     triggeredBy cause: "UserIdCause" |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             parallel { |  | ||||||
|                 stage('x86_64') { |  | ||||||
|                     agent { |  | ||||||
|                         label "ec2_amd64" |  | ||||||
|                     } |  | ||||||
|                     steps { |  | ||||||
|                         script { |  | ||||||
|                             DOCKER_IMAGE_AMD64 = "vyos/vyos-build:" + env.GIT_BRANCH_NAME |  | ||||||
|                             sh "docker build --no-cache --tag ${DOCKER_IMAGE_AMD64} docker" |  | ||||||
|                             if (! isCustomBuild()) { |  | ||||||
|                                 withDockerRegistry([credentialsId: "DockerHub"]) { |  | ||||||
|                                     sh "docker push ${DOCKER_IMAGE_AMD64}" |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 stage('arm64') { |  | ||||||
|                     agent { |  | ||||||
|                         label "ec2_arm64" |  | ||||||
|                     } |  | ||||||
|                     steps { |  | ||||||
|                         script { |  | ||||||
|                             DOCKER_IMAGE_ARM64 = "vyos/vyos-build:" + env.GIT_BRANCH_NAME + "-arm64" |  | ||||||
|                             sh "docker build --no-cache --tag ${DOCKER_IMAGE_ARM64} --build-arg ARCH=arm64v8/ docker" |  | ||||||
|                             if (! isCustomBuild()) { |  | ||||||
|                                 withDockerRegistry([credentialsId: "DockerHub"]) { |  | ||||||
|                                     sh "docker push ${DOCKER_IMAGE_ARM64}" |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -40,7 +40,6 @@ There are several directories with their own purpose: | |||||||
|  * `scripts/`  Scripts that are used for the build process |  * `scripts/`  Scripts that are used for the build process | ||||||
|  * `tools/`    Scripts that are used for maintainer's tasks automation and other |  * `tools/`    Scripts that are used for maintainer's tasks automation and other | ||||||
|                purposes, but not during ISO build process |                purposes, but not during ISO build process | ||||||
|  * `vars/`     Jenkins Pipeline library for reusable functions |  | ||||||
| 
 | 
 | ||||||
| # Building VyOS | # Building VyOS | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -204,7 +204,6 @@ RUN wget https://salsa.debian.org/klausenbusk-guest/debootstrap/commit/a9a603b17 | |||||||
|     sudo dpkg -i ../debootstrap*.deb |     sudo dpkg -i ../debootstrap*.deb | ||||||
| 
 | 
 | ||||||
| # Packages needed for Linux Kernel | # Packages needed for Linux Kernel | ||||||
| # gnupg2 is required by Jenkins for the TAR verification |  | ||||||
| # cmake required by accel-ppp | # cmake required by accel-ppp | ||||||
| RUN apt-get update && apt-get install -y \ | RUN apt-get update && apt-get install -y \ | ||||||
|       cmake \ |       cmake \ | ||||||
|  | |||||||
| @ -5,9 +5,9 @@ | |||||||
| 
 | 
 | ||||||
| # About | # About | ||||||
| 
 | 
 | ||||||
| VyOS runs on a custom Linux Kernel (which is 4.19) at the time of this writing. | VyOS runs on a custom Linux Kernel (which is 6.6) at the time of this writing. | ||||||
| This repository holds a Jenkins Pipeline which is used to build the Custom | This repository holds build scripts that are used to build the Custom Kernel | ||||||
| Kernel (x86_64/amd64 at the moment) and all required out-of tree modules. | (x86_64/amd64 at the moment) and all required out-of tree modules. | ||||||
| 
 | 
 | ||||||
| VyOS does not utilize the build in Intel Kernel drivers for its NICs as those | VyOS does not utilize the build in Intel Kernel drivers for its NICs as those | ||||||
| Kernels sometimes lack features e.g. configurable receive-side-scaling queues. | Kernels sometimes lack features e.g. configurable receive-side-scaling queues. | ||||||
| @ -33,9 +33,3 @@ VyOS utilizes several Out-of-Tree modules (e.g. WireGuard, Accel-PPP and Intel | |||||||
| network interface card drivers). Module source code is retrieved from the | network interface card drivers). Module source code is retrieved from the | ||||||
| upstream repository and - when needed - patched so it can be build using this | upstream repository and - when needed - patched so it can be build using this | ||||||
| pipeline. | pipeline. | ||||||
| 
 |  | ||||||
| In the past VyOS maintainers had a fork of the Linux Kernel, WireGuard and |  | ||||||
| Accel-PPP. This is fine but increases maintenance effort. By utilizing vanilla |  | ||||||
| repositories upgrading to new versions is very easy - only the branch/commit/tag |  | ||||||
| used when cloning the repository via [Jenkinsfile](Jenkinsfile) needs to be |  | ||||||
| adjusted. |  | ||||||
|  | |||||||
| @ -1,6 +0,0 @@ | |||||||
| # 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. |  | ||||||
| @ -1,267 +0,0 @@ | |||||||
| #!/usr/bin/env groovy |  | ||||||
| // Copyright (C) 2020-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/>. |  | ||||||
| 
 |  | ||||||
| def call(description=null, pkgList=null, buildCmd=null, buildArm=false, changesPattern="**", buildLabel="ec2_amd64") { |  | ||||||
|     // - 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 |  | ||||||
|     // - buildArm: package will also be build for the arm64 platform |  | ||||||
|     // - changesPattern: package will only be build if a change file matching this |  | ||||||
|     //   pattern is found |  | ||||||
|     // - buildLabel: used to describe where the job should run. amd64 inside the |  | ||||||
|     //   string will be replaced with arm64 when those builds are enabled. |  | ||||||
|     //   Example: ec2_amd64 -> ec2_arm64 or foo_amd64 -> foo_arm64 |  | ||||||
| 
 |  | ||||||
|     setDescription(description) |  | ||||||
| 
 |  | ||||||
|     pipeline { |  | ||||||
|         agent none |  | ||||||
|         options { |  | ||||||
|             disableConcurrentBuilds() |  | ||||||
|             timeout(time: 240, unit: 'MINUTES') |  | ||||||
|             timestamps() |  | ||||||
|             buildDiscarder(logRotator(numToKeepStr: '10')) |  | ||||||
|         } |  | ||||||
|         stages { |  | ||||||
|             stage('Define Agent') { |  | ||||||
|                 agent { |  | ||||||
|                     label "${buildLabel}" |  | ||||||
|                 } |  | ||||||
|                 when { |  | ||||||
|                     anyOf { |  | ||||||
|                         changeset "${changesPattern}" |  | ||||||
|                         triggeredBy cause: "UserIdCause" |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 steps { |  | ||||||
|                     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 = '--sysctl net.ipv6.conf.lo.disable_ipv6=0 -e GOSU_UID=' + env.USR_ID + ' -e GOSU_GID=' + env.GRP_ID |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             stage('Build Code') { |  | ||||||
|                 when { |  | ||||||
|                     anyOf { |  | ||||||
|                         changeset pattern: changesPattern, caseSensitive: true |  | ||||||
|                         triggeredBy cause: "UserIdCause" |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 parallel { |  | ||||||
|                     stage('amd64') { |  | ||||||
|                         agent { |  | ||||||
|                             docker { |  | ||||||
|                                 label "${buildLabel}" |  | ||||||
|                                 args "${env.DOCKER_ARGS}" |  | ||||||
|                                 image "${env.DOCKER_IMAGE}" |  | ||||||
|                                 alwaysPull true |  | ||||||
|                                 reuseNode true |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                         steps { |  | ||||||
|                             script { |  | ||||||
|                                 cloneAndBuild(description, 'amd64', pkgList, buildCmd) |  | ||||||
|                                 stash includes: '**/*.deb', name: 'binary-amd64', allowEmpty: true |  | ||||||
|                                 try { |  | ||||||
|                                     stash includes: '**/*.dsc', name: 'source-dsc' |  | ||||||
|                                     stash includes: '**/*.tar.*z', name: 'source-tar' |  | ||||||
|                                 } catch (e) { |  | ||||||
|                                     print "Stashing failed, ignoring - no source packages" |  | ||||||
|                                     currentBuild.result = 'SUCCESS' |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                         post { |  | ||||||
|                             cleanup { |  | ||||||
|                                 deleteDir() |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                     stage('arm64') { |  | ||||||
|                         agent { |  | ||||||
|                             docker { |  | ||||||
|                                 label "${buildLabel.replace('amd64', 'arm64')}" |  | ||||||
|                                 args "${env.DOCKER_ARGS}" |  | ||||||
|                                 image "${env.DOCKER_IMAGE}-arm64" |  | ||||||
|                                 alwaysPull true |  | ||||||
|                                 reuseNode true |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                         when { |  | ||||||
|                             equals expected: true, actual: buildArm |  | ||||||
|                         } |  | ||||||
|                         steps { |  | ||||||
|                             script { |  | ||||||
|                                 cloneAndBuild(description, 'arm64', pkgList, buildCmd) |  | ||||||
|                                 stash includes: '**/*arm64.deb', name: 'binary-arm64', allowEmpty: true |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                         post { |  | ||||||
|                             cleanup { |  | ||||||
|                                 deleteDir() |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             stage("Finalize") { |  | ||||||
|                 when { |  | ||||||
|                     anyOf { |  | ||||||
|                         changeset pattern: changesPattern, caseSensitive: true |  | ||||||
|                         triggeredBy cause: "UserIdCause" |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 agent { |  | ||||||
|                     label "${buildLabel}" |  | ||||||
|                 } |  | ||||||
|                 steps { |  | ||||||
|                     script { |  | ||||||
|                         // Unpack files for amd64, sources and arm64 if packages got build |  | ||||||
|                         try { |  | ||||||
|                             unstash 'binary-amd64' |  | ||||||
|                             unstash 'binary-arm64' |  | ||||||
|                         } catch (e) { |  | ||||||
|                             print "Unstash failed, ignoring - could be because there exists no arm64 build" |  | ||||||
|                             currentBuild.result = 'SUCCESS' |  | ||||||
|                         } |  | ||||||
|                         try { |  | ||||||
|                             unstash 'source-dsc' |  | ||||||
|                             unstash 'source-tar' |  | ||||||
|                         } catch (e) { |  | ||||||
|                             print "Unstash failed, ignoring - no source packages" |  | ||||||
|                             currentBuild.result = 'SUCCESS' |  | ||||||
|                         } |  | ||||||
|                         if (isCustomBuild()) { |  | ||||||
|                             echo "Build not started from official Git repository! Artifacts are not uploaded to external repository" |  | ||||||
|                             return |  | ||||||
|                         } |  | ||||||
| 
 |  | ||||||
|                         echo "Uploading Artifacts to external repository" |  | ||||||
|                         copyArtifacts fingerprintArtifacts: true, projectName: '${JOB_NAME}', selector: specific('${BUILD_NUMBER}') |  | ||||||
| 
 |  | ||||||
|                         // 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 = env.DEV_PACKAGES_VYOS_NET_HOST // defined as global variable |  | ||||||
|                         def SSH_DIR = '~/VyOS/' + RELEASE |  | ||||||
| 
 |  | ||||||
|                         sshagent(['SSH-dev.packages.vyos.net']) { |  | ||||||
| 
 |  | ||||||
|                             sh(script: "ssh ${SSH_OPTS} ${SSH_REMOTE} -t \"bash --login -c 'mkdir -p ${SSH_DIR}'\"") |  | ||||||
| 
 |  | ||||||
|                             // Removing of source and binary packages should be BEFORE adding new ones. Else "reprepro [remove/removesrc]" command may remove [source/binary] package correspondingly (behavior depends on package links). |  | ||||||
|                             // To omit this feature(bug?) do not merge removing-adding sequence by sources and binaries as it used to be |  | ||||||
|                             files = findFiles(glob: '**/*.dsc') |  | ||||||
|                             if (files) { |  | ||||||
|                                 echo "Remove deprecated source package(s) from the repository..." |  | ||||||
|                                 files.each { FILE -> |  | ||||||
|                                     def PACKAGE = sh(returnStdout: true, script: "cat ${FILE} | grep Source ").trim().tokenize(' ').last() |  | ||||||
|                                     sh(script: "ssh ${SSH_OPTS} ${SSH_REMOTE} -t \"uncron-add 'reprepro -v -b ${VYOS_REPO_PATH} removesrc ${RELEASE} ${PACKAGE}'\"") |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
|                             files = findFiles(glob: '**/*-build-deps_*.deb') |  | ||||||
|                             if (files) { |  | ||||||
|                                 echo "Remove Debian build dependency files from the workspace..." |  | ||||||
|                                 files.each { FILE -> |  | ||||||
|                                     sh(script: "rm -f ${FILE}") |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
| 
 |  | ||||||
|                             files = findFiles(glob: '**/*.deb') |  | ||||||
|                             if (files) { |  | ||||||
|                                 echo "Remove deprecated binary package(s) from the repository..." |  | ||||||
|                                 files.each { FILE -> |  | ||||||
|                                     // NOTE: Groovy is a pain in the ass and " quotes differ from ', so all shell code must use " in the beginning |  | ||||||
|                                     def PACKAGE = sh(returnStdout: true, script: "dpkg-deb -f ${FILE} Package").trim() |  | ||||||
|                                     def PACKAGE_ARCH = sh(returnStdout: true, script: "dpkg-deb -f ${FILE} Architecture").trim() |  | ||||||
|                                     def ARCH = '' |  | ||||||
|                                     if (PACKAGE_ARCH != 'all') |  | ||||||
|                                         ARCH = '-A ' + PACKAGE_ARCH |  | ||||||
|                                     sh(script: "ssh ${SSH_OPTS} ${SSH_REMOTE} -t \"uncron-add 'reprepro -v -b ${VYOS_REPO_PATH} ${ARCH} remove ${RELEASE} ${PACKAGE}'\"") |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
| 
 |  | ||||||
|                             files = findFiles(glob: '**/*.tar.*z') |  | ||||||
|                             if (files) { |  | ||||||
|                                 echo "Uploading tarball package(s) to the repository..." |  | ||||||
|                                 files.each { FILE -> |  | ||||||
|                                     sh(script: "scp ${SSH_OPTS} ${FILE} ${SSH_REMOTE}:${SSH_DIR}") |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
| 
 |  | ||||||
|                             files = findFiles(glob: '**/*.dsc') |  | ||||||
|                             if (files) { |  | ||||||
|                                 echo "Uploading *.dsc package(s) to the repository..." |  | ||||||
|                                 files.each { FILE -> |  | ||||||
|                                     def PACKAGE = sh(returnStdout: true, script: "cat ${FILE} | grep Source ").trim().tokenize(' ').last() |  | ||||||
|                                     sh(script: "scp ${SSH_OPTS} ${FILE} ${SSH_REMOTE}:${SSH_DIR}") |  | ||||||
|                                     def FILENAME = FILE.toString().tokenize('/').last() |  | ||||||
|                                     sh(script: "ssh ${SSH_OPTS} ${SSH_REMOTE} -t \"uncron-add 'reprepro -v -b ${VYOS_REPO_PATH} includedsc ${RELEASE} ${SSH_DIR}/${FILENAME}'\"") |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
| 
 |  | ||||||
|                             files = findFiles(glob: '**/*.deb') |  | ||||||
|                             if (files) { |  | ||||||
|                                 echo "Uploading binary package(s) to the repository ..." |  | ||||||
|                                 files.each { FILE -> |  | ||||||
|                                     // NOTE: Groovy is a pain in the ass and " quotes differ from ', so all shell code must use " in the beginning |  | ||||||
|                                     def PACKAGE = sh(returnStdout: true, script: "dpkg-deb -f ${FILE} Package").trim() |  | ||||||
|                                     def PACKAGE_ARCH = sh(returnStdout: true, script: "dpkg-deb -f ${FILE} Architecture").trim() |  | ||||||
|                                     def ARCH = '' |  | ||||||
|                                     if (PACKAGE_ARCH != 'all') |  | ||||||
|                                         ARCH = '-A ' + PACKAGE_ARCH |  | ||||||
|                                     sh(script: "scp ${SSH_OPTS} ${FILE} ${SSH_REMOTE}:${SSH_DIR}") |  | ||||||
|                                     // Packages like FRR produce their binary in a nested path e.g. packages/frr/frr-rpki-rtrlib-dbgsym_7.5_arm64.deb, |  | ||||||
|                                     // thus we will only extract the filename portion from FILE as the binary is scp'ed to SSH_DIR without any subpath. |  | ||||||
|                                     def FILENAME = FILE.toString().tokenize('/').last() |  | ||||||
|                                     sh(script: "ssh ${SSH_OPTS} ${SSH_REMOTE} -t \"uncron-add 'reprepro -v -b ${VYOS_REPO_PATH} ${ARCH} includedeb ${RELEASE} ${SSH_DIR}/${FILENAME}'\"") |  | ||||||
|                                 } |  | ||||||
|                                 sh(script: "ssh ${SSH_OPTS} ${SSH_REMOTE} -t \"uncron-add 'reprepro -v -b ${VYOS_REPO_PATH} deleteunreferenced'\"") |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 post { |  | ||||||
|                     cleanup { |  | ||||||
|                         deleteDir() |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -1,87 +0,0 @@ | |||||||
| #!/usr/bin/env groovy |  | ||||||
| // Copyright (C) 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/>. |  | ||||||
| 
 |  | ||||||
| def call(description, architecture, pkgList, buildCmd) { |  | ||||||
|     // 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-${architecture}") { |  | ||||||
|         // cleanup |  | ||||||
|         deleteDir() |  | ||||||
| 
 |  | ||||||
|         // 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 -> |  | ||||||
|                 if (pkg.scmUrl && pkg.scmCommit) { |  | ||||||
|                     dir(getJenkinsfilePath() + pkg.name) { |  | ||||||
|                         checkout([$class: 'GitSCM', |  | ||||||
|                             doGenerateSubmoduleConfigurations: false, |  | ||||||
|                             extensions: [[$class: 'CleanCheckout']], |  | ||||||
|                             branches: [[name: pkg.scmCommit]], |  | ||||||
|                             userRemoteConfigs: [[url: pkg.scmUrl]]]) |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // compile the source(s) ... |  | ||||||
|         if (pkgList) { |  | ||||||
|             pkgList.each { pkg -> |  | ||||||
|                 dir(getJenkinsfilePath() + pkg.name) { |  | ||||||
|                     sh pkg.buildCmd |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } else if (buildCmd) { |  | ||||||
|             sh buildCmd |  | ||||||
|         } else { |  | ||||||
|             // build dependency package and install it |  | ||||||
|             sh """ |  | ||||||
|                 if [ -f debian/control ]; then |  | ||||||
|                     sudo mk-build-deps --install --tool "apt-get --yes --no-install-recommends" |  | ||||||
|                     sudo dpkg -i *build-deps*.deb |  | ||||||
|                 fi |  | ||||||
|             """ |  | ||||||
|             try { |  | ||||||
|                 sh 'dpkg-buildpackage -uc -us -tc -F' |  | ||||||
|             } catch (e) { |  | ||||||
|                 print "Source packages build failed, ignoring - building binaries only" |  | ||||||
|                 currentBuild.result = 'SUCCESS' |  | ||||||
|                 sh 'dpkg-buildpackage -uc -us -tc -b' |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     if (architecture == 'amd64') { |  | ||||||
|         archiveArtifacts artifacts: "**/*.deb", fingerprint: true |  | ||||||
|         try { |  | ||||||
|             archiveArtifacts artifacts: "**/*.dsc", fingerprint: true |  | ||||||
|             archiveArtifacts artifacts: "**/*.tar.*z", fingerprint: true |  | ||||||
|         } catch (e) { |  | ||||||
|             print "Archiving failed, ignoring - no source packages" |  | ||||||
|             currentBuild.result = 'SUCCESS' |  | ||||||
|         } |  | ||||||
|     } else { |  | ||||||
|         archiveArtifacts artifacts: "**/*_${architecture}.deb", fingerprint: true |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -1,26 +0,0 @@ | |||||||
| #!/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 = "**/*" |  | ||||||
|     echo tmp |  | ||||||
|     return tmp |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @ -1,21 +0,0 @@ | |||||||
| #!/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] |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @ -1,20 +0,0 @@ | |||||||
| #!/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() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @ -1,20 +0,0 @@ | |||||||
| #!/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 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @ -1,24 +0,0 @@ | |||||||
| #!/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 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @ -1,26 +0,0 @@ | |||||||
| #!/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 |  | ||||||
|     // GitHub organisation base URL |  | ||||||
|     def gitURI = 'git@github.com:vyos/' + getGitRepoName() |  | ||||||
|     def httpURI = 'https://github.com/vyos/' + getGitRepoName() |  | ||||||
| 
 |  | ||||||
|     return !((getGitRepoURL() == gitURI) || (getGitRepoURL() == httpURI)) || isPullRequest() |  | ||||||
| } |  | ||||||
| @ -1,21 +0,0 @@ | |||||||
| // 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() { |  | ||||||
|     if (env.CHANGE_ID) { |  | ||||||
|         return true |  | ||||||
|     } |  | ||||||
|     return false |  | ||||||
| } |  | ||||||
| @ -1,42 +0,0 @@ | |||||||
| #!/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() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user