diff --git a/.travis.yml b/.travis.yml index 1d06192..c312f2a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,63 +18,73 @@ sudo: required language: go go: - - "1.11" + - "1.12" services: - docker go_import_path: "github.com/ibm-messaging/mq-container" -cache: +cache: directories: - downloads +env: + global: + - RELEASE="" + jobs: include: - - stage: build and test + - stage: build + name: "Basic build" + if: branch != private-master + os: linux + script: bash -e build-scripts/build.sh + - if: branch = private-master + name: "Multi-Arch ADM64 build" + os: linux env: - - BASE_IMAGE=ubuntu:16.04 - - DOCKER_DOWNGRADE="echo nothing to be done" - # TEMPORARY removal of Docker 1.12 test, due to errors from apt repository - # - if: type IN (pull_request) OR tag IS present - # env: - # - BASE_IMAGE=ubuntu:16.04 - # - DOCKER_DOWNGRADE="docker save -o images.tar mqadvanced-server-dev mq-dev-jms-test && - # sudo apt-get autoremove -y docker-ce && - # curl -fsSL \"https://apt.dockerproject.org/gpg\" | sudo apt-key add - && - # sudo apt-add-repository \"deb https://apt.dockerproject.org/repo ubuntu-$(lsb_release -cs) main\" && - # sudo apt-get update && - # sudo apt-get install docker-engine=1.12.6-0~ubuntu-$(lsb_release -cs) && - # docker load -q -i images.tar && - # export DOCKER_API_VERSION=\"1.24\"" + - BUILD_ALL=true + - MQ_ARCHIVE_REPOSITORY=$MQ_ARCHIVE_REPOSITORY_AMD64 + - MQ_ARCHIVE_REPOSITORY_DEV=$MQ_ARCHIVE_REPOSITORY_DEV_AMD64 + script: bash -e build-scripts/build.sh + - if: branch = private-master + name: "Multi-Arch PPC64LE build" + os: linux-ppc64le + env: + - BUILD_ALL=true + - TEST_OPTS_DOCKER="-run TestGoldenPathWithMetrics" + - MQ_ARCHIVE_REPOSITORY=$MQ_ARCHIVE_REPOSITORY_PPC64LE + - MQ_ARCHIVE_REPOSITORY_DEV=$MQ_ARCHIVE_REPOSITORY_DEV_PPC64LE + script: bash -e build-scripts/build.sh + - if: branch = private-master + name: "Multi-Arch S390X build" + os: linux-s390 + env: + - BUILD_ALL=true + - TEST_OPTS_DOCKER="-run TestGoldenPathWithMetrics" + - MQ_ARCHIVE_REPOSITORY=$MQ_ARCHIVE_REPOSITORY_S390X + - MQ_ARCHIVE_REPOSITORY_DEV=$MQ_ARCHIVE_REPOSITORY_DEV_S390X + script: bash -e build-scripts/build.sh + # - stage: deploy + # name: "Pre-release deploy" + # if: tag =~ ^pre-release* + # deploy: + # provider: script + # script: bash -e build-scripts/release.sh staging + # - name: "Production release deploy" + # if: tag =~ ^release-production* + # deploy: + # provider: script + # script: bash -e build-scripts/release.sh production before_install: - - ./install-build-deps-ubuntu.sh + - make install-build-deps install: - echo nothing -before_script: - - echo 'Downloading Go dependencies...' && echo -en 'travis_fold:start:deps\\r' - - make deps - - echo -en 'travis_fold:end:deps\\r' - - echo 'Building Developer image...' && echo -en 'travis_fold:start:build-devserver\\r' - - make build-devserver - - echo -en 'travis_fold:end:build-devserver\\r' - - echo 'Building Developer JMS test image...' && echo -en 'travis_fold:start:build-devjmstest\\r' - - make build-devjmstest - - echo -en 'travis_fold:end:build-devjmstest\\r' - -script: - - echo 'Downgrading Docker (if necessary)...' && echo -en 'travis_fold:start:docker-downgrade\\r' - - eval "$DOCKER_DOWNGRADE" - - echo -en 'travis_fold:end:docker-downgrade\\r' - - echo 'Testing Developer image...' && echo -en 'travis_fold:start:test-devserver\\r' - - make test-devserver - - echo -en 'travis_fold:end:test-devserver\\r' - - echo 'Running gosec scan...' && echo -en 'travis_fold:start:gosec-scan\\r' - - make gosec - - echo -en 'travis_fold:end:gosec-scan\\r' +before_script: echo nothing after_success: - make lint diff --git a/Dockerfile-server b/Dockerfile-server index 0ca6d40..ef3879b 100644 --- a/Dockerfile-server +++ b/Dockerfile-server @@ -56,7 +56,7 @@ RUN go vet ./cmd/... ./internal/... ############################################################################### FROM $BASE_IMAGE:$BASE_TAG AS mq-server # The MQ packages to install - see install-mq.sh for default value -ARG MQ_URL="https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/mqadv_dev912_linux_x86-64.tar.gz" +ARG MQ_URL="https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/mqadv_dev913_linux_x86-64.tar.gz" ARG MQ_PACKAGES="MQSeriesRuntime-*.rpm MQSeriesServer-*.rpm MQSeriesJava*.rpm MQSeriesJRE*.rpm MQSeriesGSKit*.rpm MQSeriesMsg*.rpm MQSeriesSamples*.rpm MQSeriesWeb*.rpm MQSeriesAMS-*.rpm" #ARG MQ_PACKAGES="ibmmq-server ibmmq-java ibmmq-jre ibmmq-gskit ibmmq-msg-.* ibmmq-samples ibmmq-web ibmmq-ams" ARG MQM_UID=888 diff --git a/Makefile b/Makefile index b9d0941..9cd3ce6 100644 --- a/Makefile +++ b/Makefile @@ -16,9 +16,18 @@ # Conditional variables - you can override the values of these variables from # the command line ############################################################################### +# RELEASE shows what release of the container code has been built +RELEASE ?= # MQ_VERSION is the fully qualified MQ version number to build MQ_VERSION ?= 9.1.3.0 -# RELEASE shows what release of the container code has been built +# MQ_ARCHIVE_REPOSITORY is a remote repository from which to pull the MQ_ARCHIVE (if required) +MQ_ARCHIVE_REPOSITORY ?= +# MQ_ARCHIVE_REPOSITORY_DEV is a remote repository from which to pull the MQ_ARCHIVE_DEV (if required) +MQ_ARCHIVE_REPOSITORY_DEV ?= +# MQ_ARCHIVE_REPOSITORY_USER is the user for the remote repository (if required) +MQ_ARCHIVE_REPOSITORY_USER ?= +# MQ_ARCHIVE_REPOSITORY_CREDENTIAL is the password/API key for the remote repository (if required) +MQ_ARCHIVE_REPOSITORY_CREDENTIAL ?= # MQ_ARCHIVE is the name of the file, under the downloads directory, from which MQ Advanced can # be installed. The default value is derived from MQ_VERSION, BASE_IMAGE and architecture # Does not apply to MQ Advanced for Developers. @@ -42,10 +51,20 @@ MQ_PACKAGES ?=MQSeriesRuntime-*.rpm MQSeriesServer-*.rpm MQSeriesJava*.rpm MQSer MQM_UID ?= 888 # COMMAND is the container command to run. "podman" or "docker" COMMAND ?=$(shell type -p podman 2>&1 >/dev/null && echo podman || echo docker) +# MQ_DELIVERY_REGISTRY_HOSTNAME is a remote registry to push the MQ Image to (if required) +MQ_DELIVERY_REGISTRY_HOSTNAME ?= +# MQ_DELIVERY_REGISTRY_NAMESPACE is the namespace/path on the delivery registry (if required) +MQ_DELIVERY_REGISTRY_NAMESPACE ?= +# MQ_DELIVERY_REGISTRY_USER is the user for the remote registry (if required) +MQ_DELIVERY_REGISTRY_USER ?= +# MQ_DELIVERY_REGISTRY_CREDENTIAL is the password/API key for the remote registry (if required) +MQ_DELIVERY_REGISTRY_CREDENTIAL ?= # REGISTRY_USER is the username used to login to the Red Hat registry REGISTRY_USER ?= # REGISTRY_PASS is the password used to login to the Red Hat registry REGISTRY_PASS ?= +# ARCH is the platform architecture (e.g. amd64, ppc64le or s390x) +ARCH ?= $(if $(findstring x86_64,$(shell uname -m)),amd64,$(shell uname -m)) ############################################################################### # Other variables @@ -53,8 +72,6 @@ REGISTRY_PASS ?= GO_PKG_DIRS = ./cmd ./internal ./test MQ_ARCHIVE_TYPE=LINUX MQ_ARCHIVE_DEV_PLATFORM=linux -# ARCH is the platform architecture (e.g. amd64, ppc64le or s390x) -ARCH=$(if $(findstring x86_64,$(shell uname -m)),amd64,$(shell uname -m)) # BUILD_SERVER_CONTAINER is the name of the web server container used at build time BUILD_SERVER_CONTAINER=build-server # NUM_CPU is the number of CPUs available to Docker. Used to control how many @@ -99,6 +116,20 @@ MQ_ARCHIVE_DEV_9.1.1.0=mqadv_dev911_$(MQ_ARCHIVE_DEV_PLATFORM)_$(MQ_DEV_ARCH).ta MQ_ARCHIVE_DEV_9.1.2.0=mqadv_dev912_$(MQ_ARCHIVE_DEV_PLATFORM)_$(MQ_DEV_ARCH).tar.gz MQ_ARCHIVE_DEV_9.1.3.0=mqadv_dev913_$(MQ_ARCHIVE_DEV_PLATFORM)_$(MQ_DEV_ARCH).tar.gz +ifneq "$(RELEASE)" "$(EMPTY)" + MQ_IMAGE_FULL_RELEASE_NAME=ibm-mqadvanced-server:$(MQ_VERSION)-$(RELEASE)-$(ARCH) + MQ_IMAGE_DEV_FULL_RELEASE_NAME=ibm-mqadvanced-server-dev:$(MQ_VERSION)-$(RELEASE)-$(ARCH) +else + MQ_IMAGE_FULL_RELEASE_NAME=ibm-mqadvanced-server:$(MQ_VERSION)-$(ARCH) + MQ_IMAGE_DEV_FULL_RELEASE_NAME=ibm-mqadvanced-server-dev:$(MQ_VERSION)-$(ARCH) +endif + +ifneq "$(MQ_DELIVERY_REGISTRY_NAMESPACE)" "$(EMPTY)" + MQ_DELIVERY_REGISTRY_FULL_PATH=$(MQ_DELIVERY_REGISTRY_HOSTNAME)/$(MQ_DELIVERY_REGISTRY_NAMESPACE) +else + MQ_DELIVERY_REGISTRY_FULL_PATH=$(MQ_DELIVERY_REGISTRY_HOSTNAME) +endif + ############################################################################### # Build targets ############################################################################### @@ -122,12 +153,18 @@ incubating: build-explorer downloads/$(MQ_ARCHIVE_DEV): $(info $(SPACER)$(shell printf $(TITLE)"Downloading IBM MQ Advanced for Developers "$(MQ_VERSION)$(END))) mkdir -p downloads - cd downloads; curl -LO https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/$(MQ_ARCHIVE_DEV) +ifneq "$(MQ_ARCHIVE_REPOSITORY_DEV)" "$(EMPTY)" + curl -u $(MQ_ARCHIVE_REPOSITORY_USER):$(MQ_ARCHIVE_REPOSITORY_CREDENTIAL) -X GET "$(MQ_ARCHIVE_REPOSITORY_DEV)" -o downloads/$(MQ_ARCHIVE_DEV) +else + curl -L https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/$(MQ_ARCHIVE_DEV) -o downloads/$(MQ_ARCHIVE_DEV) +endif -downloads/$(MQ_SDK_ARCHIVE): - $(info $(SPACER)$(shell printf $(TITLE)"Downloading IBM MQ Advanced for Developers "$(MQ_VERSION)$(END))) +downloads/$(MQ_ARCHIVE): + $(info $(SPACER)$(shell printf $(TITLE)"Downloading IBM MQ Advanced "$(MQ_VERSION)$(END))) mkdir -p downloads - cd downloads; curl -LO https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/$(MQ_SDK_ARCHIVE) +ifneq "$(MQ_ARCHIVE_REPOSITORY)" "$(EMPTY)" + curl -u $(MQ_ARCHIVE_REPOSITORY_USER):$(MQ_ARCHIVE_REPOSITORY_CREDENTIAL) -X GET "$(MQ_ARCHIVE_REPOSITORY)" -o downloads/$(MQ_ARCHIVE) +endif .PHONY: downloads downloads: downloads/$(MQ_ARCHIVE_DEV) downloads/$(MQ_SDK_ARCHIVE) @@ -156,7 +193,7 @@ build-devjmstest: test-devserver: test/docker/vendor $(info $(SPACER)$(shell printf $(TITLE)"Test $(MQ_IMAGE_DEVSERVER):$(MQ_TAG) on $(shell docker --version)"$(END))) docker inspect $(MQ_IMAGE_DEVSERVER):$(MQ_TAG) - cd test/docker && TEST_IMAGE=$(MQ_IMAGE_DEVSERVER):$(MQ_TAG) EXPECTED_LICENSE=Developer DEV_JMS_IMAGE=$(DEV_JMS_IMAGE) IBMJRE=true go test -parallel $(NUM_CPU) -tags mqdev $(TEST_OPTS_DOCKER) + cd test/docker && TEST_IMAGE=$(MQ_IMAGE_DEVSERVER):$(MQ_TAG) EXPECTED_LICENSE=Developer DEV_JMS_IMAGE=$(DEV_JMS_IMAGE) IBMJRE=true go test -parallel $(NUM_CPU) -tags mqdev $(TEST_OPTS_DOCKER) .PHONY: coverage coverage: @@ -270,6 +307,7 @@ log-build-vars: @echo ARCH=$(ARCH) @echo MQ_VERSION=$(MQ_VERSION) @echo MQ_ARCHIVE=$(MQ_ARCHIVE) + @echo MQ_ARCHIVE_DEV=$(MQ_ARCHIVE_DEV) @echo MQ_IMAGE_DEVSERVER=$(MQ_IMAGE_DEVSERVER) @echo MQ_IMAGE_ADVANCEDSERVER=$(MQ_IMAGE_ADVANCEDSERVER) @echo COMMAND=$(COMMAND) @@ -284,15 +322,52 @@ log-build-env: log-build-vars include formatting.mk +.PHONY: pull-mq-archive +pull-mq-archive: + curl -u $(MQ_ARCHIVE_REPOSITORY_USER):$(MQ_ARCHIVE_REPOSITORY_CREDENTIAL) -X GET "$(MQ_ARCHIVE_REPOSITORY)" -o downloads/$(MQ_ARCHIVE) + +.PHONY: pull-mq-archive-dev +pull-mq-archive-dev: + curl -u $(MQ_ARCHIVE_REPOSITORY_USER):$(MQ_ARCHIVE_REPOSITORY_CREDENTIAL) -X GET "$(MQ_ARCHIVE_REPOSITORY_DEV)" -o downloads/$(MQ_ARCHIVE_DEV) + +.PHONY: push-advancedserver +push-advancedserver: + $(info $(SPACER)$(shell printf $(TITLE)"Push production image to $(MQ_DELIVERY_REGISTRY_FULL_PATH)"$(END))) + docker login $(MQ_DELIVERY_REGISTRY_HOSTNAME) -u $(MQ_DELIVERY_REGISTRY_USER) -p $(MQ_DELIVERY_REGISTRY_CREDENTIAL) + docker tag $(MQ_IMAGE_ADVANCEDSERVER)\:$(MQ_TAG) $(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_FULL_RELEASE_NAME) + docker push $(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_FULL_RELEASE_NAME) + +.PHONY: push-devserver +push-devserver: + $(info $(SPACER)$(shell printf $(TITLE)"Push developer image to $(MQ_DELIVERY_REGISTRY_FULL_PATH)"$(END))) + echo $(ARCH) + docker login $(MQ_DELIVERY_REGISTRY_HOSTNAME) -u $(MQ_DELIVERY_REGISTRY_USER) -p $(MQ_DELIVERY_REGISTRY_CREDENTIAL) + docker tag $(MQ_IMAGE_DEVSERVER)\:$(MQ_TAG) $(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_DEV_FULL_RELEASE_NAME) + docker push $(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_DEV_FULL_RELEASE_NAME) + +.PHONY: pull-advancedserver +pull-advancedserver: + $(info $(SPACER)$(shell printf $(TITLE)"Pull production image from $(MQ_DELIVERY_REGISTRY_FULL_PATH)"$(END))) + docker login $(MQ_DELIVERY_REGISTRY_HOSTNAME) -u $(MQ_DELIVERY_REGISTRY_USER) -p $(MQ_DELIVERY_REGISTRY_CREDENTIAL) + docker pull $(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_FULL_RELEASE_NAME) + docker tag $(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_FULL_RELEASE_NAME) $(MQ_IMAGE_FULL_RELEASE_NAME) + +.PHONY: pull-devserver +pull-devserver: + $(info $(SPACER)$(shell printf $(TITLE)"Push developer image to $(MQ_DELIVERY_REGISTRY_FULL_PATH)"$(END))) + docker login $(MQ_DELIVERY_REGISTRY_HOSTNAME) -u $(MQ_DELIVERY_REGISTRY_USER) -p $(MQ_DELIVERY_REGISTRY_CREDENTIAL) + docker pull $(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_DEV_FULL_RELEASE_NAME) + docker tag $(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_DEV_FULL_RELEASE_NAME) $(MQ_IMAGE_DEV_FULL_RELEASE_NAME) + .PHONY: clean clean: rm -rf ./coverage rm -rf ./build rm -rf ./deps -.PHONY: deps -deps: - glide install --strip-vendor +.PHONY: install-build-deps +install-build-deps: + ARCH=$(ARCH) ./install-build-deps.sh .PHONY: build-cov build-cov: diff --git a/build-scripts/build.sh b/build-scripts/build.sh new file mode 100755 index 0000000..f5f5182 --- /dev/null +++ b/build-scripts/build.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# © Copyright IBM Corporation 2019 +# +# 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 + +echo 'Downgrading Docker (if necessary)...' && echo -en 'travis_fold:start:docker-downgrade\\r' +eval "$DOCKER_DOWNGRADE" +echo -en 'travis_fold:end:docker-downgrade\\r' +echo 'Building Developer JMS test image...' && echo -en 'travis_fold:start:build-devjmstest\\r' +make build-devjmstest +echo -en 'travis_fold:end:build-devjmstest\\r' +if [ "$BUILD_ALL" = true ] ; then + echo 'Building Developer image...' && echo -en 'travis_fold:start:build-devserver\\r' + make build-devserver + echo -en 'travis_fold:end:build-devserver\\r' + echo 'Building Production image...' && echo -en 'travis_fold:start:build-advancedserver\\r' + make build-advancedserver + echo -en 'travis_fold:end:build-advancedserver\\r' +else + echo 'Building Developer image...' && echo -en 'travis_fold:start:build-devserver\\r' + make build-devserver + echo -en 'travis_fold:end:build-devserver\\r' +fi +./build-scripts/test.sh diff --git a/glide.yaml b/build-scripts/push-dev.sh old mode 100644 new mode 100755 similarity index 53% rename from glide.yaml rename to build-scripts/push-dev.sh index 179a79c..bf7b39c --- a/glide.yaml +++ b/build-scripts/push-dev.sh @@ -1,4 +1,6 @@ -# © Copyright IBM Corporation 2017, 2019 +#!/bin/bash + +# © Copyright IBM Corporation 2019 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -12,19 +14,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -package: github.com/ibm-messaging/mq-container -license: Apache-2.0 -excludeDirs: -- build -- coverage -- test -import: -- package: golang.org/x/sys/unix -- package: github.com/prometheus/client_golang - version: 0.8.0 -- package: github.com/ibm-messaging/mq-golang - version: 2.0.0 -- package: github.com/genuinetools/amicontained - version: 0.4.0 -- package: software.sslmate.com/src/go-pkcs12 - commit: 6e380ad96778cc63c6ea17649a9b74224bceafe9 \ No newline at end of file +set -e + +if [ ! -z $1 ]; then + export ARCH=$1 +fi + +if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then + echo Not pushing as we are a pull request + exit 0 +fi + +echo 'Pushing Developer image...' && echo -en 'travis_fold:start:push-devserver\\r' +make push-devserver +echo -en 'travis_fold:end:push-devserver\\r' diff --git a/build-scripts/push-prod.sh b/build-scripts/push-prod.sh new file mode 100755 index 0000000..c002a41 --- /dev/null +++ b/build-scripts/push-prod.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# © Copyright IBM Corporation 2019 +# +# 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 + +if [ ! -z $1 ]; then + export ARCH=$1 +fi + +if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then + echo Not pushing as we are a pull request + exit 0 +fi + +echo 'Pushing Production image...' && echo -en 'travis_fold:start:push-advancedserver\\r' +make push-advancedserver +echo -en 'travis_fold:end:push-advancedserver\\r' diff --git a/build-scripts/release.sh b/build-scripts/release.sh new file mode 100755 index 0000000..1ddb92e --- /dev/null +++ b/build-scripts/release.sh @@ -0,0 +1,96 @@ +#!/bin/bash + +# © Copyright IBM Corporation 2019 +# +# 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 + +# staging or production +TYPE="" +MANIFEST_FILE=manifest-9.1.4.yaml + +# set type of release +if [ ! -z $1 ]; then + case "$1" in + staging) TYPE=$1 + ;; + production) TYPE=$1 + ;; + *) echo "echo Release type ( staging | production ) must passed to release.sh" + exit 1 + ;; + esac +else + echo "Release type ( staging | production ) must passed to release.sh" + exit 1 +fi + +if [ TYPE = "staging" ]; then + # push developer image to pre-release registry + ./build-scripts/push-dev.sh amd64 + ./build-scripts/push-dev.sh ppc64le + ./build-scripts/push-dev.sh s390x + + # staging registry + export MQ_DELIVERY_REGISTRY_HOSTNAME=$MQ_STAGING_REGISTRY + export MQ_DELIVERY_REGISTRY_USER=$MQ_STAGING_REGISTRY_USER + export MQ_DELIVERY_REGISTRY_CREDENTIAL=$MQ_STAGING_REGISTRY_CREDENTIAL + + # push production image to staging registy + ./build-scripts/push-prod.sh amd64 + ./build-scripts/push-prod.sh ppc64le + ./build-scripts/push-prod.sh s390x + +elif [ TYPE = "production" ]; then + # pull developer image from pre-release registry + make pull-devserver + # pull production image from staging + export MQ_DELIVERY_REGISTRY_HOSTNAME=$MQ_STAGING_REGISTRY + export MQ_DELIVERY_REGISTRY_USER=$MQ_STAGING_REGISTRY_USER + export MQ_DELIVERY_REGISTRY_CREDENTIAL=$MQ_STAGING_REGISTRY_CREDENTIAL + make pull-advancedserver + + # release developer images with fat manifests + # dockerhub + export MQ_DELIVERY_REGISTRY_HOSTNAME=ibmcom + export MQ_DELIVERY_REGISTRY_NAMESPACE=mq + export MQ_DELIVERY_REGISTRY_USER=$MQ_DOCKERHUB_REGISTRY_USER + export MQ_DELIVERY_REGISTRY_CREDENTIAL=$MQ_DOCKERHUB_REGISTRY_CREDENTIAL + # UNCOMMENT WHEN FINISHED TESTING + # ./build-scripts/push-dev.sh amd64 + # ./build-scripts/push-dev.sh ppc64le + # ./build-scripts/push-dev.sh s390x + + docker login --username $MQ_DOCKERHUB_REGISTRY_USER --password $MQ_DOCKERHUB_REGISTRY_CREDENTIAL + # ./manifest-tool-linux-amd64 push from-spec manifests/dockerhub/$MANIFEST_FILE + # ./manifest-tool-linux-amd64 push from-spec manifests/dockerhub/manifest-latest.yaml + + # dockerstore + export MQ_DELIVERY_REGISTRY_HOSTNAME=ibmcorp + export MQ_DELIVERY_REGISTRY_NAMESPACE="" + # ./build-scripts/push-dev.sh amd64 + # ./build-scripts/push-dev.sh ppc64le + # ./build-scripts/push-dev.sh s390x + + # docker login --username $MQ_DOCKERHUB_REGISTRY_USER --password $MQ_DOCKERHUB_REGISTRY_CREDENTIAL + # ./manifest-tool-linux-amd64 push from-spec manifests/dockerstore/$MANIFEST_FILE + + # release production image + export MQ_DELIVERY_REGISTRY_HOSTNAME=$MQ_PRODUCTION_REGISTRY + export MQ_DELIVERY_REGISTRY_USER=$MQ_PRODUCTION_REGISTRY_USER + export MQ_DELIVERY_REGISTRY_CREDENTIAL=$MQ_PRODUCTION_REGISTRY_CREDENTIAL + # ./build-scripts/push-prod.sh amd64 + # ./build-scripts/push-prod.sh ppc64le + # ./build-scripts/push-prod.sh s390x +fi diff --git a/build-scripts/test.sh b/build-scripts/test.sh new file mode 100755 index 0000000..6c336ae --- /dev/null +++ b/build-scripts/test.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# © Copyright IBM Corporation 2019 +# +# 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 + +echo 'Testing Developer image...' && echo -en 'travis_fold:start:test-devserver\\r' +make test-devserver +echo -en 'travis_fold:end:test-devserver\\r' +if [ "$BUILD_ALL" = true ] ; then + echo 'Testing Production image...' && echo -en 'travis_fold:start:test-advancedserver\\r' + make test-advancedserver + echo -en 'travis_fold:end:test-advancedserver\\r' +fi +echo 'Running gosec scan...' && echo -en 'travis_fold:start:gosec-scan\\r' +if [ "$ARCH" = "amd64" ] ; then + make gosec +else + echo "Gosec not available on ppc64le/s390x...skipping gosec scan" +fi +echo -en 'travis_fold:end:gosec-scan\\r' +if [ "$BUILD_ALL" = true ] ; then + ./build-scripts/push-dev.sh + ./build-scripts/push-prod.sh +fi diff --git a/glide.lock b/glide.lock deleted file mode 100644 index 716e277..0000000 --- a/glide.lock +++ /dev/null @@ -1,57 +0,0 @@ -hash: 6ebd5fb1c39729378c7256da6f312e9699bff1ddff9941d3c8c1ba785e22acfd -updated: 2019-05-21T10:38:01.227081+01:00 -imports: -- name: github.com/beorn7/perks - version: 3a771d992973f24aa725d07868b467d1ddfceafb - subpackages: - - quantile -- name: github.com/genuinetools/amicontained - version: fcae88544f0212fbb1e20699c41566655b68679b - subpackages: - - container -- name: github.com/golang/protobuf - version: 70b3af33377e7aa25ae42977bed93cc6b90f0373 - subpackages: - - proto -- name: github.com/ibm-messaging/mq-golang - version: 1b2a2ad95ba3c555944be28097d392c27bda4071 - subpackages: - - ibmmq - - mqmetric -- name: github.com/matttproud/golang_protobuf_extensions - version: c12348ce28de40eed0136aa2b644d0ee0650e56c - subpackages: - - pbutil -- name: github.com/prometheus/client_golang - version: c5b7fccd204277076155f10851dad72b76a49317 - subpackages: - - prometheus -- name: github.com/prometheus/client_model - version: 5c3871d89910bfb32f5fcab2aa4b9ec68e65a99f - subpackages: - - go -- name: github.com/prometheus/common - version: 7600349dcfe1abd18d72d3a1770870d9800a7801 - subpackages: - - expfmt - - internal/bitbucket.org/ww/goautoneg - - model -- name: github.com/prometheus/procfs - version: ae68e2d4c00fed4943b5f6698d504a5fe083da8a - subpackages: - - internal/util - - nfs - - xfs -- name: github.com/syndtr/gocapability - version: 33e07d32887e1e06b7c025f27ce52f62c7990bc0 - subpackages: - - capability -- name: golang.org/x/sys - version: 1b2967e3c290b7c545b3db0deeda16e9be4f98a2 - subpackages: - - unix -- name: software.sslmate.com/src/go-pkcs12 - version: 6e380ad96778cc63c6ea17649a9b74224bceafe9 - subpackages: - - internal/rc2 -testImports: [] diff --git a/install-build-deps-ubuntu.sh b/install-build-deps.sh similarity index 86% rename from install-build-deps-ubuntu.sh rename to install-build-deps.sh index c4b5ddd..8168d6c 100755 --- a/install-build-deps-ubuntu.sh +++ b/install-build-deps.sh @@ -19,9 +19,8 @@ set -ex -curl https://glide.sh/get | sh -sudo curl -Lo /usr/local/bin/dep https://github.com/golang/dep/releases/download/v0.5.0/dep-linux-amd64 +sudo curl -Lo /usr/local/bin/dep https://github.com/golang/dep/releases/download/v0.5.1/dep-linux-$ARCH sudo chmod +x /usr/local/bin/dep go get -u golang.org/x/lint/golint -curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s -- -b $GOPATH/bin 2.0.0 \ No newline at end of file +curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s -- -b $GOPATH/bin 2.0.0 || echo "Gosec not installed. Platform may not be supported." diff --git a/test/docker/docker_api_test_util.go b/test/docker/docker_api_test_util.go index 30941df..72e2176 100644 --- a/test/docker/docker_api_test_util.go +++ b/test/docker/docker_api_test_util.go @@ -380,6 +380,78 @@ func runContainerOneShotWithVolume(t *testing.T, cli *client.Client, bind string return rc, out } +func startMultiVolumeQueueManager(t *testing.T, cli *client.Client, dataVol bool, qmsharedlogs string, qmshareddata string, env []string) (error, string, string) { + id := strconv.FormatInt(time.Now().UnixNano(), 10) + qmdata := createVolume(t, cli, id) + containerConfig := container.Config{ + Image: imageName(), + Env: env, + } + var hostConfig container.HostConfig + + if !dataVol { + hostConfig = container.HostConfig{} + } else if qmsharedlogs == "" && qmshareddata == "" { + hostConfig = getHostConfig(t, 1, "", "", qmdata.Name) + } else if qmsharedlogs == "" { + hostConfig = getHostConfig(t, 2, "", qmshareddata, qmdata.Name) + } else if qmshareddata == "" { + hostConfig = getHostConfig(t, 3, qmsharedlogs, "", qmdata.Name) + } else { + hostConfig = getHostConfig(t, 4, qmsharedlogs, qmshareddata, qmdata.Name) + } + networkingConfig := network.NetworkingConfig{} + qm, err := cli.ContainerCreate(context.Background(), &containerConfig, &hostConfig, &networkingConfig, t.Name()+id) + if err != nil { + return err, "", "" + } + startContainer(t, cli, qm.ID) + + return nil, qm.ID, qmdata.Name +} + +func getHostConfig(t *testing.T, mounts int, qmsharedlogs string, qmshareddata string, qmdata string) container.HostConfig { + + var hostConfig container.HostConfig + + switch mounts { + case 1: + hostConfig = container.HostConfig{ + Binds: []string{ + coverageBind(t), + qmdata + ":/mnt/mqm", + }, + } + case 2: + hostConfig = container.HostConfig{ + Binds: []string{ + coverageBind(t), + qmdata + ":/mnt/mqm", + qmshareddata + ":/mnt/mqm-data", + }, + } + case 3: + hostConfig = container.HostConfig{ + Binds: []string{ + coverageBind(t), + qmdata + ":/mnt/mqm", + qmsharedlogs + ":/mnt/mqm-log", + }, + } + case 4: + hostConfig = container.HostConfig{ + Binds: []string{ + coverageBind(t), + qmdata + ":/mnt/mqm", + qmsharedlogs + ":/mnt/mqm-log", + qmshareddata + ":/mnt/mqm-data", + }, + } + } + + return hostConfig +} + func startContainer(t *testing.T, cli *client.Client, ID string) { t.Logf("Starting container: %v", ID) startOptions := types.ContainerStartOptions{} diff --git a/test/docker/mq_multi_instance_test_util.go b/test/docker/mq_multi_instance_test_util.go index c8864e0..969527f 100644 --- a/test/docker/mq_multi_instance_test_util.go +++ b/test/docker/mq_multi_instance_test_util.go @@ -19,13 +19,10 @@ import ( "context" "fmt" "regexp" - "strconv" "strings" "testing" "time" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/network" "github.com/docker/docker/client" ) @@ -65,78 +62,6 @@ func singleMultiInstanceQueueManager(t *testing.T, cli *client.Client, qmsharedl qmsChannel <- QMChan{QMId: qmId, QMData: qmData} } -func getHostConfig(t *testing.T, mounts int, qmsharedlogs string, qmshareddata string, qmdata string) container.HostConfig { - - var hostConfig container.HostConfig - - switch mounts { - case 1: - hostConfig = container.HostConfig{ - Binds: []string{ - coverageBind(t), - qmdata + ":/mnt/mqm", - }, - } - case 2: - hostConfig = container.HostConfig{ - Binds: []string{ - coverageBind(t), - qmdata + ":/mnt/mqm", - qmshareddata + ":/mnt/mqm-data", - }, - } - case 3: - hostConfig = container.HostConfig{ - Binds: []string{ - coverageBind(t), - qmdata + ":/mnt/mqm", - qmsharedlogs + ":/mnt/mqm-log", - }, - } - case 4: - hostConfig = container.HostConfig{ - Binds: []string{ - coverageBind(t), - qmdata + ":/mnt/mqm", - qmsharedlogs + ":/mnt/mqm-log", - qmshareddata + ":/mnt/mqm-data", - }, - } - } - - return hostConfig -} - -func startMultiVolumeQueueManager(t *testing.T, cli *client.Client, dataVol bool, qmsharedlogs string, qmshareddata string, env []string) (error, string, string) { - id := strconv.FormatInt(time.Now().UnixNano(), 10) - qmdata := createVolume(t, cli, id) - containerConfig := container.Config{ - Image: imageName(), - Env: env, - } - var hostConfig container.HostConfig - - if !dataVol { - hostConfig = container.HostConfig{} - } else if qmsharedlogs == "" && qmshareddata == "" { - hostConfig = getHostConfig(t, 1, "", "", qmdata.Name) - } else if qmsharedlogs == "" { - hostConfig = getHostConfig(t, 2, "", qmshareddata, qmdata.Name) - } else if qmshareddata == "" { - hostConfig = getHostConfig(t, 3, qmsharedlogs, "", qmdata.Name) - } else { - hostConfig = getHostConfig(t, 4, qmsharedlogs, qmshareddata, qmdata.Name) - } - networkingConfig := network.NetworkingConfig{} - qm, err := cli.ContainerCreate(context.Background(), &containerConfig, &hostConfig, &networkingConfig, t.Name()+id) - if err != nil { - return err, "", "" - } - startContainer(t, cli, qm.ID) - - return nil, qm.ID, qmdata.Name -} - func getActiveStandbyQueueManager(t *testing.T, cli *client.Client, qm1aId string, qm1bId string) (error, string, string) { qm1aStatus := getQueueManagerStatus(t, cli, qm1aId, "QM1") qm1bStatus := getQueueManagerStatus(t, cli, qm1bId, "QM1")