docker-compose: script for migration

Signed-off-by: rjshrjndrn <rjshrjndrn@gmail.com>
This commit is contained in:
rjshrjndrn 2023-12-08 17:40:57 +01:00
parent a0a08d042a
commit 224495c0fb

View file

@ -1,8 +1,9 @@
#!/bin/bash
#!/usr/bin/env bash
# Path to the original and new env files
original_env_file="$1"
# Check if the original env file exists and is not empty
if [ ! -s "$original_env_file" ]; then
echo "Error: The original env file is empty or does not exist."
echo "Usage: $0 /path/to/original.env"
@ -10,64 +11,75 @@ if [ ! -s "$original_env_file" ]; then
fi
new_env_file="./common.env"
# Create a temporary file for the updated env
temp_env_file=$(mktemp)
# Function to merge environment variables from original to new env file
function merge_envs() {
local content=""
while IFS='=' read -r key value; do
# Skip the line if the key is COMMON_VERSION
case "$key" in
COMMON_VERSION)
# Capture the original version for later use
original_version=$(echo "$value" | xargs)
continue
;;
COMMON_PG_PASSWORD)
# Store PostgreSQL password for later use
pgpassword=$value
;;
POSTGRES_VERSION | REDIS_VERSION | MINIO_VERSION)
# Don't update db versions automatically.
continue
# Ignore certain variables
;;
*)
# Add other variables to content
content+="${key}=${value}\n"
;;
esac
# Remove any existing entry from the new env file and add the new value
grep -v "^$key=" "$new_env_file" >"$temp_env_file"
mv "$temp_env_file" "$new_env_file"
echo "$key=$value" >>"$new_env_file"
done <"$original_env_file"
# Remove existing entries from new env file and add updated content
grep -vFf <(printf "%s" "$content" | cut -d'=' -f1) "$new_env_file" >"$temp_env_file"
printf "%b" "$content" >>"$temp_env_file"
mv "$temp_env_file" "$new_env_file"
}
function parse_version() {
local version=${1#v} # Remove 'v' if present
IFS='.' read -r major minor patch <<<"$version"
echo "$major $minor"
}
# We need to remove version dots
# Function to normalize version numbers for comparison
function normalise_version {
echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'
echo "$1" | awk -F. '{ printf("%03d%03d%03d\n", $1, $2, $3); }'
}
# Function to log messages
function log_message() {
echo "$@" >&2
}
# Function to create migration versions based on the current and previous application versions
function create_migration_versions() {
# Checking migration versions
cd "${SCHEMA_DIR:-/opt/openreplay/openreplay/scripts/schema}" || {
log_message not able to cd $SCHEMA_DIR
log_message "not able to cd $SCHEMA_DIR"
exit 100
}
db=postgresql
all_versions=($(ls -l db/init_dbs/$db | grep -E ^d | grep -v create | awk '{print $NF}'))
# List all version directories excluding 'create' directory
all_versions=($(find db/init_dbs/$db -maxdepth 1 -type d -exec basename {} \; | grep -v create))
migration_versions=($(for ver in ${all_versions[*]}; do if [[ $(normalise_version $ver) > $(normalise_version "${PREVIOUS_APP_VERSION}") ]]; then echo $ver; fi; done | sort -V))
# Normalize the previous application version for comparison
PREVIOUS_APP_VERSION_NORMALIZED=$(normalise_version "${PREVIOUS_APP_VERSION}")
migration_versions=()
for ver in "${all_versions[@]}"; do
if [[ $(normalise_version "$ver") > "$PREVIOUS_APP_VERSION_NORMALIZED" ]]; then
migration_versions+=("$ver")
fi
done
# Join migration versions into a single string separated by commas
joined_migration_versions=$(
IFS=,
echo "${migration_versions[*]}"
)
# Return to the previous directory
cd - >/dev/null || {
log_message "not able to cd back"
exit 100
@ -77,26 +89,29 @@ function create_migration_versions() {
echo "$joined_migration_versions"
}
# Function to perform migration
function migrate() {
# Set schema directory and previous application version
export SCHEMA_DIR="../schema/"
export PREVIOUS_APP_VERSION=${original_version#v}
# Create migration versions array
IFS=',' read -ra joined_migration_versions <<<"$(create_migration_versions)"
# Check if there are versions to migrate
[[ ${#joined_migration_versions[@]} -eq 0 ]] && {
echo Nothing to migrate
echo "Nothing to migrate"
return
}
for ver in ${joined_migration_versions[*]}; do
echo $ver
echo docker run --rm --network openreplay-net --name pgmigrate \
-e "PGHOST=postgres" -e "PGPORT=5432" -e "PGDATABASE=postgres" \
-e "PGUSER=postgres" -e "PGPASSWORD=$pgpassword" \
-v /opt/data/:$SCHEMA_DIR \
postgres \
psql -f /file/from/host
# Loop through versions and prepare Docker run commands
for ver in "${joined_migration_versions[@]}"; do
echo "$ver"
echo "docker run --rm --network openreplay-net \
--name pgmigrate -e 'PGHOST=postgres' -e 'PGPORT=5432' \
-e 'PGDATABASE=postgres' -e 'PGUSER=postgres' -e 'PGPASSWORD=$pgpassword' \
-v /opt/data/:$SCHEMA_DIR postgres psql -f /opt/data/schema/db/init_dbs/postgresql/$ver/$ver.sql"
done
}
# Upgrade postgresql
# Merge environment variables and perform migration
merge_envs
migrate