mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-17 19:13:16 +08:00
Refactor docker-build.sh to reuse images
The docker-build.sh script, which is used to build a Docker image from the currently checked-out source code, has been refactored to make better use of cached images. This speeds up the build process and allows faster Travis builds.
This commit is contained in:
parent
5e51735e4f
commit
7fb6fbacdd
@ -5,39 +5,101 @@
|
||||
#
|
||||
SCRIPT_DIR=$(dirname $0)
|
||||
BASE_DIR=${PWD}/${SCRIPT_DIR}/..
|
||||
PG_VERSION=${PG_VERSION:-10.0}
|
||||
PG_VERSION=${PG_VERSION:-10.4}
|
||||
PG_IMAGE_TAG=${PG_IMAGE_TAG:-${PG_VERSION}-alpine}
|
||||
BUILD_CONTAINER_NAME=${BUILD_CONTAINER_NAME:-pgbuild}
|
||||
BUILD_IMAGE_NAME=${BUILD_IMAGE_NAME:-$USER/pgbuild}
|
||||
IMAGE_NAME=${IMAGE_NAME:-$USER/timescaledb}
|
||||
GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD ${BASE_DIR} | awk '{print $1; exit}' | sed -e "s|/|_|g")
|
||||
TAG_NAME=${TAG_NAME:-$GIT_BRANCH}
|
||||
GIT_TAG=$(git -C ${BASE_DIR} rev-parse --short --verify HEAD)
|
||||
GIT_ID=$(git -C ${BASE_DIR} describe --dirty | sed -e "s|/|_|g")
|
||||
TAG_NAME=${TAG_NAME:-$GIT_ID}
|
||||
BUILD_TYPE=${BUILD_TYPE:-Debug}
|
||||
USE_OPENSSL=${USE_OPENSSL:-True}
|
||||
PUSH_PG_IMAGE=${PUSH_PG_IMAGE:-false}
|
||||
|
||||
# Clean previous containers
|
||||
docker rm -f $(docker ps -a -q -f name=${BUILD_CONTAINER_NAME} 2>/dev/null) 2>/dev/null
|
||||
# Full image identifiers
|
||||
PG_IMAGE=${BUILD_IMAGE_NAME}:${PG_IMAGE_TAG}
|
||||
TS_IMAGE=${IMAGE_NAME}:${TAG_NAME}
|
||||
|
||||
if docker image ls -f "reference=${BUILD_IMAGE_NAME}:${PG_IMAGE_TAG}" | grep "$BUILD_IMAGE_NAME" 2>/dev/null; then
|
||||
echo "Using existing build image ${BUILD_IMAGE_NAME}:${PG_IMAGE_TAG}"
|
||||
docker run -d --name ${BUILD_CONTAINER_NAME} -v ${BASE_DIR}:/src ${BUILD_IMAGE_NAME}:${PG_IMAGE_TAG}
|
||||
else
|
||||
echo "Creating new build image ${BUILD_IMAGE_NAME}:${PG_IMAGE_TAG}"
|
||||
trap remove_build_container EXIT
|
||||
|
||||
image_exists() {
|
||||
[[ $(docker image ls -f "reference=$1" -q) ]]
|
||||
}
|
||||
|
||||
postgres_build_image_exists() {
|
||||
image_exists ${PG_IMAGE}
|
||||
}
|
||||
|
||||
timescaledb_image_exists() {
|
||||
image_exists ${TS_IMAGE}
|
||||
}
|
||||
|
||||
remove_build_container() {
|
||||
local container=${1:-${BUILD_CONTAINER_NAME}}
|
||||
docker rm -vf $(docker ps -a -q -f name=${container} 2>/dev/null) 2>/dev/null
|
||||
}
|
||||
|
||||
fetch_postgres_build_image() {
|
||||
local image=${1:-${PG_IMAGE}}
|
||||
docker pull ${image}
|
||||
}
|
||||
|
||||
create_postgres_build_image() {
|
||||
local image=${1:-${PG_IMAGE}}
|
||||
|
||||
echo "Creating new PostgreSQL build image ${image}"
|
||||
# Run a Postgres container
|
||||
docker run -d --name ${BUILD_CONTAINER_NAME} -v ${BASE_DIR}:/src postgres:${PG_IMAGE_TAG}
|
||||
|
||||
# Install build dependencies
|
||||
docker exec -u root -it ${BUILD_CONTAINER_NAME} /bin/bash -c "apk add --no-cache --virtual .build-deps gdb git coreutils dpkg-dev gcc libc-dev make cmake util-linux-dev diffutils openssl-dev && mkdir -p /build/debug"
|
||||
docker commit -a $USER -m "TimescaleDB build base image version $PG_IMAGE_TAG" ${BUILD_CONTAINER_NAME} ${image}
|
||||
remove_build_container ${BUILD_CONTAINER_NAME}
|
||||
|
||||
docker commit -a $USER -m "TimescaleDB build base image version $PG_IMAGE_TAG" ${BUILD_CONTAINER_NAME} ${BUILD_IMAGE_NAME}:${PG_IMAGE_TAG}
|
||||
if ${PUSH_PG_IMAGE}; then
|
||||
docker push ${image}
|
||||
fi
|
||||
}
|
||||
|
||||
run_postgres_build_image() {
|
||||
local image=${1:-${PG_IMAGE}}
|
||||
echo "Starting image ${image}"
|
||||
docker run -d --name ${BUILD_CONTAINER_NAME} -v ${BASE_DIR}:/src ${image}
|
||||
}
|
||||
|
||||
build_timescaledb()
|
||||
{
|
||||
echo "Building TimescaleDB image \"${TS_IMAGE}\" with USE_OPENSSL=${USE_OPENSSL} BUILD_TYPE=${BUILD_TYPE}"
|
||||
|
||||
run_postgres_build_image ${PG_IMAGE}
|
||||
|
||||
# Build and install the extension with debug symbols and assertions
|
||||
docker exec -u root -it ${BUILD_CONTAINER_NAME} /bin/bash -c "cp -a /src/{src,sql,test,scripts,version.config,CMakeLists.txt,timescaledb.control.in} /build/ && cd build/debug && cmake -DUSE_OPENSSL=${USE_OPENSSL} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} .. && make && make install && echo \"shared_preload_libraries = 'timescaledb'\" >> /usr/local/share/postgresql/postgresql.conf.sample && echo \"timescaledb.telemetry_level=off\" >> /usr/local/share/postgresql/postgresql.conf.sample && cd / && rm -rf /build"
|
||||
docker commit -a $USER -m "TimescaleDB development image" ${BUILD_CONTAINER_NAME} ${TS_IMAGE}
|
||||
}
|
||||
|
||||
message_and_exit() {
|
||||
echo
|
||||
echo "Run 'docker run -d --name some-timescaledb -p 5432:5432 ${TS_IMAGE}' to launch"
|
||||
exit
|
||||
}
|
||||
|
||||
remove_build_container
|
||||
|
||||
if timescaledb_image_exists; then
|
||||
echo "Image \"${TS_IMAGE}\" already exists."
|
||||
message_and_exit
|
||||
fi
|
||||
|
||||
# Build and install the extension with debug symbols and assertions
|
||||
docker exec -u root -it ${BUILD_CONTAINER_NAME} /bin/bash -c "cp -a /src/{src,sql,test,scripts,version.config,CMakeLists.txt,timescaledb.control.in} /build/ && cd build/debug && cmake -DCMAKE_BUILD_TYPE=Debug .. && make && make install && echo \"shared_preload_libraries = 'timescaledb'\" >> /usr/local/share/postgresql/postgresql.conf.sample && echo \"timescaledb.telemetry_level=off\" >> /usr/local/share/postgresql/postgresql.conf.sample && cd / && rm -rf /build"
|
||||
|
||||
docker commit -a $USER -m "TimescaleDB development image" ${BUILD_CONTAINER_NAME} ${IMAGE_NAME}:${TAG_NAME}
|
||||
if ! postgres_build_image_exists; then
|
||||
if ! fetch_postgres_build_image; then
|
||||
create_postgres_build_image || exit -1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Clean build containers
|
||||
docker rm -f ${BUILD_CONTAINER_NAME}
|
||||
build_timescaledb || exit -1
|
||||
|
||||
echo
|
||||
echo "Built image ${IMAGE_NAME}:${TAG_NAME}"
|
||||
echo "Run 'docker run -d --name some-timescaledb -p 5432:5432 ${IMAGE_NAME}:${TAG_NAME}' to launch"
|
||||
message_and_exit
|
||||
|
Loading…
x
Reference in New Issue
Block a user