Multiplatform support for policy 53/93953/27
authorPaul Vaduva <Paul.Vaduva@enea.com>
Thu, 27 Jun 2019 16:00:57 +0000 (18:00 +0200)
committerCristina Pauna <cristina.pauna@enea.com>
Thu, 5 Sep 2019 19:14:56 +0000 (22:14 +0300)
Add multiplatfrom support for policy-base
and policy-common docker images:
   - the pom.xml files are modified to push and pull from dockerhub instead
     of nexus repository (as nexus lacks support for manifest list)
   - for each image that is built with maven, an arch suffix is added to the
     tag. The currently supported architectures are amd64 and arm64.
   - the creation of the timestamped tag is moved from the pom.xml files to
     the docker_push_manifest.sh script
   - for each image built via the Jenkins CI jobs, the docker_push_manifest.sh
     is called. The script pushes a manifest list for each tag, plus it
     creates the timestamp tags for SNAPSHOT or STAGING images,
     depending on what job called the script (merge job, or stag job)

For using the images, the name of the manifest list is to be used (which
is the same as the current images in nexus)

Issue-ID: POLICY-1997
Change-Id: If54e7ee6ac432a999844d3584e146a90e2247323
Signed-off-by: Paul Vaduva <Paul.Vaduva@enea.com>
Signed-off-by: Cristina Pauna <cristina.pauna@enea.com>
Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
.gitignore
docker_push_manifest.sh [new file with mode: 0755]
policy-base/alpine/pom.xml
policy-base/pom.xml
policy-common/alpine/pom.xml
policy-common/alpine/src/main/docker/Dockerfile
policy-common/pom.xml
pom.xml
version.properties

index 1c47ce9..a5c40eb 100644 (file)
@@ -4,3 +4,4 @@
 target
 install.log*
 policy-drools/install.log*
+*.sw?
diff --git a/docker_push_manifest.sh b/docker_push_manifest.sh
new file mode 100755 (executable)
index 0000000..7e2ba85
--- /dev/null
@@ -0,0 +1,59 @@
+#!/bin/bash -ex
+#   ============LICENSE_START=======================================================
+#    Copyright (C) 2019 ENEA AB. All rights reserved.
+#   ================================================================================
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+#
+#   SPDX-License-Identifier: Apache-2.0
+#   ============LICENSE_END=========================================================
+
+# This script creates the multi-arch manifest for the docker images
+
+# shellcheck source=/dev/null
+source version.properties
+IMAGES="onap/policy-base-alpine onap/policy-common-alpine"
+ARCHES="amd64 arm64"
+TIMESTAMP=$(date -u +"%Y%m%d%H%M%S")
+MT_RELEASE='v0.9.0'
+
+# Download the manifest tool based on the host's architecture
+HOST_ARCH='amd64'
+if [ "$(uname -m)" == 'aarch64' ]; then
+    HOST_ARCH='arm64'
+fi
+wget https://github.com/estesp/manifest-tool/releases/download/${MT_RELEASE}/manifest-tool-linux-${HOST_ARCH} -O ./manifest-tool
+chmod u+x manifest-tool
+
+# Tag the images and push the manifest (do not fail if some prerequisite tags are not yet present)
+set +e
+for image in ${IMAGES}; do
+    # always (re)create both SNAPSHOT and STAGING tags to make sure everything is up to date
+    TAGS="latest ${release_version} ${release_version}-SNAPSHOT ${release_version}-SNAPSHOT-latest ${release_version}-STAGING-latest"
+    for tag in ${TAGS}; do
+        ./manifest-tool push from-args \
+            --ignore-missing \
+            --platforms "linux/${ARCHES// /,linux/}" \
+            --template "${image}:${tag}-ARCH" \
+            --target "${image}:${tag}"
+    done
+
+    # Create timestamped multiarch tag; if the script is ran from the merge
+    # job then add the SNAPSHOT suffix
+    [[ "${PARENT_JOB_NAME}" =~ merge ]] && snapshot_suffix="SNAPSHOT-"
+
+    ./manifest-tool push from-args \
+        --ignore-missing \
+        --platforms "linux/${ARCHES// /,linux/}" \
+        --template "${image}:${release_version}-${snapshot_suffix:-}ARCH" \
+        --target "${image}:${release_version}-${snapshot_suffix:-}${TIMESTAMP}"
+done
index 028cf46..d58a777 100644 (file)
@@ -26,7 +26,7 @@
     <parent>
         <groupId>org.onap.policy.docker</groupId>
         <artifactId>policy-base</artifactId>
-        <version>1.5.0-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
 
     <packaging>pom</packaging>
@@ -43,7 +43,7 @@
                 <version>1.0</version>
                 <executions>
                     <execution>
-                        <phase>validate</phase>
+                        <phase>pre-clean</phase>
                         <goals>
                             <goal>execute</goal>
                         </goals>
                                 }
 
                                 println 'New tag for docker: ' + project.properties['project.docker.latesttag.version'];
+                                if ( "aarch64".equals(System.properties['os.arch']) ) {
+                                    project.properties['project.docker.arch'] = "arm64";
+                                } else {
+                                    project.properties['project.docker.arch'] = System.properties['os.arch'];
+                                }
+                                println 'Using arch for docker: ' + project.properties['project.docker.arch'];
                             </source>
                         </configuration>
                     </execution>
 
                     <images>
                         <image>
