diff --git a/.travis.yml b/.travis.yml index 0127702..065bdc8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,14 +36,15 @@ env: jobs: include: - - stage: build-amd64 + - stage: basic-build if: branch != private-master AND tag IS blank name: "Basic AMD64 build" os: linux env: - MQ_ARCHIVE_REPOSITORY_DEV=$MQ_920_ARCHIVE_REPOSITORY_DEV_AMD64 script: bash -e travis-build-scripts/run.sh - - if: branch = private-master OR tag =~ ^release-candidate* + - stage: build + if: branch = private-master OR tag =~ ^release-candidate* name: "Multi-Arch AMD64 build" os: linux env: @@ -60,7 +61,8 @@ jobs: # # - MQ_ARCHIVE_REPOSITORY=$MQ_920_ARCHIVE_REPOSITORY_PPC64LE # - MQ_ARCHIVE_REPOSITORY_DEV=$MQ_920_ARCHIVE_REPOSITORY_DEV_PPC64LE # script: bash -e travis-build-scripts/run.sh - - if: branch = private-master OR tag =~ ^release-candidate* + - stage: build + if: branch = private-master OR tag =~ ^release-candidate* name: "Multi-Arch S390X build" os: linux-s390 env: @@ -69,7 +71,10 @@ jobs: - MQ_ARCHIVE_REPOSITORY=$MQ_920_ARCHIVE_REPOSITORY_S390X - MQ_ARCHIVE_REPOSITORY_DEV=$MQ_920_ARCHIVE_REPOSITORY_DEV_S390X script: bash -e travis-build-scripts/run.sh - + - stage: push-manifest + if: branch = private-master OR tag =~ ^release-candidate* + name: "Push Manifest-list to registry" + script: make push-manifest before_install: - make install-build-deps - make install-credential-helper @@ -80,4 +85,4 @@ install: before_script: echo nothing after_success: - - make lint + - make lint \ No newline at end of file diff --git a/Makefile b/Makefile index b739214..c8032ef 100644 --- a/Makefile +++ b/Makefile @@ -78,6 +78,7 @@ BASE_IMAGE_TAG=$(lastword $(subst /, ,$(subst :,-,$(BASE_IMAGE)))) MQ_IMAGE_DEVSERVER_BASE=mqadvanced-server-dev-base # Docker image name to use for JMS tests DEV_JMS_IMAGE=mq-dev-jms-test +MQ_DELIVERY_REGISTRY_NAMESPACE=kd # Variables for versioning IMAGE_REVISION=$(shell git rev-parse HEAD) IMAGE_SOURCE=$(shell git config --get remote.origin.url) @@ -117,6 +118,25 @@ endif MQ_IMAGE_FULL_RELEASE_NAME=$(MQ_IMAGE_ADVANCEDSERVER):$(MQ_TAG) MQ_IMAGE_DEV_FULL_RELEASE_NAME=$(MQ_IMAGE_DEVSERVER):$(MQ_TAG) +#setup variables for fat-manifests +ifneq "$(RELEASE)" "$(EMPTY)" + MQ_MANIFEST_TAG=$(MQ_VERSION)-$(RELEASE) + MQ_IMAGE_DEVSERVER_MANIFEST=$(MQ_IMAGE_DEVSERVER):$(MQ_MANIFEST_TAG) + MQ_IMAGE_ADVANCEDSERVER_MANIFEST=$(MQ_IMAGE_ADVANCEDSERVER):$(MQ_MANIFEST_TAG) + MQ_IMAGE_DEVSERVER_AMD64=$(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_DEVSERVER):$(MQ_MANIFEST_TAG)-amd64 + MQ_IMAGE_DEVSERVER_S390X=$(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_DEVSERVER):$(MQ_MANIFEST_TAG)-s390x + MQ_IMAGE_ADVANCEDSERVER_AMD64=$(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_ADVANCEDSERVER):$(MQ_MANIFEST_TAG)-amd64 + MQ_IMAGE_ADVANCEDSERVER_S390X=$(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_ADVANCEDSERVER):$(MQ_MANIFEST_TAG)-S390X +else + MQ_MANIFEST_TAG=$(MQ_VERSION) + MQ_IMAGE_DEVSERVER_MANIFEST=$(MQ_IMAGE_DEVSERVER):$(MQ_MANIFEST_TAG) + MQ_IMAGE_ADVANCEDSERVER_MANIFEST=$(MQ_IMAGE_ADVANCEDSERVER):$(MQ_MANIFEST_TAG) + MQ_IMAGE_DEVSERVER_AMD64=$(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_DEVSERVER):$(MQ_MANIFEST_TAG)-amd64 + MQ_IMAGE_DEVSERVER_S390X=$(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_DEVSERVER):$(MQ_MANIFEST_TAG)-s390x + MQ_IMAGE_ADVANCEDSERVER_AMD64=$(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_ADVANCEDSERVER):$(MQ_MANIFEST_TAG)-amd64 + MQ_IMAGE_ADVANCEDSERVER_S390X=$(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_ADVANCEDSERVER):$(MQ_MANIFEST_TAG)-s390x +endif + ############################################################################### # Build targets ############################################################################### @@ -345,6 +365,26 @@ pull-devserver: $(COMMAND) pull $(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_DEV_FULL_RELEASE_NAME) $(COMMAND) tag $(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_DEV_FULL_RELEASE_NAME) $(MQ_IMAGE_DEVSERVER)\:$(MQ_TAG) +.PHONY: push-manifest +push-manifest: build-skopeo-container + $(info $(SPACER)$(shell printf $(TITLE)"** Determining the image digests **"$(END))) + $(eval MQ_IMAGE_DEVSERVER_AMD64_DIGEST=$(shell $(COMMAND) run skopeo:latest --override-os linux --override-arch s390x inspect --creds $(MQ_ARCHIVE_REPOSITORY_USER):$(MQ_ARCHIVE_REPOSITORY_CREDENTIAL) docker://$(MQ_IMAGE_DEVSERVER_AMD64) | jq -r .Digest)) + $(eval MQ_IMAGE_DEVSERVER_S390X_DIGEST=$(shell $(COMMAND) run skopeo:latest --override-os linux inspect --creds $(MQ_ARCHIVE_REPOSITORY_USER):$(MQ_ARCHIVE_REPOSITORY_CREDENTIAL) docker://$(MQ_IMAGE_DEVSERVER_S390X) | jq -r .Digest)) + $(eval MQ_IMAGE_ADVANCEDSERVER_AMD64_DIGEST=$(shell $(COMMAND) run skopeo:latest --override-os linux inspect --creds $(MQ_ARCHIVE_REPOSITORY_USER):$(MQ_ARCHIVE_REPOSITORY_CREDENTIAL) docker://$(MQ_IMAGE_ADVANCEDSERVER_AMD64) | jq -r .Digest)) + $(eval MQ_IMAGE_ADVANCEDSERVER_S390X_DIGEST=$(shell $(COMMAND) run skopeo:latest --override-os linux inspect --creds $(MQ_ARCHIVE_REPOSITORY_USER):$(MQ_ARCHIVE_REPOSITORY_CREDENTIAL) docker://$(MQ_IMAGE_ADVANCEDSERVER_S390X) | jq -r .Digest)) + $(info $(shell printf "** Determined the built $(MQ_IMAGE_DEVSERVER_AMD64) has a digest of $(MQ_IMAGE_DEVSERVER_AMD64_DIGEST)**"$(END))) + $(info $(shell printf "** Determined the built $(MQ_IMAGE_DEVSERVER_S390X) has a digest of $(MQ_IMAGE_DEVSERVER_S390X_DIGEST)**"$(END))) + $(info $(shell printf "** Determined the built $(MQ_IMAGE_ADVANCEDSERVER_AMD64) has a digest of $(MQ_IMAGE_ADVANCEDSERVER_AMD64_DIGEST)**"$(END))) + $(info $(shell printf "** Determined the built $(MQ_IMAGE_ADVANCEDSERVER_S390X) has a digest of $(MQ_IMAGE_ADVANCEDSERVER_S390X_DIGEST)**"$(END))) + $(info $(shell printf "** Calling script to create fat-manifest for $(MQ_IMAGE_DEVSERVER_MANIFEST)**"$(END))) + echo $(shell ./travis-build-scripts/create-manifest-list.sh -r $(MQ_DELIVERY_REGISTRY_HOSTNAME) -n $(MQ_DELIVERY_REGISTRY_NAMESPACE) -i $(MQ_IMAGE_DEVSERVER) -t $(MQ_MANIFEST_TAG) -u $(MQ_ARCHIVE_REPOSITORY_USER) -p $(MQ_ARCHIVE_REPOSITORY_CREDENTIAL) -d "$(MQ_IMAGE_DEVSERVER_AMD64_DIGEST) $(MQ_IMAGE_DEVSERVER_S390X_DIGEST)" $(END)) + $(info $(shell printf "** Calling script to create fat-manifest for $(MQ_IMAGE_ADVANCEDSERVER_MANIFEST)**"$(END))) + echo $(shell ./travis-build-scripts/create-manifest-list.sh -r $(MQ_DELIVERY_REGISTRY_HOSTNAME) -n $(MQ_DELIVERY_REGISTRY_NAMESPACE) -i $(MQ_IMAGE_ADVANCEDSERVER) -t $(MQ_MANIFEST_TAG) -u $(MQ_ARCHIVE_REPOSITORY_USER) -p $(MQ_ARCHIVE_REPOSITORY_CREDENTIAL) -d "$(MQ_IMAGE_ADVANCEDSERVER_AMD64_DIGEST) $(MQ_IMAGE_ADVANCEDSERVER_S390X_DIGEST)" $(END)) + +.PHONY: build-skopeo-container +build-skopeo-container: + $(COMMAND) images | grep -q "skopeo"; if [ $$? != 0 ]; then docker build -t skopeo:latest ./docker-builds/skopeo/; fi + .PHONY: clean clean: rm -rf ./coverage diff --git a/docker-builds/skopeo/Dockerfile b/docker-builds/skopeo/Dockerfile new file mode 100644 index 0000000..7447e46 --- /dev/null +++ b/docker-builds/skopeo/Dockerfile @@ -0,0 +1,17 @@ +# © Copyright IBM Corporation 2020 +# +# 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. + +FROM fedora:32 +RUN yum install skopeo -y -qq +ENTRYPOINT [ "skopeo" ] diff --git a/travis-build-scripts/create-manifest-list.sh b/travis-build-scripts/create-manifest-list.sh new file mode 100755 index 0000000..830082a --- /dev/null +++ b/travis-build-scripts/create-manifest-list.sh @@ -0,0 +1,90 @@ +#!/bin/bash + +# © Copyright IBM Corporation 2020 +# +# 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. + +set -e + +usage=" +Usage: create-image-manifest.sh -r hyc-mq-container-team-docker-local.artifactory.swg-devops.com -n foo -i ibm-mqadvanced-server-dev -t test -d \"sha256:038ad492532b099c324b897ce9da31ae0be312a1d0063f6456f2e3143cc4f4b8 sha256:754f466cf2cfc5183ac705689ce6720f27fecd07c97970ba3ec48769acba067d\" + +Where: +-r - The image registry hostname +-n - The image registry namespace +-i - The image name +-t - The desired top level manifest tag +-d - A space separated list of sha256 image digests to be included +" + +GREEN="\033[32m" +RED="\033[31m" +BLUE="\033[34m" +PURPLE="\033[35m" +AQUA="\033[36m" + +END="\033[0m" + +UNDERLINE="\033[4m" +BOLD="\033[1m" +ITALIC="\033[3m" +TITLE=${BLUE}${BOLD}${UNDERLINE} +STEPTITLE=${BLUERIGHTARROW}" "${BOLD}${ITALIC} +SUBSTEPTITLE=${MINIARROW}${MINIARROW}${MINIARROW}" "${ITALIC} +RIGHTARROW="\xE2\x96\xB6" +MINIARROW="\xE2\x96\xBB" +BLUERIGHTARROW=${BLUE}${RIGHTARROW}${END} +GREENRIGHTARROW=${GREEN}${RIGHTARROW}${END} + +ERROR=${RED} + +TICK="\xE2\x9C\x94" +CROSS="\xE2\x9C\x97" +GREENTICK=${GREEN}${TICK}${END} +REDCROSS=${RED}${CROSS}${END} + + +SPACER="\n\n" + +while getopts r:n:i:t:d:h:u:p: flag +do + case "${flag}" in + r) REGISTRY=${OPTARG};; + n) NAMESPACE=${OPTARG};; + i) IMAGE=${OPTARG};; + t) TAG=${OPTARG};; + d) DIGESTS=${OPTARG};; + u) USER=${OPTARG};; + p) CREDENTIAL=${OPTARG};; + esac +done + +if [[ -z $REGISTRY || -z $NAMESPACE || -z $IMAGE || -z $TAG || -z $DIGESTS ]] ; then + printf "${REDCROSS} ${ERROR}Missing parameter!${END}\n" + printf "${ERROR}$usage${END}\n" + exit 1 +fi + +# Docker CLI manifest commands require experimental features to be turned on +export DOCKER_CLI_EXPERIMENTAL=enabled + +MANIFESTS="" +for digest in $DIGESTS ; do \ + MANIFESTS+=" $REGISTRY/$NAMESPACE/$IMAGE@$digest" +done + +docker login $REGISTRY -u $USER -p $CREDENTIAL +docker manifest create $REGISTRY/$NAMESPACE/$IMAGE:$TAG --amend $MANIFESTS > /dev/null +MANIFEST_DIGEST=$(docker manifest push $REGISTRY/$NAMESPACE/$IMAGE:$TAG) + +echo $MANIFEST_DIGEST \ No newline at end of file