{"id":794,"date":"2018-09-02T18:34:52","date_gmt":"2018-09-02T16:34:52","guid":{"rendered":"https:\/\/blog.unetresgrossebite.com\/?p=794"},"modified":"2018-10-26T21:46:49","modified_gmt":"2018-10-26T19:46:49","slug":"packages-build-pipeline-with-openshift","status":"publish","type":"post","link":"https:\/\/blog.unetresgrossebite.com\/?p=794","title":{"rendered":"Packages Build Pipeline with OpenShift"},"content":{"rendered":"<p>As an other follow-up to my previous OpenShift posts, today we would look into Jenkins and Nexus integration with OpenShift, while building a dummy package shipping SSH Keys, both as a debien archive and RPM package.<\/p>\n<p>If you&#8217;re not concerned with automating Nexus configuration, then you may use <i>sonatype\/nexus3<\/i> from the Docker hub setting up Nexus Repository Manager on OpenShift.<br \/>\nAs I wanted to automate a few configuration tasks, I eventually started working on my own image, forking from a repository <a href='https:\/\/github.com\/Accenture\/adop-nexus' target='_blank'>offered by Accenture<\/a>. My copy isn&#8217;t yet released publicly, so I&#8217;ld just point out it creates a couple users uploading and downloading Artifacts.<\/p>\n<p>Another subject to address would be to prepare a couple images building our Debian and RPM packages. Regarding RPMs, we could divert from <a href=\"https:\/\/github.com\/openshift\/jenkins\/tree\/master\/slave-base\" target='_blank'>Jenkins base slave image<\/a>:<\/p>\n<blockquote><p>FROM openshift\/jenkins-slave-base-centos7<\/p>\n<p>RUN yum -y install epel-release \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&#038;&#038; yum -y install @development-tools centos-packager rpmdevtools \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&#038;&#038; yum -y install make wget git curl<\/p>\n<p>USER 1001<\/p><\/blockquote>\n<p>While for Debian we would want to build some Stretch-based equivalent:<\/p>\n<blockquote><p>FROM debian:stretch<\/p>\n<p>ENV HOME=\/home\/jenkins \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;DEBIAN_FRONTEND=noninteractive<\/p>\n<p>USER root<\/p>\n<p>ADD config\/* \/usr\/local\/bin\/<\/p>\n<p>RUN apt-get -y update \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&#038;&#038; apt-get -y install bc gettext git subversion openjdk-8-jre-headless gnupg curl wget \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lsof rsync tar unzip debianutils zip bzip2 make gcc g++ devscripts debhelper \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&#038;&#038; apt-get clean \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&#038;&#038; rm -rf \/var\/lib\/apt\/lists\/* \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&#038;&#038; mkdir -p \/home\/jenkins \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&#038;&#038; chown -R 1001:0 \/home\/jenkins \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&#038;&#038; chmod -R g+w \/home\/jenkins \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&#038;&#038; chmod 664 \/etc\/passwd \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&#038;&#038; chmod -R 775 \/etc\/alternatives \/usr\/lib\/jvm \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&#038;&#038; chmod 775 \/usr\/bin \/usr\/share\/man\/man1<\/p>\n<p>USER 1001<\/p>\n<p>ENTRYPOINT [&#8220;\/usr\/local\/bin\/run-jnlp-client&#8221;]<\/p><\/blockquote>\n<p>From there, the last item we&#8217;ll need, building our packages, is their sources.<\/p>\n<p>Building RPMs, we would write a Spec file such as the following:<\/p>\n<blockquote><p>\nSummary: My Package<br \/>\nName: my-package<br \/>\nVersion: 0.0.1<br \/>\nRelease: 1%{?dist}<br \/>\nLicense: MIT<br \/>\nSource: https:\/\/repo\/sources\/el-%{name}-%{version}.tar.gz<br \/>\nURL: https:\/\/my.example.com<\/p>\n<p>Autoreq: no<br \/>\nBuildRequires: git<br \/>\nBuildRequires: make<\/p>\n<p>%description<br \/>\nDoes something awesome<\/p>\n<p>%global __os_install_post %{nil}<br \/>\n%define debug_package %{nil}<br \/>\n%prep<br \/>\n%autosetup<br \/>\n%build<br \/>\n%install<br \/>\nmake install PREFIX=%{buildroot}<\/p>\n<p>%pre<br \/>\n%prerun<br \/>\n%post<br \/>\n%files<br \/>\n%defattr(-,root,root)<br \/>\n%dir %{_datadir}\/mydir<br \/>\n%{_datadir}\/mydir\/myfile<\/p>\n<p>%changelog<br \/>\n&nbsp;* Thu Aug 30 2018 It&#8217;s Me &lt;mario@example.com&gt; 0.0.1-1<br \/>\n&nbsp;&#8211; Initial release &#8211; In an other castle?\n<\/p><\/blockquote>\n<p>Now regarding Debian packages, we would need to create a couple subdirectories, configuration files and scripts:<\/p>\n<blockquote><p>$ mkdir -p debian\/source<br \/>\n$ echo &#8220;3.0 (quit)&#8221; &gt;debian\/source\/format<br \/>\n$ echo 9 &gt;debian\/compat<br \/>\n$ for i in postinst preinst prerm pstrm; do<br \/>\ncat &lt;&lt;EOF &gt;debian\/$i<br \/>\n#!\/bin\/sh<br \/>\n# $i script for my-package<\/p>\n<p>set -e<\/p>\n<p>case &#8220;$1&#8221; in<br \/>\n&nbsp;&nbsp;purge|remove|abort-install|disappear) ;;<\/p>\n<p>&nbsp;&nbsp;upgrade|failed-upgrade|abort-upgrade) ;;<\/p>\n<p>&nbsp;&nbsp;*)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;echo &#8220;postrm called with unknown argument \\`$1&#8242;&#8221; &gt;&#038;2<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;exit 1<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;;;<br \/>\nesac<\/p>\n<p>#DEBHELPER#<\/p>\n<p>exit 0<br \/>\nEOF<br \/>\nchmod +x debian\/$i<br \/>\ndone<br \/>\n$ for i in docs copyright missing-sources README.Debian; do<br \/>\ntouch $i<br \/>\ndone<br \/>\n$ cat &lt;&lt;EOF &gt;debian\/rules<br \/>\n#!\/usr\/bin\/make -f<br \/>\n#DH_VERBOSE = 1<\/p>\n<p>DPKG_EXPORT_BUILDFLAGS = 1<br \/>\ninclude \/usr\/share\/dpkg\/default.mk<\/p>\n<p># see FEATURE AREAS in dpkg-buildflags(1)<br \/>\nexport DEB_BUILD_MAINT_OPTIONS = hardening=+all<\/p>\n<p># main packaging script based on dh7 syntax<br \/>\n%:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dh $@<\/p>\n<p>override_dh_auto_install:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE) install PREFIX=$(CURDIR)\/debian\/my-package<\/p>\n<p>override_dh_auto_build:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo nothing to do<\/p>\n<p>override_dh_auto_test:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo nothing to do<br \/>\nEOF<br \/>\n$ chmod +x debian\/rules<br \/>\n$ cat &lt;&lt;EOF &gt;debian\/changelog<br \/>\nmy-package (0.0.1-1) unstable; urgency=low<\/p>\n<p>&nbsp;&nbsp;* Initial release &#8211; In an other castle?<\/p>\n<p> &#8212; It&#8217;s Me &lt;mario@example.com&gt;  Thu, 30 Aug 2018 11:30:42 +0200<br \/>\nEOF\n<\/p><\/blockquote>\n<p>From there, we ensure our sources ships with a Makefile, providing with the following rules:<\/p>\n<blockquote><p>\nSHARE_DIR = $(PREFIX)\/usr\/share<\/p>\n<p>createdebsource:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;LANG=C debuild -S -sa<\/p>\n<p>createdebbin:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;LANG=C dpkg-buildpackage -us -uc<\/p>\n<p>createrpm:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;versionNumber=`awk &#8216;\/^Version:\/{print $$2;exit;}&#8217; el\/my-package.spec`; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;wdir=&#8221;`pwd`\/..&#8221;; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;buildroot=&#8221;$$wdir\/rpmbuild&#8221;; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;for d in SOURCES SPECS BUILD RPMS SRPMS; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;do \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mkdir -p &#8220;$$buildroot\/$$d&#8221;; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;done; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;cp -p &#8220;$$wdir\/el-my-package-$$versionNumber.tar.gz&#8221; &#8220;$$buildroot\/SOURCES\/&#8221;; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;cp -p &#8220;$$wdir\/my-package\/el\/my-package.spec&#8221; &#8220;$$buildroot\/SPECS\/&#8221;; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if ! whoami &gt;\/dev\/null 2&gt;&1; then \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chown -R root:root &#8220;$$buildroot\/SOURCES&#8221; &#8220;$$buildroot\/SPECS&#8221;; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;elif whoami 2&gt;\/dev\/null | grep default &gt;\/dev\/null; then \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chown -R :root &#8220;$$buildroot\/SOURCES&#8221; &#8220;$$buildroot\/SPECS&#8221;; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;fi; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;( \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cd &#8220;$$buildroot&#8221;; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LANG=C rpmbuild &#8211;define &#8220;_topdir $$buildroot&#8221; -ba SPECS\/my-package.spec &#038;&#038; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;find *RPMS -type f | while read output; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mv &#8220;$$output&#8221; $$wdir\/; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;done; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;)<\/p>\n<p>createinitialarchive:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;rm -fr .git .gitignore README.md<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;versionNumber=`cat debian\/changelog | awk &#8216;\/my-package\/{print $$2;exit}&#8217; | sed -e &#8216;s|[()]||g&#8217; -e &#8216;s|\\\\(.*\\\\)-[0-9]*\\$$|\\\\1|&#8217;`; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;( \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cd ..; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tar -czf my-package_$$versionNumber.orig.tar.gz my-package; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mv my-package my-package-$$versionNumber; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tar -czf el-my-package-$$versionNumber.tar.gz my-package-$$versionNumber; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mv my-package-$$versionNumber my-package; \\<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;)<\/p>\n<p>install:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;mkdir -p $(SHARE_DIR)\/mydir<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;install -c -m 0644 myfile $(SHARE_DIR)\/mydir\/myfile\n<\/p><\/blockquote>\n<p>At which point, we may use the following OpenShift Template, creating a few secrets and a pair of Jenkins Pipelines, building Debian and RPM packages based on our previous images, then uploading their Artifacts to Nexus :<\/p>\n<blockquote><p>\napiVersion: v1<br \/>\nkind: Template<br \/>\nmetadata:<br \/>\n&nbsp;&nbsp;name: my-package-template<br \/>\nobjects:<br \/>\n&#8211; apiVersion: v1<br \/>\n&nbsp;&nbsp;kind: Secret<br \/>\n&nbsp;&nbsp;metadata:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;annotations:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jenkins.io\/credentials-description : ${APPLICATION_NAME} Git Token credential from Kubernetes<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;labels:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jenkins.io\/credentials-type: secretText<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;name: git-${APPLICATION_NAME}<br \/>\n&nbsp;&nbsp;stringData:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;text: ${GIT_DEPLOYMENT_TOKEN}<br \/>\n&#8211; apiVersion: v1<br \/>\n&nbsp;&nbsp;kind: Secret<br \/>\n&nbsp;&nbsp;metadata:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;annotations:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jenkins.io\/credentials-description : ${APPLICATION_NAME} Nexus Credentials from Kubernetes<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;labels:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jenkins.io\/credentials-type: usernamePassword<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;name: nexus-${APPLICATION_NAME}<br \/>\n&nbsp;&nbsp;stringData:<br \/>\n&nbsp;&nbsp;password: ${NEXUS_ARTIFACTS_PASSWORD}<br \/>\n&nbsp;&nbsp;username: ${NEXUS_ARTIFACTS_USERNAME}<br \/>\n&#8211; apiVersion: v1<br \/>\n&nbsp;&nbsp;kind: BuildConfig<br \/>\n&nbsp;&nbsp;metadata:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;annotations:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;description: Builds ${APPLICATION_NAME} rpm archive<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;name: ${APPLICATION_NAME}-rpm<br \/>\n&nbsp;&nbsp;spec:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;strategy:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jenkinsPipelineStrategy:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jenkinsfile: |-<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def pkgname = &#8220;${APPLICATION_NAME}&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def label = &#8220;${pkgname}-${UUID.randomUUID().toString()}&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;podTemplate(label: label, name: label, cloud: &#8216;openshift&#8217;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;containers: [ containerTemplate(name: &#8216;jnlp&#8217;, image: &#8216;${DOCKER_REGISTRY}\/${CENTOS_IMAGE}&#8217;) ],<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inheritFrom: &#8216;nodejs&#8217;, serviceAccount: &#8216;jenkins&#8217;) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout(time: 40, unit: &#8216;MINUTES&#8217;) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node (label) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stage(&#8220;Fetch&#8221;) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sh &#8220;git config &#8211;global http.sslVerify false&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sh &#8220;mkdir ${pkgname}&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;withCredentials([string(credentialsId: &#8220;git-${pkgname}&#8221;, variable: &#8216;GIT_TOKEN&#8217;)]) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sh &#8220;echo &#8216;${SOURCE_REPOSITORY_URL}&#8217; | sed &#8216;s|^\\\\(http[s]*:\/\/\\\\)\\\\(.*\\\\)|\\\\1${GIT_TOKEN}@\\\\2|&#8217; &gt;cloneFrom 2&gt;\/dev\/null&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def cloneAddress = readFile(&#8216;cloneFrom&#8217;).trim()<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dir (&#8220;${pkgname}&#8221;) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;git([ branch: &#8220;master&#8221;, changelog: false, poll: false, url: cloneAddress ])<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stage(&#8220;Build&#8221;) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sh &#8220;&#8221;&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;( cd ${pkgname} ; git rev-parse &#8211;short HEAD ) &gt;gitHash<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;( cd ${pkgname} ; make createinitialarchive ; make createrpm )<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;awk &#8216;\/^Release:\/{print \\$2;exit;}&#8217; ${pkgname}\/el\/${pkgname}.spec | cut -d% -f1 &gt;patchNumber<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;awk &#8216;\/^Version:\/{print \\$2;exit;}&#8217; ${pkgname}\/el\/${pkgname}.spec &gt;versionNumber<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;&#8221;&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stage(&#8220;Upload&#8221;) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def gitHash = readFile(&#8216;gitHash&#8217;).trim()<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def patch = readFile(&#8216;patchNumber&#8217;).trim()<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def version = readFile(&#8216;versionNumber&#8217;).trim()<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sh &#8220;echo Uploading artifacts for ${version}-${patch}-${gitHash}&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nexusArtifactUploader(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nexusVersion: &#8216;${NEXUS_VERSION}&#8217;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protocol: &#8220;${NEXUS_PROTO}&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nexusUrl: &#8220;${NEXUS_REMOTE}&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;groupId: &#8220;${NEXUS_GROUP_ID}&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;version: &#8220;${version}-${patch}-${gitHash}&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repository: &#8220;${NEXUS_RPM_REPOSITORY}&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credentialsId: &#8220;nexus-${pkgname}&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;artifacts: [<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ artifactId: &#8220;${pkgname}-rpm&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classifier: &#8221;, type: &#8216;rpm&#8217;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file: &#8220;${pkgname}-${version}-${patch}.el7.src.rpm&#8221; ],<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ artifactId: &#8220;${pkgname}-rpm&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classifier: &#8221;, type: &#8216;rpm&#8217;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file: &#8220;${pkgname}-${version}-${patch}.el7.x86_64.rpm&#8221; ],<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ artifactId: &#8220;${pkgname}-rpm&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classifier: &#8221;, type: &#8216;tar.gz&#8217;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file: &#8220;el-${pkgname}-${version}.tar.gz&#8221; ]<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (err) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &#8220;in catch block&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &#8220;Caught: ${err}&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentBuild.result = &#8216;FAILURE&#8217;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw err<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type: JenkinsPipeline<br \/>\n&#8211; apiVersion: v1<br \/>\n&nbsp;&nbsp;kind: BuildConfig<br \/>\n&nbsp;&nbsp;metadata:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;annotations:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;description: Builds ${APPLICATION_NAME} deb archive<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;name: ${APPLICATION_NAME}-deb<br \/>\n&nbsp;&nbsp;spec:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;strategy:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jenkinsPipelineStrategy:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jenkinsfile: |-<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def pkgname = &#8220;${APPLICATION_NAME}&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def label = &#8220;${pkgname}-${UUID.randomUUID().toString()}&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;podTemplate(label: label, name: label, cloud: &#8216;openshift&#8217;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;containers: [ containerTemplate(name: &#8216;jnlp&#8217;, image: &#8216;${DOCKER_REGISTRY}\/${DEBIAN_IMAGE}&#8217;) ],<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inheritFrom: &#8216;nodejs&#8217;, serviceAccount: &#8216;jenkins&#8217;) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout(time: 40, unit: &#8216;MINUTES&#8217;) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node (label) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stage(&#8220;Fetch&#8221;) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sh &#8220;git config &#8211;global http.sslVerify false&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sh &#8220;mkdir ${pkgname}&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;withCredentials([string(credentialsId: &#8220;git-${pkgname}&#8221;, variable: &#8216;GIT_TOKEN&#8217;)]) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sh &#8220;echo &#8216;${SOURCE_REPOSITORY_URL}&#8217; | sed &#8216;s|^\\\\(http[s]*:\/\/\\\\)\\\\(.*\\\\)|\\\\1${GIT_TOKEN}@\\\\2|&#8217; >cloneFrom 2>\/dev\/null&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def cloneAddress = readFile(&#8216;cloneFrom&#8217;).trim()<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dir (&#8220;${pkgname}&#8221;) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;git([ branch: &#8220;master&#8221;, changelog: false, poll: false, url: cloneAddress ])<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stage(&#8220;Build&#8221;) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sh &#8220;&#8221;&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;( cd ${pkgname} ; git rev-parse &#8211;short HEAD ) &gt;gitHash<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;( cd ${pkgname} ; make createinitialarchive ; make createdebbin )<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cat ${pkgname}\/debian\/changelog | awk &#8216;\/${pkgname}\/{print \\$2;exit}&#8217; | sed -e &#8216;s|[()]||g&#8217; -e &#8216;s|.*-\\\\([0-9]*\\\\)\\$|\\\\1|&#8217; &gt;patchNumber<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cat ${pkgname}\/debian\/changelog | awk &#8216;\/${pkgname}\/{print \\$2;exit}&#8217; | sed -e &#8216;s|[()]||g&#8217; -e &#8216;s|\\\\(.*\\\\)-[0-9]*\\$|\\\\1|&#8217; &gt;versionNumber<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;&#8221;&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stage(&#8220;Upload&#8221;) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def gitHash = readFile(&#8216;gitHash&#8217;).trim()<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def patch = readFile(&#8216;patchNumber&#8217;).trim()<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def version = readFile(&#8216;versionNumber&#8217;).trim()<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sh &#8220;echo Uploading artifacts for ${version}-${patch}-${gitHash}&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nexusArtifactUploader(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nexusVersion: &#8216;${NEXUS_VERSION}&#8217;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protocol: &#8220;${NEXUS_PROTO}&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nexusUrl: &#8220;${NEXUS_REMOTE}&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;groupId: &#8220;${NEXUS_GROUP_ID}&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;version: &#8220;${version}-${patch}-${gitHash}&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repository: &#8220;${NEXUS_DEB_REPOSITORY}&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credentialsId: &#8220;nexus-${pkgname}&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;artifacts: [<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ artifactId: &#8220;${pkgname}-deb&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classifier: &#8221;, type: &#8216;deb&#8217;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file: &#8220;${pkgname}_${version}-${patch}_all.deb&#8221; ],<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ artifactId: &#8220;${pkgname}-deb&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classifier: &#8221;, type: &#8216;txt&#8217;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file: &#8220;${pkgname}_${version}-${patch}_amd64.buildinfo&#8221; ],<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ artifactId: &#8220;${pkgname}-deb&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classifier: &#8221;, type: &#8216;txt&#8217;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file: &#8220;${pkgname}_${version}-${patch}_amd64.changes&#8221; ],<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ artifactId: &#8220;${pkgname}-deb&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classifier: &#8221;, type: &#8216;tar.xz&#8217;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file: &#8220;${pkgname}_${version}-${patch}.debian.tar.xz&#8221; ],<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ artifactId: &#8220;${pkgname}-dev&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classifier: &#8221;, type: &#8216;tar.gz&#8217;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file: &#8220;${pkgname}_${version}.orig.tar.gz&#8221; ],<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ artifactId: &#8220;${pkgname}-deb&#8221;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classifier: &#8221;, type: &#8216;txt&#8217;,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file: &#8220;${pkgname}_${version}-${patch}.dsc&#8221; ]<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (err) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &#8220;in catch block&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &#8220;Caught: ${err}&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentBuild.result = &#8216;FAILURE&#8217;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw err<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type: JenkinsPipeline<br \/>\nparameters:<br \/>\n&#8211; name: APPLICATION_NAME<br \/>\n&nbsp;&nbsp;description: Package Name &#8211; should match that expected by package we&#8217;ll build<br \/>\n&nbsp;&nbsp;displayName: Package Name<br \/>\n&nbsp;&nbsp;value: my-package<br \/>\n&#8211; name: DEBIAN_IMAGE<br \/>\n&nbsp;&nbsp;description: Jenkins Debian Agent Image &#8211; relative to DOCKER_REGISTRY<br \/>\n&nbsp;&nbsp;displayName: Jenkins Debian Agent Image<br \/>\n&nbsp;&nbsp;required: true<br \/>\n&nbsp;&nbsp;value: &#8220;cicd\/jenkins-agent-debian:latest&#8221;<br \/>\n&#8211; name: DOCKER_REGISTRY<br \/>\n&nbsp;&nbsp;description: Docker Registry<br \/>\n&nbsp;&nbsp;displayName: Docker Registry<br \/>\n&nbsp;&nbsp;required: true<br \/>\n&nbsp;&nbsp;value: docker-registry.default.svc:5000<br \/>\n&#8211; name: CENTOS_IMAGE<br \/>\n&nbsp;&nbsp;description: Jenkins Centos Agent Image &#8211; relative to DOCKER_REGISTRY<br \/>\n&nbsp;&nbsp;displayName: Jenkins Centos Agent Image<br \/>\n&nbsp;&nbsp;required: true<br \/>\n&nbsp;&nbsp;value: &#8220;cicd\/jenkins-agent-centos:latest&#8221;<br \/>\n&#8211; name: GIT_DEPLOYMENT_TOKEN<br \/>\n&nbsp;&nbsp;description: Git deployment token<br \/>\n&nbsp;&nbsp;displayName: Git Deployment Token<br \/>\n&nbsp;&nbsp;required: true<br \/>\n&#8211; name: NEXUS_ARTIFACTS_PASSWORD<br \/>\n&nbsp;&nbsp;description: Nexus Artifacts Upload Password<br \/>\n&nbsp;&nbsp;displayName: Nexus Artifacts Upload Password<br \/>\n&nbsp;&nbsp;required: true<br \/>\n&nbsp;&nbsp;value: admin123<br \/>\n&#8211; name: NEXUS_ARTIFACTS_USERNAME<br \/>\n&nbsp;&nbsp;description: Nexus Artifacts Upload Username<br \/>\n&nbsp;&nbsp;displayName: Nexus Artifacts Upload Username<br \/>\n&nbsp;&nbsp;required: true<br \/>\n&nbsp;&nbsp;value: admin<br \/>\n&#8211; name: NEXUS_GROUP_ID<br \/>\n&nbsp;&nbsp;description: Nexus Group ID<br \/>\n&nbsp;&nbsp;displayName: Nexus Group ID<br \/>\n&nbsp;&nbsp;required: true<br \/>\n&nbsp;&nbsp;value: com.example<br \/>\n&#8211; name: NEXUS_DEB_REPOSITORY<br \/>\n&nbsp;&nbsp;description: Nexus Artifact Debian Repository &#8211; remote repository name<br \/>\n&nbsp;&nbsp;displayName: Nexus Artifact Debian Repository<br \/>\n&nbsp;&nbsp;required: true<br \/>\n&nbsp;&nbsp;value: debian<br \/>\n&#8211; name: NEXUS_PROTO<br \/>\n&nbsp;&nbsp;description: Nexus Proto &#8211; http or https<br \/>\n&nbsp;&nbsp;displayName: Nexus Proto<br \/>\n&nbsp;&nbsp;required: true<br \/>\n&nbsp;&nbsp;value: http<br \/>\n&#8211; name: NEXUS_REMOTE<br \/>\n&nbsp;&nbsp;description: Nexus Remote URL &#8211; proto-less URI connecting to Nexus<br \/>\n&nbsp;&nbsp;displayName: Nexus Remote URL<br \/>\n&nbsp;&nbsp;value: &#8220;nexus:8081&#8221;<br \/>\n&nbsp;&nbsp;required: true<br \/>\n&#8211; name: NEXUS_RPM_REPOSITORY<br \/>\n&nbsp;&nbsp;description: Nexus Artifact EL Repository &#8211; remote repository name<br \/>\n&nbsp;&nbsp;displayName: Nexus Artifact EL Repository<br \/>\n&nbsp;&nbsp;required: true<br \/>\n&nbsp;&nbsp;value: centos<br \/>\n&#8211; name: NEXUS_VERSION<br \/>\n&nbsp;&nbsp;description: Nexus Repository Version<br \/>\n&nbsp;&nbsp;displayName: Nexus Repository Version<br \/>\n&nbsp;&nbsp;required: true<br \/>\n&nbsp;&nbsp;value: nexus3<br \/>\n&#8211; name: SOURCE_REPOSITORY_URL<br \/>\n&nbsp;&nbsp;description: The URL of the repository with your application source code<br \/>\n&nbsp;&nbsp;displayName: Git Repository URL<br \/>\n&nbsp;&nbsp;required: true<br \/>\n&nbsp;&nbsp;value: https:\/\/git.example.com\/project\/my-package\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>As an other follow-up to my previous OpenShift posts, today we would look into Jenkins and Nexus integration with OpenShift, while building a dummy package shipping SSH Keys, both as a debien archive and RPM package. If you&#8217;re not concerned with automating Nexus configuration, then you may use sonatype\/nexus3 from the Docker hub setting up [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[12,10,13],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=\/wp\/v2\/posts\/794"}],"collection":[{"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=794"}],"version-history":[{"count":9,"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=\/wp\/v2\/posts\/794\/revisions"}],"predecessor-version":[{"id":819,"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=\/wp\/v2\/posts\/794\/revisions\/819"}],"wp:attachment":[{"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=794"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=794"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.unetresgrossebite.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=794"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}