diff --git a/docker/Dockerfile b/docker/Dockerfile index 355b0f4b..4702728f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -44,9 +44,11 @@ ONBUILD ARG GITHUB_REPO ONBUILD ARG REPO_VERSION ONBUILD ARG GIT_COMMIT ONBUILD ARG CONSTRAINTS_BRANCH -ONBUILD ARG CONSTRAINTS_FILE=http://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt +ONBUILD ARG CONSTRAINTS_FILE ONBUILD ARG EXTRA_DEPS -ONBUILD ARG COMMON_REPO=https://git.openstack.org/openstack/monasca-common +ONBUILD ARG COMMON_REPO +ONBUILD ARG COMMON_VERSION +ONBUILD ARG COMMON_GIT_COMMIT # Build-time metadata as defined at # https://github.com/opencontainers/image-spec/blob/master/annotations.md @@ -59,6 +61,9 @@ ONBUILD LABEL org.opencontainers.image.revision="$GIT_COMMIT" ONBUILD LABEL org.opencontainers.image.licenses="Apache-2.0" ONBUILD LABEL org.openstack.constraints_uri="$CONSTRAINTS_FILE?h=$CONSTRAINTS_BRANCH" ONBUILD LABEL org.openstack.monasca.python.extra_deps="$EXTRA_DEPS" +ONBUILD LABEL org.openstack.monasca.common.source="$COMMON_REPO" +ONBUILD LABEL org.openstack.monasca.common.version="$COMMON_VERSION" +ONBUILD LABEL org.openstack.monasca.common.revision="$COMMON_GIT_COMMIT" # Every child image need to provide starting and health check script. # If they're not provided build will fail. We want that for uniformity. @@ -81,15 +86,30 @@ ONBUILD RUN \ mkdir -p /app && \ git -C /app init && \ git -C /app remote add origin "$APP_REPO" && \ + echo "Cloning app in version: $REPO_VERSION" && \ git -C /app fetch origin "$REPO_VERSION" && \ git -C /app reset --hard FETCH_HEAD && \ wget --output-document /app/upper-constraints.txt \ "$CONSTRAINTS_FILE"?h="$CONSTRAINTS_BRANCH" && \ + # Download monasca-common + mkdir -p /monasca-common && \ + git -C /monasca-common init && \ + git -C /monasca-common remote add origin "$COMMON_REPO" && \ + echo "Cloning monasca-common in version: $COMMON_VERSION" && \ + git -C /monasca-common fetch origin "$COMMON_VERSION" && \ + git -C /monasca-common reset --hard FETCH_HEAD && \ # When creating image from master, stable branch or commit use - # monasca-common from git repository. - [ ! "$(git -C /app tag -l ${REPO_VERSION})" ] && \ - sed -i "s|monasca-common.*|-e git+$COMMON_REPO@$CONSTRAINTS_BRANCH#egg=monasca-common|" \ + # monasca-common from git repository in /monasca-common, + # otherwise use the version from upper-constraints.txt + [ ! "$(git -C /monasca-common tag -l ${COMMON_VERSION})" ] && \ + sed -i "s|monasca-common.*||" \ + /app/requirements.txt || true && \ + [ ! "$(git -C /monasca-common tag -l ${COMMON_VERSION})" ] && \ + sed -i "s|monasca-common.*||" \ /app/upper-constraints.txt || true && \ + pip3 install \ + --editable /monasca-common \ + --constraint /app/upper-constraints.txt && \ # Install packages needed by wait scripts and used for templating. pip3 install \ pykafka \ @@ -105,20 +125,24 @@ ONBUILD RUN \ printf "App: %s\\n" "$DOCKER_IMAGE" >> /VERSIONS && \ printf "Repository: %s\\n" "$APP_REPO" >> /VERSIONS && \ printf "Version: %s\\n" "$REPO_VERSION" >> /VERSIONS && \ + printf "Revision: %s\\n" "$GIT_COMMIT" >> /VERSIONS && \ printf "Build date: %s\\n" "$CREATION_TIME" >> /VERSIONS && \ printf "Revision: %s\\n" \ "$(git -C /app rev-parse FETCH_HEAD)" >> /VERSIONS && \ - printf "Monasca-common version: %s\\n" \ + printf "Monasca-common version: %s\\n" "$COMMON_VERSION" \ + >> /VERSIONS && \ + printf "Monasca-common pip version: %s\\n" \ "$(pip3 freeze 2>&1 | grep 'monasca-common')" >> /VERSIONS && \ + printf "Monasca-common revision: %s\\n" \ + "$COMMON_GIT_COMMIT" >> /VERSIONS && \ printf "Constraints file: %s\\n" \ "$CONSTRAINTS_FILE"?h="$CONSTRAINTS_BRANCH" >> /VERSIONS && \ # Clean after instalation. apk del .build-deps && \ - # Pip is leaving monasca-common repo in /src so remove it. rm -rf \ /app \ /root/.cache/ \ - /src/monasca-common/java/ \ + /monasca-common/java/ \ /tmp/* \ /var/cache/apk/* \ /var/log/* && \ diff --git a/docker/example/Dockerfile b/docker/example/Dockerfile index 59d519df..affff05c 100644 --- a/docker/example/Dockerfile +++ b/docker/example/Dockerfile @@ -5,13 +5,14 @@ ARG APP_REPO=https://git.openstack.org/openstack/monasca-api # Branch, tag or git hash to build from. ARG REPO_VERSION=master ARG CONSTRAINTS_BRANCH=master +ARG COMMON_VERSION=master # Extra Python3 dependencies. ARG EXTRA_DEPS="gunicorn influxdb python-memcached" # Always start from `monasca-base` image and use specific tag of it. ARG BASE_TAG=1.0.0 -FROM monasca-base:$BASE_TAG +FROM monasca/base:$BASE_TAG # Environment variables used for our service or wait scripts. ENV \ diff --git a/docker/example/build_image.sh b/docker/example/build_image.sh index c7145350..2e483197 100755 --- a/docker/example/build_image.sh +++ b/docker/example/build_image.sh @@ -19,22 +19,30 @@ set -x # Print each script step. set -eo pipefail # Exit the script if any statement returns error. -# This script is used for building Docker image with proper labels. +# This script is used for building Docker image with proper labels +# and proper version of monasca-common. # # Example usage: -# $ ./build_image.sh +# $ ./build_image.sh +# +# Everything after `./build_image.sh` is optional and by default configured +# to get versions from `Dockerfile`. # # To build from master branch (default): -# $ ./build_image.sh +# $ ./build_image.sh # To build specific version run this script in the following way: -# $ ./build_image.sh stable/queens +# $ ./build_image.sh stable/queens # Building from specific commit: -# $ ./build_image.sh cb7f226 +# $ ./build_image.sh cb7f226 # When building from a tag monasca-common will be used in version available # in upper constraint file: -# $ ./build_image.sh 2.5.0 +# $ ./build_image.sh 2.5.0 # To build image from Gerrit patch sets that is targeting branch stable/queens: -# $ ./build_image.sh refs/changes/51/558751/1 stable/queens +# $ ./build_image.sh refs/changes/51/558751/1 stable/queens +# +# If you want to build image with custom monasca-common version you need +# to provide it as in the following example: +# $ ./build_image.sh master master refs/changes/19/595719/3 [ -z "$DOCKER_IMAGE" ] && \ DOCKER_IMAGE=$(\grep DOCKER_IMAGE Dockerfile | cut -f2 -d"=") @@ -50,19 +58,47 @@ REPO_VERSION_CLEAN=$(echo "$REPO_VERSION" | sed 's|/|-|g') GITHUB_REPO=$(echo "$APP_REPO" | sed 's/git.openstack.org/github.com/' | \ sed 's/ssh:/https:/') +if [ -z "$CONSTRAINTS_FILE" ]; then + CONSTRAINTS_FILE=$(\grep CONSTRAINTS_FILE Dockerfile | cut -f2 -d"=") || true + : "${CONSTRAINTS_FILE:=http://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt}" +fi + : "${CONSTRAINTS_BRANCH:=$2}" [ -z "$CONSTRAINTS_BRANCH" ] && \ CONSTRAINTS_BRANCH=$(\grep CONSTRAINTS_BRANCH Dockerfile | cut -f2 -d"=") + # When using stable version of repository use same stable constraints file. case "$REPO_VERSION" in *stable*) CONSTRAINTS_BRANCH_CLEAN="$REPO_VERSION" + # Get monasca-common version from stable upper constraints file. + CONSTRAINTS_TMP_FILE=$(mktemp) + wget --output-document "$CONSTRAINTS_TMP_FILE" \ + "$CONSTRAINTS_FILE"?h="$CONSTRAINTS_BRANCH_CLEAN" + UPPER_COMMON=$(\grep 'monasca-common' "$CONSTRAINTS_TMP_FILE") + # Get only version part from monasca-common. + UPPER_COMMON_VERSION="${UPPER_COMMON##*===}" + rm -rf "$CONSTRAINTS_TMP_FILE" ;; *) CONSTRAINTS_BRANCH_CLEAN="$CONSTRAINTS_BRANCH" ;; esac +# Monasca-common variables. +if [ -z "$COMMON_REPO" ]; then + COMMON_REPO=$(\grep COMMON_REPO Dockerfile | cut -f2 -d"=") || true + : "${COMMON_REPO:=https://git.openstack.org/openstack/monasca-common}" +fi +: "${COMMON_VERSION:=$3}" +if [ -z "$COMMON_VERSION" ]; then + COMMON_VERSION=$(\grep COMMON_VERSION Dockerfile | cut -f2 -d"=") || true + if [ "$UPPER_COMMON_VERSION" ]; then + # Common from upper constraints file. + COMMON_VERSION="$UPPER_COMMON_VERSION" + fi +fi + # Clone project to temporary directory for getting proper commit number from # branches and tags. We need this for setting proper image labels. # Docker does not allow to get any data from inside of system when building @@ -76,12 +112,23 @@ TMP_DIR=$(mktemp -d) git fetch origin "$REPO_VERSION" git reset --hard FETCH_HEAD ) -GIT_COMMIT=$(git -C "$TMP_DIR" rev-parse FETCH_HEAD) +GIT_COMMIT=$(git -C "$TMP_DIR" rev-parse HEAD) [ -z "${GIT_COMMIT}" ] && echo "No git commit hash found" && exit 1 rm -rf "$TMP_DIR" -# TODO(Dobroslaw): find a way to set label monasca-common with version -# we will be using with app. +# Do the same for monasca-common. +COMMON_TMP_DIR=$(mktemp -d) +( + cd "$COMMON_TMP_DIR" + # This many steps are needed to support gerrit patch sets. + git init + git remote add origin "$COMMON_REPO" + git fetch origin "$COMMON_VERSION" + git reset --hard FETCH_HEAD +) +COMMON_GIT_COMMIT=$(git -C "$COMMON_TMP_DIR" rev-parse HEAD) +[ -z "${COMMON_GIT_COMMIT}" ] && echo "No git commit hash found" && exit 1 +rm -rf "$COMMON_TMP_DIR" CREATION_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ") # Docker tags don't like colons so use shorter version of ISO 8601 for them. @@ -93,6 +140,10 @@ docker build --no-cache \ --build-arg APP_REPO="$APP_REPO" \ --build-arg REPO_VERSION="$REPO_VERSION" \ --build-arg GIT_COMMIT="$GIT_COMMIT" \ + --build-arg CONSTRAINTS_FILE="$CONSTRAINTS_FILE" \ --build-arg CONSTRAINTS_BRANCH="$CONSTRAINTS_BRANCH_CLEAN" \ + --build-arg COMMON_REPO="$COMMON_REPO" \ + --build-arg COMMON_VERSION="$COMMON_VERSION" \ + --build-arg COMMON_GIT_COMMIT="$COMMON_GIT_COMMIT" \ --tag "$DOCKER_IMAGE":"$REPO_VERSION_CLEAN" \ --tag "$DOCKER_IMAGE":"$REPO_VERSION_CLEAN"-"$CREATION_TIME_SHORT" .