From 1bdb6b3946879703b01acffc4371aa8269f9e7f1 Mon Sep 17 00:00:00 2001 From: MoonKyu Song Date: Tue, 28 Jul 2020 13:54:16 +0900 Subject: [PATCH] Refactor docker image build scripts All versions of docker images are controlled by docker/version.sh. Now, it builds images with specific tags. --- .gitlab-ci.yml | 38 ++++++++-------- Makefile | 31 +++++-------- docker/function.sh | 18 ++++++++ docker/go-deps/Dockerfile | 6 +-- docker/go-deps/build.sh | 10 +---- docker/go-deps/update.sh | 82 +++++++++++++++++++---------------- docker/gochain/Dockerfile | 5 +-- docker/gochain/build.sh | 42 ++---------------- docker/gochain/update.sh | 57 ++++++++++++++++++++++++ docker/goloop-java/Dockerfile | 2 +- docker/goloop-java/build.sh | 22 ++-------- docker/goloop-java/multi.sh | 4 +- docker/goloop-java/update.sh | 58 +++++++++++++++++++++++++ docker/goloop-py/Dockerfile | 5 +-- docker/goloop-py/build.sh | 33 ++------------ docker/goloop-py/multi.sh | 4 +- docker/goloop-py/update.sh | 58 +++++++++++++++++++++++++ docker/goloop/Dockerfile | 5 +-- docker/goloop/build.sh | 42 ++---------------- docker/goloop/multi.sh | 4 +- docker/goloop/update.sh | 59 +++++++++++++++++++++++++ docker/java-deps/Dockerfile | 2 +- docker/java-deps/build.sh | 10 +---- docker/java-deps/update.sh | 43 +++++++++++------- docker/py-deps/Dockerfile | 4 +- docker/py-deps/build.sh | 10 +---- docker/py-deps/update.sh | 42 +++++++++++------- docker/version.sh | 6 +++ 28 files changed, 423 insertions(+), 279 deletions(-) create mode 100644 docker/function.sh create mode 100755 docker/gochain/update.sh create mode 100755 docker/goloop-java/update.sh create mode 100755 docker/goloop-py/update.sh create mode 100755 docker/goloop/update.sh create mode 100644 docker/version.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2c2bed410..0ffedc755 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -8,16 +8,12 @@ stages: - cleanup variables: - ALPINE_VERSION: "3.10" - GOLANG_VERSION: "1.12.14" - PYTHON_VERSION: "3.7.5" - JAVA_VERSION: "11.0.4" - REPO_GO_DEPS: "goloop/go-deps/${CI_COMMIT_REF_SLUG}" - REPO_PY_DEPS: "goloop/py-deps/${CI_COMMIT_REF_SLUG}" - REPO_JAVA_DEPS: "goloop/java-deps/${CI_COMMIT_REF_SLUG}" - REPO_GOLOOP: "goloop/${CI_COMMIT_REF_SLUG}" - REPO_GOLOOP_PY: "goloop-py/${CI_COMMIT_REF_SLUG}" - REPO_GOLOOP_JAVA: "goloop-java/${CI_COMMIT_REF_SLUG}" + IMAGE_GO_DEPS: "goloop/go-deps:${CI_COMMIT_REF_NAME}" + IMAGE_PY_DEPS: "goloop/py-deps/${CI_COMMIT_REF_NAME}" + IMAGE_JAVA_DEPS: "goloop/java-deps:${CI_COMMIT_REF_NAME}" + IMAGE_GOLOOP: "goloop:${CI_COMMIT_REF_NAME}" + IMAGE_GOLOOP_PY: "goloop-py:${CI_COMMIT_REF_NAME}" + IMAGE_GOLOOP_JAVA: "goloop-java:${CI_COMMIT_REF_NAME}" REGISTRY: "ci.arch.iconloop.com:80" before_script: @@ -48,7 +44,7 @@ deps:java: - docker-build unit:go: - image: "${REPO_GO_DEPS}" + image: "${IMAGE_GO_DEPS}" stage: unit script: - make test @@ -56,7 +52,7 @@ unit:go: - docker unit:py: - image: "${REPO_PY_DEPS}" + image: "${IMAGE_PY_DEPS}" stage: unit script: - cd pyee @@ -65,7 +61,7 @@ unit:py: - docker unit:java: - image: "${REPO_JAVA_DEPS}" + image: "${IMAGE_JAVA_DEPS}" stage: unit script: - cd javaee @@ -74,7 +70,7 @@ unit:java: - docker build:go: - image: "${REPO_GO_DEPS}" + image: "${IMAGE_GO_DEPS}" stage: build script: - make goloop @@ -87,21 +83,21 @@ build:go: - docker build:pyee: - image: "${REPO_PY_DEPS}" + image: "${IMAGE_PY_DEPS}" stage: build script: - cd pyee - pip3 install wheel - - python3 setup.py bdist_wheel + - python3 setup.py bdist_wheel -d ../build/pyee/dist artifacts: expire_in: 1 day paths: - - pyee/dist/ + - build/pyee/dist/ tags: - docker build:java: - image: "${REPO_JAVA_DEPS}" + image: "${IMAGE_JAVA_DEPS}" stage: build script: - cd javaee @@ -404,19 +400,19 @@ pages:IT:goloop:interscore: push:goloop:py: <<: *push variables: - REPO: "${REPO_GOLOOP_PY}" + REPO: "${IMAGE_GOLOOP_PY}" REPO_TAG: "goloop-py:${CI_COMMIT_REF_NAME}" push:goloop:java: <<: *push variables: - REPO: "${REPO_GOLOOP_JAVA}" + REPO: "${IMAGE_GOLOOP_JAVA}" REPO_TAG: "goloop-java:${CI_COMMIT_REF_NAME}" push:goloop: <<: *push variables: - REPO: "${REPO_GOLOOP}" + REPO: "${IMAGE_GOLOOP}" REPO_TAG: "goloop:${CI_COMMIT_REF_NAME}" .cleanup:integration: diff --git a/Makefile b/Makefile index 3791738cd..2720e10fc 100644 --- a/Makefile +++ b/Makefile @@ -130,31 +130,20 @@ javarun-% : javadeps-image goloop-image: pyrun-pyexec gorun-goloop-linux javarun-javaexec @ echo "[#] Building image $(GOLOOP_IMAGE) for $(GL_VERSION)" @ rm -rf $(GOLOOP_DOCKER_DIR) - @ mkdir -p $(GOLOOP_DOCKER_DIR)/dist/pyee - @ mkdir -p $(GOLOOP_DOCKER_DIR)/dist/bin - @ cp $(BUILD_ROOT)/docker/goloop/* $(GOLOOP_DOCKER_DIR) - @ cp $(PYEE_DIST_DIR)/*.whl $(GOLOOP_DOCKER_DIR)/dist/pyee - @ cp $(LINUX_BIN_DIR)/goloop $(GOLOOP_DOCKER_DIR)/dist/bin - @ cp $(BUILD_ROOT)/javaee/app/execman/build/distributions/*.zip $(GOLOOP_DOCKER_DIR)/dist - @ docker build -t $(GOLOOP_IMAGE) \ - --build-arg TAG_PY_DEPS=$(GL_TAG) \ - --build-arg GOLOOP_VERSION=$(GL_VERSION) \ - --build-arg JAVAEE_VERSION=$(JAVAEE_VERSION) \ - $(GOLOOP_DOCKER_DIR) + @ \ + BIN_DIR=$(BUILD_ROOT)/linux \ + IMAGE_PY_DEPS=$(PYDEPS_IMAGE) \ + GOLOOP_VERSION=$(GL_VERSION) \ + $(BUILD_ROOT)/docker/goloop/update.sh $(GOLOOP_IMAGE) $(BUILD_ROOT) $(GOLOOP_DOCKER_DIR) gochain-image: pyrun-pyexec gorun-gochain-linux javarun-javaexec @ echo "[#] Building image $(GOCHAIN_IMAGE) for $(GL_VERSION)" @ rm -rf $(GOCHAIN_DOCKER_DIR) - @ mkdir -p $(GOCHAIN_DOCKER_DIR)/dist - @ cp $(BUILD_ROOT)/docker/gochain/* $(GOCHAIN_DOCKER_DIR) - @ cp $(PYEE_DIST_DIR)/*.whl $(GOCHAIN_DOCKER_DIR)/dist - @ cp $(LINUX_BIN_DIR)/gochain $(GOCHAIN_DOCKER_DIR)/dist - @ cp $(BUILD_ROOT)/javaee/app/execman/build/distributions/*.zip $(GOCHAIN_DOCKER_DIR)/dist - @ docker build -t $(GOCHAIN_IMAGE) \ - --build-arg TAG_PY_DEPS=$(GL_TAG) \ - --build-arg GOCHAIN_VERSION=$(GL_VERSION) \ - --build-arg JAVAEE_VERSION=$(JAVAEE_VERSION) \ - $(GOCHAIN_DOCKER_DIR) + @ \ + BIN_DIR=$(BUILD_ROOT)/linux \ + IMAGE_PY_DEPS=$(PYDEPS_IMAGE) \ + GOCHAIN_VERSION=$(GL_VERSION) \ + $(BUILD_ROOT)/docker/gochain/update.sh $(GOCHAIN_IMAGE) $(BUILD_ROOT) $(GOCHAIN_DOCKER_DIR) .PHONY: test diff --git a/docker/function.sh b/docker/function.sh new file mode 100644 index 000000000..d69c68e27 --- /dev/null +++ b/docker/function.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +get_hash_of_files() { + cat "$@" | sha1sum | cut -d " " -f1 +} + +get_label_of_image() { + local LABEL=$1 + local TAG=$2 + docker image inspect -f "{{.Config.Labels.${LABEL}}}" ${TAG} 2> /dev/null || echo 'none' +} + +get_id_with_hash() { + local REPO=$1 + local LABEL=$2 + local HASH=$3 + docker images --filter="reference=${REPO}" --filter="label=${LABEL}=${HASH}" --format="{{.ID}}" | head -n 1 +} \ No newline at end of file diff --git a/docker/go-deps/Dockerfile b/docker/go-deps/Dockerfile index d7e8f0a98..4f97fc261 100644 --- a/docker/go-deps/Dockerfile +++ b/docker/go-deps/Dockerfile @@ -1,5 +1,5 @@ -ARG GOLANG_VERSION=1.12.14 -ARG ALPINE_VERSION=3.10 +ARG GOLANG_VERSION +ARG ALPINE_VERSION FROM golang:${GOLANG_VERSION}-alpine${ALPINE_VERSION} RUN apk add make git ENV GO111MODULE on @@ -10,4 +10,4 @@ LABEL GOLOOP_GOMOD_SHA="$GOLOOP_GOMOD_SHA" ADD go.mod go.sum /goloop/ WORKDIR /goloop -RUN echo "go mod download $GOMOD_SHA" && go mod download +RUN echo "go mod download $GOLOOP_GOMOD_SHA" && go mod download diff --git a/docker/go-deps/build.sh b/docker/go-deps/build.sh index 46b3d9614..7065aa5a2 100644 --- a/docker/go-deps/build.sh +++ b/docker/go-deps/build.sh @@ -5,14 +5,8 @@ PRE_PWD=$(pwd) WORKDIR=$(dirname "$(readlink -f ${0})") cd $WORKDIR -REPO_GO_DEPS=${REPO_GO_DEPS:-goloop/go-deps} +IMAGE_GO_DEPS=${IMAGE_GO_DEPS:-goloop/go-deps:latest} -./update.sh "${REPO_GO_DEPS}" ../.. - -if [ "${TAG_GO_DEPS}" != "" ] && [ "${TAG_GO_DEPS}" != "latest" ];then - TAG_SLUG=${TAG_GO_DEPS//\//__} - echo "Tag image ${REPO_GO_DEPS} to ${REPO_GO_DEPS}:${TAG_SLUG} for TAG_GO_DEPS:${TAG_GO_DEPS}" - docker tag ${REPO_GO_DEPS} ${REPO_GO_DEPS}:${TAG_SLUG} -fi +./update.sh "${IMAGE_GO_DEPS}" ../.. cd $PRE_PWD diff --git a/docker/go-deps/update.sh b/docker/go-deps/update.sh index 3281fe20d..90fbbd206 100755 --- a/docker/go-deps/update.sh +++ b/docker/go-deps/update.sh @@ -1,64 +1,72 @@ #!/bin/sh BASE_DIR=$(dirname $0) -GOLANG_VERSION=${GOLANG_VERSION:-1.12.14} +. ${BASE_DIR}/../version.sh +. ${BASE_DIR}/../function.sh + +LABEL="GOLOOP_GOMOD_SHA" get_hash_of_dir() { local SRC_DIR=$1 - local SUM=$(sha1sum "${SRC_DIR}/go.sum" | cut -d ' ' -f 1) - echo "${GOLANG_VERSION}-${SUM}" -} - -get_hash_of_image() { - local TAG=$1 - docker image inspect -f '{{.Config.Labels.GOLOOP_GOMOD_SHA}}' ${TAG} 2> /dev/null || echo 'none' + local SUM=$(get_hash_of_files \ + "${SRC_DIR}/go.mod" "${SRC_DIR}/go.sum" \ + "${SRC_DIR}/docker/go-deps/Dockerfile" ) + echo "${GOLANG_VERSION}-alpine${ALPINE_VERSION}-${SUM}" } update_image() { if [ $# -lt 1 ] ; then - echo "Usage: $0 [] []" - return 1 + echo "Usage: $0 [] []" + return 1 fi - local TAG=$1 + local TARGET_IMAGE=$1 + local TARGET_REPO=${TARGET_IMAGE%%:*} local SRC_DIR=$2 if [ -z "${SRC_DIR}" ] ; then - SRC_DIR="." + SRC_DIR="." fi local BUILD_DIR=$3 - local GOLOOP_GOMOD_SHA=$(get_hash_of_dir ${SRC_DIR}) - local IMAGE_GOMOD_SHA=$(get_hash_of_image ${TAG}) + local HASH_OF_DIR=$(get_hash_of_dir ${SRC_DIR}) + local HASH_OF_IMAGE=$(get_label_of_image ${LABEL} ${TARGET_IMAGE}) - if [ "${GOLOOP_GOMOD_SHA}" != "${IMAGE_GOMOD_SHA}" ] ; then - # Prepare build directory if it's set - if [ "${BUILD_DIR}" != "" ] ; then - rm -rf ${BUILD_DIR} - mkdir -p ${BUILD_DIR} - cp ${BASE_DIR}/* ${BUILD_DIR} - else - BUILD_DIR=${BASE_DIR} - fi + if [ "${HASH_OF_DIR}" != "${HASH_OF_IMAGE}" ] ; then + local IMAGE_ID=$(get_id_with_hash ${TARGET_REPO} ${LABEL} ${HASH_OF_DIR}) + if [ "${IMAGE_ID}" != "" ]; then + echo "Tagging image ${IMAGE_ID} as ${TARGET_IMAGE}" + docker tag ${IMAGE_ID} ${TARGET_IMAGE} + return $? + fi - cp ${SRC_DIR}/go.sum ${SRC_DIR}/go.mod ${BUILD_DIR}/ + # Prepare build directory if it's set + if [ "${BUILD_DIR}" != "" ] ; then + rm -rf ${BUILD_DIR} + mkdir -p ${BUILD_DIR} + cp ${BASE_DIR}/* ${BUILD_DIR} + else + BUILD_DIR=${BASE_DIR} + fi - CDIR=$(pwd) - cd ${BUILD_DIR} + cp ${SRC_DIR}/go.sum ${SRC_DIR}/go.mod ${BUILD_DIR}/ - echo "Building image ${TAG} for ${GOLOOP_GOMOD_SHA}" - docker build \ - --build-arg GOLOOP_GOMOD_SHA=${GOLOOP_GOMOD_SHA} \ - --build-arg GOLANG_VERSION=${GOLANG_VERSION} \ - --tag ${TAG} . - local result=$? + CDIR=$(pwd) + cd ${BUILD_DIR} - rm -f go.sum go.mod - cd ${CDIR} + echo "Building image ${TARGET_IMAGE} for ${HASH_OF_DIR}" + docker build \ + --build-arg ${LABEL}=${HASH_OF_DIR} \ + --build-arg GOLANG_VERSION=${GOLANG_VERSION} \ + --build-arg ALPINE_VERSION=${ALPINE_VERSION} \ + --tag ${TARGET_IMAGE} . + local result=$? - return $result + rm -f go.sum go.mod + cd ${CDIR} + return $result else - echo "Already exist image ${TAG} for ${GOLOOP_GOMOD_SHA}" - return 0 + echo "Reuse image ${TARGET_IMAGE} for ${HASH_OF_DIR}" + return 0 fi return 0 } diff --git a/docker/gochain/Dockerfile b/docker/gochain/Dockerfile index b8ad5cf07..d673fe775 100644 --- a/docker/gochain/Dockerfile +++ b/docker/gochain/Dockerfile @@ -1,6 +1,5 @@ -ARG REPO_PY_DEPS=goloop/py-deps -ARG TAG_PY_DEPS=latest -FROM ${REPO_PY_DEPS}:${TAG_PY_DEPS} +ARG IMAGE_PY_DEPS +FROM ${IMAGE_PY_DEPS} LABEL MAINTAINER="t_arch@iconloop.com" # install JRE diff --git a/docker/gochain/build.sh b/docker/gochain/build.sh index e3191bdb5..e5fe937ee 100755 --- a/docker/gochain/build.sh +++ b/docker/gochain/build.sh @@ -5,44 +5,10 @@ PRE_PWD=$(pwd) WORKDIR=$(dirname "$(readlink -f ${0})") cd $WORKDIR -PYTHON_VERSION=${PYTHON_VERSION:-3.7.5} -SHASUM=$(cat ../../pyee/requirements.txt \ - ../../docker/py-deps/Dockerfile \ - | sha1sum | cut -d ' ' -f 1) -PYDEP_SHA=${PYTHON_VERSION}-${SHASUM} -REPO_PY_DEPS=${REPO_PY_DEPS:-goloop/py-deps} -TAG_PY_DEPS=${TAG_PY_DEPS:-$(docker images --filter="reference=$REPO_PY_DEPS" --filter="label=GOLOOP_PYDEP_SHA=${PYDEP_SHA}" --format="{{.Tag}}" | head -n 1)} -if [ "${TAG_PY_DEPS}" != "" ]; then - TAG_SLUG=${TAG_PY_DEPS//\//__} - BUILD_ARG_TAG_PY_DEPS="--build-arg=TAG_PY_DEPS=${TAG_SLUG}" -fi +export GOCHAIN_VERSION=${GOCHAIN_VERSION:-$(git describe --always --tags --dirty)} +export IMAGE_PY_DEPS=${IMAGE_PY_DEPS:-goloop/py-deps:latest} +IMAGE_GOCHAIN=${IMAGE_GOCHAIN:-goloop/gochain:latest} -GOCHAIN_VERSION=${GOCHAIN_VERSION:-$(git describe --always --tags --dirty)} -REPO_GOCHAIN=${REPO_GOCHAIN:-goloop/gochain} -PRE_GOCHAIN_VERSION=$(docker image inspect ${REPO_GOCHAIN} -f "{{.Config.Labels.GOCHAIN_VERSION}}" || echo "none") -if [ "${GOCHAIN_VERSION}" != "${PRE_GOCHAIN_VERSION}" ] -then - echo "Build image ${REPO_GOCHAIN} using ${REPO_PY_DEPS} with TAG_PY_DEPS:${TAG_PY_DEPS}" - JAVAEE_VERSION=$(grep "^VERSION=" ../../javaee/gradle.properties | cut -d= -f2) - mkdir dist - cp ../../pyee/dist/pyexec-*.whl ./dist/ - cp ../../bin/gochain ./dist/ - cp ../../javaee/app/execman/build/distributions/execman-*.zip ./dist/ - docker build \ - --build-arg REPO_PY_DEPS=${REPO_PY_DEPS} \ - ${BUILD_ARG_TAG_PY_DEPS} \ - --build-arg GOCHAIN_VERSION=${GOCHAIN_VERSION} \ - --build-arg JAVAEE_VERSION=${JAVAEE_VERSION} \ - --tag ${REPO_GOCHAIN} . - rm -rf dist -else - echo "Already exists image ${REPO_GOCHAIN}" -fi - -if [ "${TAG_GOCHAIN}" != "" ] && [ "${TAG_GOCHAIN}" != "latest" ]; then - TAG_SLUG=${TAG_GOCHAIN//\//__} - echo "Tag image ${REPO_GOCHAIN} to ${REPO_GOCHAIN}:${TAG_SLUG} for TAG_GOCHAIN:${TAG_GOCHAIN}" - docker tag ${REPO_GOCHAIN} ${REPO_GOCHAIN}:${TAG_SLUG} -fi +./update.sh "${IMAGE_GOCHAIN}" ../.. cd $PRE_PWD diff --git a/docker/gochain/update.sh b/docker/gochain/update.sh new file mode 100755 index 000000000..cb257b456 --- /dev/null +++ b/docker/gochain/update.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +BASE_DIR=$(dirname $0) +. ${BASE_DIR}/../version.sh + +build_image() { + if [ $# -lt 1 ] ; then + echo "Usage: $0 [] []" + return 1 + fi + + local TAG=$1 + local SRC_DIR=$2 + if [ -z "${SRC_DIR}" ] ; then + SRC_DIR="." + fi + local BUILD_DIR=$3 + + # Prepare build directory if it's set + if [ "${BUILD_DIR}" != "" ] ; then + rm -rf ${BUILD_DIR} + mkdir -p ${BUILD_DIR} + cp ${BASE_DIR}/* ${BUILD_DIR} + else + BUILD_DIR=${BASE_DIR} + fi + + # copy required files to ${BUILD_DIR}/dist + rm -rf ${BUILD_DIR}/dist + mkdir -p ${BUILD_DIR}/dist + + JAVAEE_VERSION=$(grep "^VERSION=" ${SRC_DIR}/javaee/gradle.properties | cut -d= -f2) + BIN_DIR=${BIN_DIR:-${SRC_DIR}/bin} + + cp ${BIN_DIR}/gochain ${BUILD_DIR}/dist/ + cp ${SRC_DIR}/build/pyee/dist/pyexec-*.whl ${BUILD_DIR}/dist/ + cp ${SRC_DIR}/javaee/app/execman/build/distributions/execman-${JAVAEE_VERSION}.zip ${BUILD_DIR}/dist/ + + CDIR=$(pwd) + cd ${BUILD_DIR} + + echo "Building image ${TAG}" + docker build \ + --build-arg IMAGE_PY_DEPS=${IMAGE_PY_DEPS} \ + --build-arg GOCHAIN_VERSION=${GOCHAIN_VERSION} \ + --build-arg JAVAEE_VERSION=${JAVAEE_VERSION} \ + --tag ${TAG} . + local result=$? + + cd ${CDIR} + +# rm -rf ${BUILD_DIR}/dist + + return $result +} + +build_image "$@" diff --git a/docker/goloop-java/Dockerfile b/docker/goloop-java/Dockerfile index e7509b4d6..c57b62467 100644 --- a/docker/goloop-java/Dockerfile +++ b/docker/goloop-java/Dockerfile @@ -1,4 +1,4 @@ -ARG ALPINE_VERSION=3.10 +ARG ALPINE_VERSION FROM alpine:${ALPINE_VERSION} LABEL MAINTAINER="t_arch@iconloop.com" diff --git a/docker/goloop-java/build.sh b/docker/goloop-java/build.sh index 18bcb1c9e..d258dbe7d 100755 --- a/docker/goloop-java/build.sh +++ b/docker/goloop-java/build.sh @@ -5,23 +5,9 @@ PRE_PWD=$(pwd) WORKDIR=$(dirname "$(readlink -f ${0})") cd $WORKDIR -GOLOOP_VERSION=${GOLOOP_VERSION:-$(git describe --always --tags --dirty)} -REPO_GOLOOP_JAVA=${REPO_GOLOOP_JAVA:-goloop-java} -PRE_GOLOOP_VERSION=$(docker image inspect ${REPO_GOLOOP_JAVA} -f "{{.Config.Labels.GOLOOP_VERSION}}" || echo "none") -if [ "${GOLOOP_VERSION}" != "${PRE_GOLOOP_VERSION}" ] -then - echo "Build image ${REPO_GOLOOP_JAVA} for ${GOLOOP_VERSION}" - JAVAEE_VERSION=$(grep "^VERSION=" ../../javaee/gradle.properties | cut -d= -f2) - mkdir -p dist/bin - cp ../../bin/* ./dist/bin/ - cp ../../javaee/app/execman/build/distributions/execman-*.zip ./dist/ - docker build \ - --build-arg GOLOOP_VERSION=${GOLOOP_VERSION} \ - --build-arg JAVAEE_VERSION=${JAVAEE_VERSION} \ - --tag ${REPO_GOLOOP_JAVA} . - rm -rf dist -else - echo "Already exists image ${REPO_GOLOOP_JAVA}:${GOLOOP_VERSION}" -fi +export GOLOOP_VERSION=${GOLOOP_VERSION:-$(git describe --always --tags --dirty)} +IMAGE_GOLOOP_JAVA=${IMAGE_GOLOOP_JAVA:-goloop-java:latest} + +./update.sh "${IMAGE_GOLOOP_JAVA}" ../.. cd $PRE_PWD diff --git a/docker/goloop-java/multi.sh b/docker/goloop-java/multi.sh index 30a5f6ce1..3b41acead 100644 --- a/docker/goloop-java/multi.sh +++ b/docker/goloop-java/multi.sh @@ -5,7 +5,7 @@ PRE_PWD=$(pwd) WORKDIR=$(dirname "$(readlink -f ${0})") cd $WORKDIR -REPO_GOLOOP_JAVA=${REPO_GOLOOP_JAVA:-goloop-java} +IMAGE_GOLOOP_JAVA=${IMAGE_GOLOOP_JAVA:-goloop-java:latest} GOLOOP_DATA=${GOLOOP_DATA:-/goloop/data} GOLOOP_DOCKER_REPLICAS=${GOLOOP_DOCKER_REPLICAS:-4} GOLOOP_DOCKER_NETWORK=${GOLOOP_DOCKER_NETWORK:-goloop_net} @@ -47,7 +47,7 @@ function create(){ --env GOLOOP_LOGFILE=${GOLOOP_LOGFILE} \ --env GOLOOP_P2P=${GOLOOP_DOCKER_PREFIX}-${i}:8080 \ --env GOLOOP_ENGINES=${GOLOOP_ENGINES} \ - ${REPO_GOLOOP_JAVA} + ${IMAGE_GOLOOP_JAVA} set +e MAX_RETRY=10 diff --git a/docker/goloop-java/update.sh b/docker/goloop-java/update.sh new file mode 100755 index 000000000..38d15f74e --- /dev/null +++ b/docker/goloop-java/update.sh @@ -0,0 +1,58 @@ +#!/bin/sh + +BASE_DIR=$(dirname $0) +. ${BASE_DIR}/../version.sh + +build_image() { + if [ $# -lt 1 ] ; then + echo "Usage: $0 [] []" + return 1 + fi + + local TAG=$1 + local SRC_DIR=$2 + if [ -z "${SRC_DIR}" ] ; then + SRC_DIR="." + fi + local BUILD_DIR=$3 + + # Prepare build directory if it's set + if [ "${BUILD_DIR}" != "" ] ; then + rm -rf ${BUILD_DIR} + mkdir -p ${BUILD_DIR} + cp ${BASE_DIR}/* ${BUILD_DIR} + else + BUILD_DIR=${BASE_DIR} + fi + + # copy required files to ${BUILD_DIR}/dist + rm -rf ${BUILD_DIR}/dist + + JAVAEE_VERSION=$(grep "^VERSION=" ${SRC_DIR}/javaee/gradle.properties | cut -d= -f2) + BIN_DIR=${BIN_DIR:-${SRC_DIR}/bin} + + mkdir -p ${BUILD_DIR}/dist/bin/ + cp ${BIN_DIR}/goloop ${BUILD_DIR}/dist/bin/ + cp -f ${BIN_DIR}/gstool ${BUILD_DIR}/dist/bin/ + + cp ${SRC_DIR}/javaee/app/execman/build/distributions/execman-${JAVAEE_VERSION}.zip ${BUILD_DIR}/dist/ + + CDIR=$(pwd) + cd ${BUILD_DIR} + + echo "Building image ${TAG}" + docker build \ + --build-arg ALPINE_VERSION=${ALPINE_VERSION} \ + --build-arg GOLOOP_VERSION=${GOLOOP_VERSION} \ + --build-arg JAVAEE_VERSION=${JAVAEE_VERSION} \ + --tag ${TAG} . + local result=$? + + cd ${CDIR} + +# rm -rf ${BUILD_DIR}/dist + + return $result +} + +build_image "$@" \ No newline at end of file diff --git a/docker/goloop-py/Dockerfile b/docker/goloop-py/Dockerfile index f91d09b10..ad7e184a9 100644 --- a/docker/goloop-py/Dockerfile +++ b/docker/goloop-py/Dockerfile @@ -1,6 +1,5 @@ -ARG REPO_PY_DEPS=goloop/py-deps -ARG TAG_PY_DEPS=latest -FROM ${REPO_PY_DEPS}:${TAG_PY_DEPS} +ARG IMAGE_PY_DEPS +FROM ${IMAGE_PY_DEPS} LABEL MAINTAINER="t_arch@iconloop.com" ARG GOLOOP_VERSION diff --git a/docker/goloop-py/build.sh b/docker/goloop-py/build.sh index 3aff120dd..c0eac18fe 100755 --- a/docker/goloop-py/build.sh +++ b/docker/goloop-py/build.sh @@ -5,35 +5,10 @@ PRE_PWD=$(pwd) WORKDIR=$(dirname "$(readlink -f ${0})") cd $WORKDIR -PYTHON_VERSION=${PYTHON_VERSION:-3.7.5} -SHASUM=$(cat ../../pyee/requirements.txt \ - ../../docker/py-deps/Dockerfile \ - | sha1sum | cut -d ' ' -f 1) -PYDEP_SHA=${PYTHON_VERSION}-${SHASUM} -REPO_PY_DEPS=${REPO_PY_DEPS:-goloop/py-deps} -TAG_PY_DEPS=${TAG_PY_DEPS:-$(docker images --filter="reference=$REPO_PY_DEPS" --filter="label=GOLOOP_PYDEP_SHA=${PYDEP_SHA}" --format="{{.Tag}}" | head -n 1)} -if [ "${TAG_PY_DEPS}" != "" ]; then - TAG_SLUG=${TAG_PY_DEPS//\//__} - BUILD_ARG_TAG_PY_DEPS="--build-arg=TAG_PY_DEPS=${TAG_SLUG}" -fi +export GOLOOP_VERSION=${GOLOOP_VERSION:-$(git describe --always --tags --dirty)} +export IMAGE_PY_DEPS=${IMAGE_PY_DEPS:-goloop/py-deps:latest} +IMAGE_GOLOOP_PY=${IMAGE_GOLOOP_PY:-goloop-py:latest} -GOLOOP_VERSION=${GOLOOP_VERSION:-$(git describe --always --tags --dirty)} -REPO_GOLOOP_PY=${REPO_GOLOOP_PY:-goloop-py} -PRE_GOLOOP_VERSION=$(docker image inspect ${REPO_GOLOOP_PY} -f "{{.Config.Labels.GOLOOP_VERSION}}" || echo "none") -if [ "${GOLOOP_VERSION}" != "${PRE_GOLOOP_VERSION}" ] -then - echo "Build image ${REPO_GOLOOP_PY} using ${REPO_PY_DEPS} with TAG_PY_DEPS:${TAG_PY_DEPS}" - mkdir -p dist/pyee dist/bin - cp ../../pyee/dist/* ./dist/pyee/ - cp ../../bin/* ./dist/bin/ - docker build \ - --build-arg REPO_PY_DEPS=${REPO_PY_DEPS} \ - ${BUILD_ARG_TAG_PY_DEPS} \ - --build-arg GOLOOP_VERSION=${GOLOOP_VERSION} \ - --tag ${REPO_GOLOOP_PY} . - rm -rf dist -else - echo "Already exists image ${REPO_GOLOOP_PY}" -fi +./update.sh "${IMAGE_GOLOOP_PY}" ../.. cd $PRE_PWD diff --git a/docker/goloop-py/multi.sh b/docker/goloop-py/multi.sh index 081732357..fee94f828 100644 --- a/docker/goloop-py/multi.sh +++ b/docker/goloop-py/multi.sh @@ -5,7 +5,7 @@ PRE_PWD=$(pwd) WORKDIR=$(dirname "$(readlink -f ${0})") cd $WORKDIR -REPO_GOLOOP_PY=${REPO_GOLOOP_PY:-goloop-py} +IMAGE_GOLOOP_PY=${IMAGE_GOLOOP_PY:-goloop-py:latest} GOLOOP_DATA=${GOLOOP_DATA:-/goloop/data} GOLOOP_DOCKER_REPLICAS=${GOLOOP_DOCKER_REPLICAS:-4} GOLOOP_DOCKER_NETWORK=${GOLOOP_DOCKER_NETWORK:-goloop_net} @@ -48,7 +48,7 @@ function create(){ --env GOLOOP_LOGFILE=${GOLOOP_LOGFILE} \ --env GOLOOP_P2P=${GOLOOP_DOCKER_PREFIX}-${i}:8080 \ --env GOLOOP_ENGINES=${GOLOOP_ENGINES} \ - ${REPO_GOLOOP_PY} + ${IMAGE_GOLOOP_PY} set +e MAX_RETRY=10 diff --git a/docker/goloop-py/update.sh b/docker/goloop-py/update.sh new file mode 100755 index 000000000..a0da10bb5 --- /dev/null +++ b/docker/goloop-py/update.sh @@ -0,0 +1,58 @@ +#!/bin/sh + +BASE_DIR=$(dirname $0) +. ${BASE_DIR}/../version.sh + +build_image() { + if [ $# -lt 1 ] ; then + echo "Usage: $0 [] []" + return 1 + fi + + local TAG=$1 + local SRC_DIR=$2 + if [ -z "${SRC_DIR}" ] ; then + SRC_DIR="." + fi + local BUILD_DIR=$3 + + # Prepare build directory if it's set + if [ "${BUILD_DIR}" != "" ] ; then + rm -rf ${BUILD_DIR} + mkdir -p ${BUILD_DIR} + cp ${BASE_DIR}/* ${BUILD_DIR} + else + BUILD_DIR=${BASE_DIR} + fi + + # copy required files to ${BUILD_DIR}/dist + rm -rf ${BUILD_DIR}/dist + + JAVAEE_VERSION=$(grep "^VERSION=" ${SRC_DIR}/javaee/gradle.properties | cut -d= -f2) + BIN_DIR=${BIN_DIR:-${SRC_DIR}/bin} + + mkdir -p ${BUILD_DIR}/dist/bin/ + cp ${BIN_DIR}/goloop ${BUILD_DIR}/dist/bin/ + cp -f ${BIN_DIR}/gstool ${BUILD_DIR}/dist/bin/ + + mkdir -p ${BUILD_DIR}/dist/pyee + cp ${SRC_DIR}/build/pyee/dist/pyexec-*.whl ${BUILD_DIR}/dist/pyee/ + + CDIR=$(pwd) + cd ${BUILD_DIR} + + echo "Building image ${TAG}" + docker build \ + --build-arg IMAGE_PY_DEPS=${IMAGE_PY_DEPS} \ + --build-arg GOLOOP_VERSION=${GOLOOP_VERSION} \ + --tag ${TAG} . + local result=$? + + cd ${CDIR} + +# rm -rf ${BUILD_DIR}/dist + + return $result +} + +build_image "$@" \ No newline at end of file diff --git a/docker/goloop/Dockerfile b/docker/goloop/Dockerfile index d8c671e5a..071482aa4 100644 --- a/docker/goloop/Dockerfile +++ b/docker/goloop/Dockerfile @@ -1,6 +1,5 @@ -ARG REPO_PY_DEPS=goloop/py-deps -ARG TAG_PY_DEPS=latest -FROM ${REPO_PY_DEPS}:${TAG_PY_DEPS} +ARG IMAGE_PY_DEPS +FROM ${IMAGE_PY_DEPS} LABEL MAINTAINER="t_arch@iconloop.com" # install JRE diff --git a/docker/goloop/build.sh b/docker/goloop/build.sh index 9c95275b3..0c04c692a 100755 --- a/docker/goloop/build.sh +++ b/docker/goloop/build.sh @@ -5,44 +5,10 @@ PRE_PWD=$(pwd) WORKDIR=$(dirname "$(readlink -f ${0})") cd $WORKDIR -PYTHON_VERSION=${PYTHON_VERSION:-3.7.5} -SHASUM=$(cat ../../pyee/requirements.txt \ - ../../docker/py-deps/Dockerfile \ - | sha1sum | cut -d ' ' -f 1) -PYDEP_SHA=${PYTHON_VERSION}-${SHASUM} -REPO_PY_DEPS=${REPO_PY_DEPS:-goloop/py-deps} -TAG_PY_DEPS=${TAG_PY_DEPS:-$(docker images --filter="reference=$REPO_PY_DEPS" --filter="label=GOLOOP_PYDEP_SHA=${PYDEP_SHA}" --format="{{.Tag}}" | head -n 1)} -if [ "${TAG_PY_DEPS}" != "" ]; then - TAG_SLUG=${TAG_PY_DEPS//\//__} - BUILD_ARG_TAG_PY_DEPS="--build-arg=TAG_PY_DEPS=${TAG_SLUG}" -fi +export GOLOOP_VERSION=${GOLOOP_VERSION:-$(git describe --always --tags --dirty)} +export IMAGE_PY_DEPS=${IMAGE_PY_DEPS:-goloop/py-deps:latest} +IMAGE_GOLOOP=${IMAGE_GOLOOP:-goloop:latest} -GOLOOP_VERSION=${GOLOOP_VERSION:-$(git describe --always --tags --dirty)} -REPO_GOLOOP=${REPO_GOLOOP:-goloop} -PRE_GOLOOP_VERSION=$(docker image inspect ${REPO_GOLOOP} -f "{{.Config.Labels.GOLOOP_VERSION}}" || echo "none") -if [ "${GOLOOP_VERSION}" != "${PRE_GOLOOP_VERSION}" ] -then - echo "Build image ${REPO_GOLOOP} using ${REPO_PY_DEPS} with TAG_PY_DEPS:${TAG_PY_DEPS}" - JAVAEE_VERSION=$(grep "^VERSION=" ../../javaee/gradle.properties | cut -d= -f2) - mkdir -p dist/pyee dist/bin - cp ../../pyee/dist/* ./dist/pyee/ - cp ../../bin/* ./dist/bin/ - cp ../../javaee/app/execman/build/distributions/execman-*.zip ./dist/ - docker build \ - --build-arg REPO_PY_DEPS=${REPO_PY_DEPS} \ - ${BUILD_ARG_TAG_PY_DEPS} \ - --build-arg GOLOOP_VERSION=${GOLOOP_VERSION} \ - --build-arg JAVAEE_VERSION=${JAVAEE_VERSION} \ - --tag ${REPO_GOLOOP} . - rm -rf dist -else - echo "Already exists image ${REPO_GOLOOP}" -fi - -if [ "${TAG_GOLOOP}" != "" ] && [ "${TAG_GOLOOP}" != "latest" ]; then - TAG_SLUG=${TAG_GOLOOP//\//__} - echo "Tag image ${REPO_GOLOOP} to ${REPO_GOLOOP}:${TAG_SLUG} for TAG_GOLOOP:${TAG_GOLOOP}" - docker tag ${REPO_GOLOOP} ${REPO_GOLOOP}:${TAG_SLUG} -fi +./update.sh "${IMAGE_GOLOOP}" ../.. cd $PRE_PWD diff --git a/docker/goloop/multi.sh b/docker/goloop/multi.sh index 3908deab3..9175e8ab6 100644 --- a/docker/goloop/multi.sh +++ b/docker/goloop/multi.sh @@ -5,7 +5,7 @@ PRE_PWD=$(pwd) WORKDIR=$(dirname "$(readlink -f ${0})") cd $WORKDIR -REPO_GOLOOP=${REPO_GOLOOP:-goloop} +IMAGE_GOLOOP=${IMAGE_GOLOOP:-goloop:latest} GOLOOP_DATA=${GOLOOP_DATA:-/goloop/data} GOLOOP_DOCKER_REPLICAS=${GOLOOP_DOCKER_REPLICAS:-4} GOLOOP_DOCKER_NETWORK=${GOLOOP_DOCKER_NETWORK:-goloop_net} @@ -48,7 +48,7 @@ function create(){ --env GOLOOP_LOGFILE=${GOLOOP_LOGFILE} \ --env GOLOOP_P2P=${GOLOOP_DOCKER_PREFIX}-${i}:8080 \ --env GOLOOP_ENGINES=${GOLOOP_ENGINES} \ - ${REPO_GOLOOP} + ${IMAGE_GOLOOP} set +e MAX_RETRY=10 diff --git a/docker/goloop/update.sh b/docker/goloop/update.sh new file mode 100755 index 000000000..6ffa66852 --- /dev/null +++ b/docker/goloop/update.sh @@ -0,0 +1,59 @@ +#!/bin/sh + +BASE_DIR=$(dirname $0) +. ${BASE_DIR}/../version.sh + +build_image() { + if [ $# -lt 1 ] ; then + echo "Usage: $0 [] []" + return 1 + fi + + local TAG=$1 + local SRC_DIR=$2 + if [ -z "${SRC_DIR}" ] ; then + SRC_DIR="." + fi + local BUILD_DIR=$3 + + # Prepare build directory if it's set + if [ "${BUILD_DIR}" != "" ] ; then + rm -rf ${BUILD_DIR} + mkdir -p ${BUILD_DIR} + cp ${BASE_DIR}/* ${BUILD_DIR} + else + BUILD_DIR=${BASE_DIR} + fi + + # copy required files to ${BUILD_DIR}/dist + rm -rf ${BUILD_DIR}/dist + + JAVAEE_VERSION=$(grep "^VERSION=" ${SRC_DIR}/javaee/gradle.properties | cut -d= -f2) + BIN_DIR=${BIN_DIR:-${SRC_DIR}/bin} + + mkdir -p ${BUILD_DIR}/dist/bin/ + cp ${BIN_DIR}/goloop ${BUILD_DIR}/dist/bin/ + cp -f ${BIN_DIR}/gstool ${BUILD_DIR}/dist/bin/ + + mkdir -p ${BUILD_DIR}/dist/pyee + cp ${SRC_DIR}/build/pyee/dist/pyexec-*.whl ${BUILD_DIR}/dist/pyee/ + + cp ${SRC_DIR}/javaee/app/execman/build/distributions/execman-${JAVAEE_VERSION}.zip ${BUILD_DIR}/dist/ + + CDIR=$(pwd) + cd ${BUILD_DIR} + + echo "Building image ${TAG}" + docker build \ + --build-arg IMAGE_PY_DEPS=${IMAGE_PY_DEPS} \ + --build-arg GOLOOP_VERSION=${GOLOOP_VERSION} \ + --build-arg JAVAEE_VERSION=${JAVAEE_VERSION} \ + --tag ${TAG} . + local result=$? + + cd ${CDIR} + rm -rf ${BUILD_DIR}/dist + return $result +} + +build_image "$@" \ No newline at end of file diff --git a/docker/java-deps/Dockerfile b/docker/java-deps/Dockerfile index 0d8516afe..011e2276d 100644 --- a/docker/java-deps/Dockerfile +++ b/docker/java-deps/Dockerfile @@ -1,4 +1,4 @@ -ARG ALPINE_VERSION=3.10 +ARG ALPINE_VERSION FROM alpine:${ALPINE_VERSION} RUN apk add --no-cache openjdk11-jdk build-base diff --git a/docker/java-deps/build.sh b/docker/java-deps/build.sh index 00aa76e7d..6a98f77f4 100644 --- a/docker/java-deps/build.sh +++ b/docker/java-deps/build.sh @@ -5,14 +5,8 @@ PRE_PWD=$(pwd) WORKDIR=$(dirname "$(readlink -f ${0})") cd $WORKDIR -REPO_JAVA_DEPS=${REPO_JAVA_DEPS:-goloop/java-deps} +IMAGE_JAVA_DEPS=${IMAGE_JAVA_DEPS:-goloop/java-deps:latest} -./update.sh "${REPO_JAVA_DEPS}" ../.. - -if [ "${TAG_JAVA_DEPS}" != "" ] && [ "${TAG_JAVA_DEPS}" != "latest" ]; then - TAG_SLUG=${TAG_JAVA_DEPS//\//__} - echo "Tag image ${REPO_JAVA_DEPS} to ${REPO_JAVA_DEPS}:${TAG_SLUG} for TAG_JAVA_DEPS:${TAG_JAVA_DEPS}" - docker tag ${REPO_JAVA_DEPS} ${REPO_JAVA_DEPS}:${TAG_SLUG} -fi +./update.sh "${IMAGE_JAVA_DEPS}" ../.. cd $PRE_PWD diff --git a/docker/java-deps/update.sh b/docker/java-deps/update.sh index cd2561f42..5fc367048 100755 --- a/docker/java-deps/update.sh +++ b/docker/java-deps/update.sh @@ -1,17 +1,17 @@ #!/bin/sh BASE_DIR=$(dirname $0) -JAVA_VERSION=${JAVA_VERSION:-11.0.4} +. ${BASE_DIR}/../version.sh +. ${BASE_DIR}/../function.sh + +LABEL="GOLOOP_JADEP_SHA" get_hash_of_dir() { local SRC_DIR=$1 - local SUM=$(sha1sum "${SRC_DIR}/docker/java-deps/Dockerfile" | cut -d ' ' -f 1) - echo "${JAVA_VERSION}-${SUM}" -} - -get_hash_of_image() { - local TAG=$1 - docker image inspect -f '{{.Config.Labels.GOLOOP_JADEP_SHA}}' ${TAG} 2> /dev/null || echo 'none' + local SUM=$(get_hash_of_files \ + "${SRC_DIR}/docker/java-deps/Dockerfile" \ + "${SRC_DIR}/javaee/gradle/wrapper/gradle-wrapper.properties") + echo "${JAVA_VERSION}-alpine${ALPINE_VERSION}-${SUM}" } update_image() { @@ -20,17 +20,25 @@ update_image() { return 1 fi - local TAG=$1 + local TARGET_IMAGE=$1 + local TARGET_REPO=${TARGET_IMAGE%%:*} local SRC_DIR=$2 if [ -z "${SRC_DIR}" ] ; then SRC_DIR="." fi local BUILD_DIR=$3 - local GOLOOP_JADEP_SHA=$(get_hash_of_dir ${SRC_DIR}) - local IMAGE_JADEP_SHA=$(get_hash_of_image ${TAG}) + local HASH_OF_DIR=$(get_hash_of_dir ${SRC_DIR}) + local HASH_OF_IMAGE=$(get_label_of_image ${LABEL} ${TARGET_IMAGE}) + + if [ "${HASH_OF_DIR}" != "${HASH_OF_IMAGE}" ] ; then + local IMAGE_ID=$(get_id_with_hash ${TARGET_REPO} ${LABEL} ${HASH_OF_DIR}) + if [ "${IMAGE_ID}" != "" ]; then + echo "Tagging image ${IMAGE_ID} as ${TARGET_IMAGE}" + docker tag ${IMAGE_ID} ${TARGET_IMAGE} + return $? + fi - if [ "${GOLOOP_JADEP_SHA}" != "${IMAGE_JADEP_SHA}" ] ; then # Prepare build directory if it's set if [ "${BUILD_DIR}" != "" ] ; then rm -rf ${BUILD_DIR} @@ -45,16 +53,19 @@ update_image() { CDIR=$(pwd) cd ${BUILD_DIR} - echo "Building image ${TAG} for ${GOLOOP_JADEP_SHA}" + echo "Building image ${TARGET_IMAGE} for ${HASH_OF_DIR}" docker build \ - --build-arg GOLOOP_JADEP_SHA=${GOLOOP_JADEP_SHA} \ - --tag ${TAG} . + --build-arg ${LABEL}=${HASH_OF_DIR} \ + --build-arg ALPINE_VERSION=${ALPINE_VERSION} \ + --build-arg JAVA_VERSION=${JAVA_VERSION} \ + --tag ${TARGET_IMAGE} . local result=$? + rm -rf gradle* cd ${CDIR} return $result else - echo "Already exist image ${TAG} for ${GOLOOP_JADEP_SHA}" + echo "Reuse image ${TARGET_IMAGE} for ${HASH_OF_DIR}" return 0 fi return 0 diff --git a/docker/py-deps/Dockerfile b/docker/py-deps/Dockerfile index 863844e91..33110c213 100644 --- a/docker/py-deps/Dockerfile +++ b/docker/py-deps/Dockerfile @@ -1,5 +1,5 @@ -ARG PYTHON_VERSION=3.7.5 -ARG ALPINE_VERSION=3.10 +ARG PYTHON_VERSION +ARG ALPINE_VERSION FROM python:${PYTHON_VERSION}-alpine${ALPINE_VERSION} # required by 'pip install coincurve cryptography' diff --git a/docker/py-deps/build.sh b/docker/py-deps/build.sh index 299bbadd3..9bab12518 100644 --- a/docker/py-deps/build.sh +++ b/docker/py-deps/build.sh @@ -5,14 +5,8 @@ PRE_PWD=$(pwd) WORKDIR=$(dirname "$(readlink -f ${0})") cd $WORKDIR -REPO_PY_DEPS=${REPO_PY_DEPS:-goloop/py-deps} +IMAGE_PY_DEPS=${IMAGE_PY_DEPS:-goloop/py-deps:latest} -./update.sh "${REPO_PY_DEPS}" ../.. - -if [ "${TAG_PY_DEPS}" != "" ] && [ "${TAG_PY_DEPS}" != "latest" ];then - TAG_SLUG=${TAG_PY_DEPS//\//__} - echo "Tag image ${REPO_PY_DEPS} to ${REPO_PY_DEPS}:${TAG_SLUG} for TAG_PY_DEPS:${TAG_PY_DEPS}" - docker tag ${REPO_PY_DEPS} ${REPO_PY_DEPS}:${TAG_SLUG} -fi +./update.sh "${IMAGE_PY_DEPS}" ../.. cd $PRE_PWD diff --git a/docker/py-deps/update.sh b/docker/py-deps/update.sh index 6da5dd583..a1d433309 100755 --- a/docker/py-deps/update.sh +++ b/docker/py-deps/update.sh @@ -1,19 +1,22 @@ #!/bin/sh BASE_DIR=$(dirname $0) -PYTHON_VERSION=${PYTHON_VERSION:-3.7.5} +. ${BASE_DIR}/../version.sh +. ${BASE_DIR}/../function.sh + +LABEL="GOLOOP_PYDEP_SHA" get_hash_of_dir() { local SRC_DIR=$1 - local SUM=$(cat "${SRC_DIR}/pyee/requirements.txt" \ - "${SRC_DIR}/docker/py-deps/Dockerfile" \ - | sha1sum | cut -d ' ' -f 1) - echo "${PYTHON_VERSION}-${SUM}" + local SUM=$(get_hash_of_files \ + "${SRC_DIR}/pyee/requirements.txt" \ + "${SRC_DIR}/docker/py-deps/Dockerfile") + echo "${PYTHON_VERSION}-alpine${ALPINE_VERSION}-${SUM}" } get_hash_of_image() { - local TAG=$1 - docker image inspect -f '{{.Config.Labels.GOLOOP_PYDEP_SHA}}' ${TAG} 2> /dev/null || echo 'none' + local IMAGE=$1 + docker image inspect -f "{{.Config.Labels.${LABEL}}}" ${IMAGE} 2> /dev/null || echo 'none' } update_image() { @@ -22,17 +25,25 @@ update_image() { return 1 fi - local TAG=$1 + local TARGET_IMAGE=$1 + local TARGET_REPO=${TARGET_IMAGE%%:*} local SRC_DIR=$2 if [ -z "${SRC_DIR}" ] ; then SRC_DIR="." fi local BUILD_DIR=$3 - local GOLOOP_PYDEP_SHA=$(get_hash_of_dir ${SRC_DIR}) - local IMAGE_PYDEP_SHA=$(get_hash_of_image ${TAG}) + local HASH_OF_DIR=$(get_hash_of_dir ${SRC_DIR}) + local HASH_OF_IMAGE=$(get_label_of_image ${LABEL} ${TARGET_IMAGE}) + + if [ "${HASH_OF_DIR}" != "${HASH_OF_IMAGE}" ] ; then + local IMAGE_ID=$(get_id_with_hash ${TARGET_REPO} ${LABEL} ${HASH_OF_DIR}) + if [ "${IMAGE_ID}" != "" ]; then + echo "Tagging image ${IMAGE_ID} as ${TARGET_IMAGE}" + docker tag ${IMAGE_ID} ${TARGET_IMAGE} + return $? + fi - if [ "${GOLOOP_PYDEP_SHA}" != "${IMAGE_PYDEP_SHA}" ] ; then # Prepare build directory if it's set if [ "${BUILD_DIR}" != "" ] ; then rm -rf ${BUILD_DIR} @@ -47,18 +58,19 @@ update_image() { CDIR=$(pwd) cd ${BUILD_DIR} - echo "Building image ${TAG} for ${GOLOOP_PYDEP_SHA}" + echo "Building image ${TARGET_IMAGE} for ${HASH_OF_DIR}" docker build \ - --build-arg GOLOOP_PYDEP_SHA=${GOLOOP_PYDEP_SHA} \ + --build-arg ${LABEL}=${HASH_OF_DIR} \ --build-arg PYTHON_VERSION=${PYTHON_VERSION} \ - --tag ${TAG} . + --build-arg ALPINE_VERSION=${ALPINE_VERSION} \ + --tag ${TARGET_IMAGE} . local result=$? rm -f requirements.txt cd ${CDIR} return $result else - echo "Already exist image ${TAG} for ${GOLOOP_PYDEP_SHA}" + echo "Reuse image ${TARGET_IMAGE} for ${HASH_OF_DIR}" return 0 fi return 0 diff --git a/docker/version.sh b/docker/version.sh new file mode 100644 index 000000000..45d4d0149 --- /dev/null +++ b/docker/version.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +GOLANG_VERSION=${GOLANG_VERSION:-1.12.14} +PYTHON_VERSION=${PYTHON_VERSION:-3.7.5} +ALPINE_VERSION=${ALPINE_VERSION:-3.10} +JAVA_VERSION=${JAVA_VERSION:-11.0.4}