-                            <name>onap/policy-base-alpine</name>
+                            <name>onap/policy-base-alpine:latest-${project.docker.arch}</name>
                             <build>
                                 <cleanup>try</cleanup>
                                 <dockerFile>Dockerfile</dockerFile>
                                 <tags>
-                                    <tag>${project.version}</tag>
-                                    <tag>${project.version}-${maven.build.timestamp}</tag>
-                                    <tag>${project.docker.latesttag.version}</tag>
+                                    <tag>${project.version}-${project.docker.arch}</tag>
+                                    <tag>${project.docker.latesttag.version}-${project.docker.arch}</tag>
                                 </tags>
                             </build>
                         </image>
index bae9e63..ac4eaca 100644 (file)
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.onap.policy.docker</groupId>
         <artifactId>docker</artifactId>
-        <version>1.5.0-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>policy-base</artifactId>
@@ -37,9 +37,8 @@
         <docker.skip>false</docker.skip>
         <docker.skip.build>false</docker.skip.build>
         <docker.skip.push>false</docker.skip.push>
-        <docker.pull.registry>nexus3.onap.org:10001</docker.pull.registry>
-        <docker.push.registry>nexus3.onap.org:10003</docker.push.registry>
-        <maven.build.timestamp.format>yyyyMMdd'T'HHmm</maven.build.timestamp.format>
+        <docker.pull.registry>docker.io</docker.pull.registry>
+        <docker.push.registry>docker.io</docker.push.registry>
     </properties>
 
     <profiles>
index bc4211b..b36221c 100644 (file)
@@ -26,7 +26,7 @@
     <parent>
         <groupId>org.onap.policy.docker</groupId>
         <artifactId>policy-common</artifactId>
-        <version>1.5.0-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
 
     <packaging>pom</packaging>
@@ -43,7 +43,7 @@
                 <version>1.0</version>
                 <executions>
                     <execution>
-                        <phase>validate</phase>
+                        <phase>pre-clean</phase>
                         <goals>
                             <goal>execute</goal>
                         </goals>
                                 }
 
                                 println 'New tag for docker: ' + project.properties['project.docker.latesttag.version'];
+                                if ( "aarch64".equals(System.properties['os.arch']) ) {
+                                    project.properties['project.docker.arch'] = "arm64";
+                                } else {
+                                    project.properties['project.docker.arch'] = System.properties['os.arch'];
+                                }
+                                println 'Using arch for docker: ' + project.properties['project.docker.arch'];
                             </source>
                         </configuration>
                     </execution>
                     <pushRegistry>${docker.push.registry}</pushRegistry>
                     <images>
                         <image>
-                            <name>onap/policy-common-alpine</name>
+                            <name>onap/policy-common-alpine:latest-${project.docker.arch}</name>
                             <build>
                                 <cleanup>try</cleanup>
                                 <dockerFile>Dockerfile</dockerFile>
                                 <tags>
-                                    <tag>${project.version}</tag>
-                                    <tag>${project.version}-${maven.build.timestamp}</tag>
-                                    <tag>${project.docker.latesttag.version}</tag>
+                                    <tag>${project.version}-${project.docker.arch}</tag>
+                                    <tag>${project.docker.latesttag.version}-${project.docker.arch}</tag>
                                 </tags>
                                 <args>
                                     <BUILD_VERSION>${docker.build.version}</BUILD_VERSION>
index 96f4df5..ba8d2d1 100644 (file)
@@ -17,9 +17,9 @@
 #   ============LICENSE_END=========================================================
 
 #
-# Docker file to build an image that contains commom packages for Policy components
+# Docker file to build an image that contains common packages for Policy components
 #
-FROM onap/policy-base-alpine
+FROM onap/policy-base-alpine:latest-${project.docker.arch}
 
 LABEL maintainer="Policy Team"
 
index 433fd00..d63bf4e 100644 (file)
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.onap.policy.docker</groupId>
         <artifactId>docker</artifactId>
-        <version>1.5.0-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>policy-common</artifactId>
@@ -37,9 +37,8 @@
         <docker.skip>false</docker.skip>
         <docker.skip.build>false</docker.skip.build>
         <docker.skip.push>false</docker.skip.push>
-        <docker.pull.registry>nexus3.onap.org:10001</docker.pull.registry>
-        <docker.push.registry>nexus3.onap.org:10003</docker.push.registry>
-        <maven.build.timestamp.format>yyyyMMdd'T'HHmm</maven.build.timestamp.format>
+        <docker.pull.registry>docker.io</docker.pull.registry>
+        <docker.push.registry>docker.io</docker.push.registry>
         <docker.build.version>${project.version}</docker.build.version>
     </properties>
 
diff --git a/pom.xml b/pom.xml
index 1b55d6d..a1e47bf 100644 (file)
--- a/pom.xml
+++ b/pom.xml
     <parent>
         <groupId>org.onap.policy.parent</groupId>
         <artifactId>integration</artifactId>
-        <version>3.0.1-SNAPSHOT</version>
+        <version>3.0.1</version>
         <relativePath />
     </parent>
 
     <groupId>org.onap.policy.docker</groupId>
     <artifactId>docker</artifactId>
-    <version>1.5.0-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
 
     <packaging>pom</packaging>
     <name>Policy Docker images</name>
index 99af342..a3ac0d9 100644 (file)
@@ -2,8 +2,8 @@
 # Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... )
 # because they are used in Jenkins, whose plug-in doesn't support
 
-major=1
-minor=5
+major=2
+minor=0
 patch=0
 
 base_version=${major}.${minor}.${patch}