Apply consistent naming conventions throughout upgrade.sh: - UPPERCASE + readonly for script-level constants (immutable values) - lowercase for temporary/local variables within the script flow Constants marked readonly: - ORIGIN_VERSION, FINAL_VERSION, ORIGIN_DB_NAME, ORIGIN_SERVICE_NAME - COPY_DB_NAME, FINALE_DB_NAME, FINALE_SERVICE_NAME - POSTGRES_SERVICE_NAME Local variables renamed to lowercase: - postgres_containers, postgres_count (detection phase) - db_exists, filestore_path (validation phase) This convention makes it immediately clear which variables are configuration constants vs runtime values, and prevents accidental modification of critical values.
147 lines
4.4 KiB
Bash
Executable File
147 lines
4.4 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
source "${SCRIPT_DIR}/lib/common.sh"
|
|
|
|
####################
|
|
# USAGE & ARGUMENTS
|
|
####################
|
|
|
|
usage() {
|
|
cat <<EOF >&2
|
|
Usage: $0 <origin_version> <final_version> <db_name> <service_name>
|
|
|
|
Arguments:
|
|
origin_version Origin Odoo version number (e.g., 12 for version 12.0)
|
|
final_version Target Odoo version number (e.g., 16 for version 16.0)
|
|
db_name Name of the database to migrate
|
|
service_name Name of the origin Odoo service (docker compose service)
|
|
|
|
Example:
|
|
$0 14 16 elabore_20241208 odoo14
|
|
EOF
|
|
exit 1
|
|
}
|
|
|
|
if [[ $# -lt 4 ]]; then
|
|
log_error "Missing arguments. Expected 4, got $#."
|
|
usage
|
|
fi
|
|
|
|
readonly ORIGIN_VERSION="$1"
|
|
readonly FINAL_VERSION="$2"
|
|
readonly ORIGIN_DB_NAME="$3"
|
|
readonly ORIGIN_SERVICE_NAME="$4"
|
|
|
|
readonly COPY_DB_NAME="ou${ORIGIN_VERSION}"
|
|
export FINALE_DB_NAME="ou${FINAL_VERSION}"
|
|
readonly FINALE_DB_NAME
|
|
readonly FINALE_SERVICE_NAME="${FINALE_DB_NAME}"
|
|
|
|
postgres_containers=$(docker ps --format '{{.Names}}' | grep postgres || true)
|
|
postgres_count=$(echo "$postgres_containers" | grep -c . || echo 0)
|
|
|
|
if [[ "$postgres_count" -eq 0 ]]; then
|
|
log_error "No running PostgreSQL container found. Please start a PostgreSQL container and try again."
|
|
exit 1
|
|
elif [[ "$postgres_count" -gt 1 ]]; then
|
|
log_error "Multiple PostgreSQL containers found:"
|
|
echo "$postgres_containers" >&2
|
|
log_error "Please ensure only one PostgreSQL container is running."
|
|
exit 1
|
|
fi
|
|
|
|
export POSTGRES_SERVICE_NAME="$postgres_containers"
|
|
readonly POSTGRES_SERVICE_NAME
|
|
|
|
log_step "INPUT PARAMETERS"
|
|
log_info "Origin version .......... $ORIGIN_VERSION"
|
|
log_info "Final version ........... $FINAL_VERSION"
|
|
log_info "Origin DB name ........... $ORIGIN_DB_NAME"
|
|
log_info "Origin service name ..... $ORIGIN_SERVICE_NAME"
|
|
|
|
log_step "COMPUTED GLOBAL VARIABLES"
|
|
log_info "Copy DB name ............. $COPY_DB_NAME"
|
|
log_info "Finale DB name ........... $FINALE_DB_NAME"
|
|
log_info "Finale service name ...... $FINALE_SERVICE_NAME"
|
|
log_info "Postgres service name .... $POSTGRES_SERVICE_NAME"
|
|
|
|
|
|
|
|
log_step "CHECKS ALL NEEDED COMPONENTS ARE AVAILABLE"
|
|
|
|
db_exists=$(docker exec -it -u 70 "$POSTGRES_SERVICE_NAME" psql -tc "SELECT 1 FROM pg_database WHERE datname = '$ORIGIN_DB_NAME'" | tr -d '[:space:]')
|
|
if [[ "$db_exists" ]]; then
|
|
log_info "Database '$ORIGIN_DB_NAME' found."
|
|
else
|
|
log_error "Database '$ORIGIN_DB_NAME' not found in the local postgres service. Please add it and restart the upgrade process."
|
|
exit 1
|
|
fi
|
|
|
|
filestore_path="${DATASTORE_PATH}/${ORIGIN_SERVICE_NAME}/${FILESTORE_SUBPATH}/${ORIGIN_DB_NAME}"
|
|
if [[ -d "$filestore_path" ]]; then
|
|
log_info "Filestore '$filestore_path' found."
|
|
else
|
|
log_error "Filestore '$filestore_path' not found, please add it and restart the upgrade process."
|
|
exit 1
|
|
fi
|
|
|
|
log_step "LAUNCH VIRGIN ODOO IN FINAL VERSION"
|
|
|
|
if docker exec -u 70 "$POSTGRES_SERVICE_NAME" pgm ls | grep -q "$FINALE_SERVICE_NAME"; then
|
|
log_info "Removing existing finale database and filestore..."
|
|
docker exec -u 70 "$POSTGRES_SERVICE_NAME" pgm rm -f "$FINALE_SERVICE_NAME"
|
|
sudo rm -rf "${DATASTORE_PATH}/${FINALE_SERVICE_NAME}/${FILESTORE_SUBPATH}/${FINALE_SERVICE_NAME}"
|
|
fi
|
|
|
|
compose --debug run "$FINALE_SERVICE_NAME" -i base --stop-after-init --no-http
|
|
|
|
log_info "Model database in final Odoo version created."
|
|
|
|
log_step "COPY ORIGINAL COMPONENTS"
|
|
|
|
copy_database "$ORIGIN_DB_NAME" "$COPY_DB_NAME" "$COPY_DB_NAME"
|
|
log_info "Original database copied to ${COPY_DB_NAME}@${COPY_DB_NAME}."
|
|
|
|
copy_filestore "$ORIGIN_SERVICE_NAME" "$ORIGIN_DB_NAME" "$COPY_DB_NAME" "$COPY_DB_NAME"
|
|
log_info "Original filestore copied."
|
|
|
|
|
|
log_step "PATH OF MIGRATION"
|
|
|
|
declare -a versions
|
|
nb_migrations=$((FINAL_VERSION - ORIGIN_VERSION))
|
|
|
|
for ((i = 0; i < nb_migrations; i++)); do
|
|
versions[i]=$((ORIGIN_VERSION + 1 + i))
|
|
done
|
|
log_info "Migration path is ${versions[*]}"
|
|
|
|
|
|
log_step "DATABASE PREPARATION"
|
|
|
|
./prepare_db.sh "$COPY_DB_NAME" "$COPY_DB_NAME" "$FINALE_DB_MODEL_NAME" "$FINALE_SERVICE_NAME"
|
|
|
|
|
|
log_step "UPGRADE PROCESS"
|
|
|
|
for version in "${versions[@]}"; do
|
|
log_info "START UPGRADE TO ${version}.0"
|
|
|
|
cd "${version}.0"
|
|
|
|
./pre_upgrade.sh
|
|
./upgrade.sh
|
|
./post_upgrade.sh
|
|
|
|
cd ..
|
|
log_info "END UPGRADE TO ${version}.0"
|
|
done
|
|
|
|
log_step "POST-UPGRADE PROCESSES"
|
|
|
|
./finalize_db.sh "$FINALE_DB_NAME" "$FINALE_SERVICE_NAME"
|
|
|
|
log_step "UPGRADE PROCESS ENDED WITH SUCCESS"
|