Updated the update_code function

This commit is contained in:
2025-03-18 10:17:37 +03:00
parent e1af31c641
commit 40e9367b6f
2 changed files with 288 additions and 159 deletions

View File

@@ -10,7 +10,7 @@ ENV PYTHONUNBUFFERED=1
WORKDIR /app WORKDIR /app
# Install system dependencies required for MySQL and other libraries # Install system dependencies required for MySQL and other libraries
# RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y git
# default-libmysqlclient-dev \ # default-libmysqlclient-dev \
# build-essential \ # build-essential \
# && rm -rf /var/lib/apt/lists/* # && rm -rf /var/lib/apt/lists/*

View File

@@ -9,131 +9,153 @@ IMAGE_NAME="db-middleware"
CONTAINER_NAME="con-db-middleware" CONTAINER_NAME="con-db-middleware"
REPO_URL="https://gitea.abdulhade.com/abdulhade/db-middleware.git" REPO_URL="https://gitea.abdulhade.com/abdulhade/db-middleware.git"
EXECUTION_MESSAGE="NO-RETURN"
build_docker_image() { build_docker_image() {
docker build -t $IMAGE_NAME . echo "Building Docker image..."
if docker build -t "$IMAGE_NAME" .; then
echo "Docker image built successfully."
return 0
else
echo "Failed to build Docker image."
return 1
fi
}
test() {
echo "I am here"
return 1
}
exec_in_container() {
# Returns 0 if the command was successful
echo 0
local CONTAINER_NAME=$CONTAINER_NAME
local COMMAND="$1"
# Check if the container is running
if ! docker ps --format '{{.Names}}' | grep -q "^$CONTAINER_NAME$"; then
echo "Error: Container '$CONTAINER_NAME' is not running."
return 1
fi
echo 1
# Execute the command in the container
OUTPUT=$(docker exec "$CONTAINER_NAME" bash -c "$COMMAND" 2>&1)
echo 2
local EXIT_CODE=$?
echo 3
# Check if the command succeeded
if [[ $EXIT_CODE -eq 0 ]]; then
echo "$OUTPUT" # Return the output
return 0
else
echo "Error: Command failed in container '$CONTAINER_NAME' with exit code $EXIT_CODE."
echo "Output: $OUTPUT"
return $EXIT_CODE
fi
} }
set_up_scripts() { set_up_scripts() {
# Copy scripts from the code directory to the app directory echo "Setting up scripts..."
cp "$CODE_DIR/scripts/"* "$APP_DIR/scripts/"
# Give execution permission to all scripts # Copy scripts
chmod +x "$APP_DIR/scripts/"* if ! cp "$CODE_DIR/scripts/"* "$APP_DIR/scripts/"; then
echo "Failed to copy scripts."
return 1
fi
# Give execution permission
if ! chmod +x "$APP_DIR/scripts/"*; then
echo "Failed to set execution permissions."
return 1
fi
# Create ~/.local/bin if it doesn't exist
mkdir -p "$HOME/.local/bin" mkdir -p "$HOME/.local/bin"
ln -s "$APP_DIR/scripts/manager.sh" "$HOME/.local/bin/db-middleware"
export PATH="$HOME/.local/bin:$PATH" # Create symlink
source ~/.bashrc if ! ln -sf "$APP_DIR/scripts/manager.sh" "$HOME/.local/bin/db-middleware"; then
echo "Failed to create symlink."
# TODO Here we should handle the case of having the symlink created previously.
return 1
fi
# Update PATH
if ! grep -q "$HOME/.local/bin" ~/.bashrc; then
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
fi
# Reload bashrc
if ! source ~/.bashrc; then
echo "Failed to reload ~/.bashrc."
return 1
fi
echo "Scripts set up successfully."
return 0
} }
pull_clone_repo() {
local UPDATED=0
# Check if the code directory exists
if [[ ! -d "$CODE_DIR" ]]; then
echo "Creating code directory at $CODE_DIR..."
fi
mkdir -p "$APP_DIR/{code,configs,scripts}"
# Navigate to the code directory
cd "$CODE_DIR" || { echo "Failed to navigate to $CODE_DIR"; exit 1; }
# Check if the directory is empty
if [[ -z "$(ls -A $CODE_DIR)" ]]; then
echo "Directory is empty. Cloning repository..."
git clone "$REPO_URL" .
echo "Repository cloned successfully."
UPDATED=1 # Newly cloned, so changes are "new"
else
# Check if the directory contains a Git repository
if [[ -d ".git" ]]; then
echo "Directory contains a Git repository."
# Fetch the latest changes from the remote repository
git fetch origin
# Get the local and remote HEAD commit hashes
LOCAL_HEAD=$(git rev-parse HEAD)
REMOTE_HEAD=$(git rev-parse origin/main) # Replace 'main' with your branch name
# Compare the commit hashes
if [[ "$LOCAL_HEAD" != "$REMOTE_HEAD" ]]; then
echo "Repository has new changes. Pulling latest changes..."
git pull "$REPO_URL"
echo "Repository updated successfully."
UPDATED=1 # Changes were pulled
else
echo "Repository is already up to date."
UPDATED=0 # No changes
fi
else
echo "Directory is not empty and does not contain a Git repository."
echo "Please ensure the directory is empty or contains a valid Git repository."
echo " > $APP_DIR"
exit 1
fi
fi
# Check if the operation was successful
if [[ $? -eq 0 ]]; then
echo "Repository setup completed successfully."
else
echo "Failed to set up the repository."
exit 1
fi
# Return the UPDATED value
return $UPDATED
}
# Function to load the config file
load_config() { load_config() {
if [[ -f "$CONFIG_FILE" ]]; then if [[ -f "$CONFIG_FILE" ]]; then
source "$CONFIG_FILE" if source "$CONFIG_FILE"; then
LOADED_CONFIG=1 LOADED_CONFIG=1
echo "Config file loaded successfully."
return 0
else
echo "Failed to load config file."
return 1
fi
else else
echo "Config file not found: $CONFIG_FILE" echo "Config file not found: $CONFIG_FILE"
exit 1 return 1
fi fi
} }
show_config() { show_config() {
if [[ $LOADED_CONFIG -eq 0 ]]; then if [[ $LOADED_CONFIG -eq 0 ]]; then
echo "Didn't load config" echo "Config not loaded. Please load the config file first."
return 1
fi fi
echo "Current Config:" echo "Current Config:"
echo "CONTAINER_NAME: $CONTAINER_NAME" echo "CONTAINER_NAME: ${CONTAINER_NAME:-Not set}"
echo "API_PORT: $API_PORT" echo "API_PORT: ${API_PORT:-Not set}"
echo "HAS_LOCAL_DBS: $HAS_LOCAL_DBS" echo "HAS_LOCAL_DBS: ${HAS_LOCAL_DBS:-Not set}"
local RUN_COMMAND="docker run --name $CONTAINER_NAME" local RUN_COMMAND="docker run --name $CONTAINER_NAME"
if [[ $HAS_LOCAL_DBS -eq 1 ]]; then if [[ $HAS_LOCAL_DBS -eq 1 ]]; then
RUN_COMMAND+=" --network host" RUN_COMMAND+=" --network host"
fi fi
RUN_COMMAND+=" -p $API_PORT:8080 $IMAGE_NAME" RUN_COMMAND+=" -p ${API_PORT:-8080}:8080 $IMAGE_NAME"
echo "$RUN_COMMAND" echo "Run Command: $RUN_COMMAND"
return 0
} }
convert_ports_to_docker_args() { convert_ports_to_docker_args() {
local ports="$1" local ports="$1"
local docker_args="" local docker_args=""
if [[ -z "$ports" ]]; then
echo "No ports provided."
return 1
fi
# Split the ports by comma and trim whitespace # Split the ports by comma and trim whitespace
IFS=',' read -r -a port_array <<< "$ports" IFS=',' read -r -a port_array <<< "$ports"
# Loop through the ports and format them as Docker arguments # Loop through the ports and format them as Docker arguments
for port in "${port_array[@]}"; do for port in "${port_array[@]}"; do
port=$(echo "$port" | xargs) # Trim whitespace port=$(echo "$port" | xargs) # Trim whitespace
if [[ ! "$port" =~ ^[0-9]+$ ]]; then
echo "Invalid port: $port"
return 1
fi
docker_args+=" -p $port:$port" docker_args+=" -p $port:$port"
done done
echo "$docker_args" echo "$docker_args"
return 0
} }
install() { install() {
@@ -143,9 +165,15 @@ install() {
echo "+------------------------------+" echo "+------------------------------+"
echo echo
cd "$CODE_DIR" if ! cd "$CODE_DIR"; then
echo "Failed to navigate to $CODE_DIR."
return 1
fi
build_docker_image if ! build_docker_image; then
echo "Failed to build Docker image."
return 1
fi
echo echo
echo "+----------------------------------------+" echo "+----------------------------------------+"
@@ -156,22 +184,116 @@ install() {
echo " >>> db-middleware start" echo " >>> db-middleware start"
echo "- Or directly by running the docker container:" echo "- Or directly by running the docker container:"
echo " >>> docker run $IMAGE_NAME -p <port>:<port> -v /path/to/app/directory/" echo " >>> docker run $IMAGE_NAME -p <port>:<port> -v /path/to/app/directory/"
return 0
}
pull_clone_repo() {
local UPDATED=-1 # Default: No changes
echo "Setting up repository..."
# Create directories if they don't exist
mkdir -p "$APP_DIR/{code,configs,scripts}"
# Navigate to the code directory
if ! cd "$CODE_DIR"; then
echo "Failed to navigate to $CODE_DIR."
return 1 # Error
fi
# Check if the directory is empty
if [[ -z "$(ls -A $CODE_DIR)" ]]; then
echo "Directory is empty. Cloning repository..."
if ! git clone "$REPO_URL" .; then
echo "Failed to clone repository."
return 1 # Error
fi
echo "Repository cloned successfully."
UPDATED=0 # Changes were applied
else
# Check if the directory contains a Git repository
if [[ -d ".git" ]]; then
echo "Directory contains a Git repository."
# Fetch the latest changes
if ! git fetch origin; then
echo "Failed to fetch changes from remote."
return 1 # Error
fi
# Get the local and remote HEAD commit hashes
LOCAL_HEAD=$(git rev-parse HEAD)
REMOTE_HEAD=$(git rev-parse origin/main)
exec_in_container "git rev-parse HEAD"
local COMMIT_HASH=$?
if [[ $COMMIT_HASH -eq 0 ]]; then
echo "Commit hash in container: $COMMIT_HASH"
else
echo "Failed to get commit hash from container."
fi
# Compare the commit hashes
if [[ "$LOCAL_HEAD" != "$REMOTE_HEAD" ]]; then
echo "Repository has new changes. Pulling latest changes..."
if ! git pull "$REPO_URL"; then
echo "Failed to pull changes."
return 1 # Error
fi
echo "Repository updated successfully."
UPDATED=0 # Changes were applied
else
echo "Repository is already up to date."
UPDATED=-1 # No changes
# echo $UPDATED
fi
else
echo "Directory is not empty and does not contain a Git repository."
echo "Please ensure the directory is empty or contains a valid Git repository."
return 1 # Error
fi
fi
echo "Repository setup completed successfully: $UPDATED."
return $UPDATED # -1 = No changes, 0 = Changes applied
} }
update_code() { update_code() {
echo
echo "+-------------------------+"
echo "| Checking for updates... |"
echo "+-------------------------+"
echo
pull_clone_repo pull_clone_repo
local UPDATED=$? local UPDATED=$?
if [[ $UPDATED -eq 1 ]]; then case $UPDATED in
echo "Changes were detected and applied."
else
echo "No changes detected."
fi
return $UPDATED -1)
echo "No changes detected."
return -1 # No changes
;;
255) # 255 is -1, because Bash return codes are unsigned 8-bit integer, limited to the range 0 to 255.
echo "No changes detected."
return -1 # No changes
;;
-0)
echo "Changes were detected and applied."
return 0 # Changes applied
;;
1)
echo "Failed to update or clone repository."
return 1 # Error
;;
*)
echo "Wrong return code: \`$UPDATED\` from pull_clone_repo."
return 1
;;
esac
} }
# Function for the "upgrade" command
upgrade() { upgrade() {
echo echo
echo "+-----------------------------+" echo "+-----------------------------+"
@@ -180,104 +302,111 @@ upgrade() {
echo echo
update_code update_code
local UPDATED=$? local UPDATE_RESULT=$?
if [[ $UPDATED -eq 1 ]]; then case $UPDATE_RESULT in
echo # 255 is -1, because Bash return codes are unsigned 8-bit integer, limited to the range 0 to 255.
echo "+--------------------------------+" -1|255)
echo "| Rebuilding the Docker Image... |" echo
echo "+--------------------------------+" echo "+------------------------------------------+"
echo echo "| No changes detected. Skipping upgrade... |"
echo "+------------------------------------------+"
echo
;;
0)
echo
echo "+--------------------------------+"
echo "| Rebuilding the Docker Image... |"
echo "+--------------------------------+"
echo
build_docker_image if ! build_docker_image; then
echo "Failed to rebuild Docker image."
return 1 # Error
fi
set_up_scripts if ! set_up_scripts; then
echo "Failed to set up scripts."
echo return 1 # Error
echo "+---------------------------------------+" fi
echo "| Upgraded the Middleware Successfully! |"
echo "+---------------------------------------+"
echo
else
echo
echo "+-------------------------------------+"
echo "| No need to rebuild the Docker Image |"
echo "+-------------------------------------+"
echo
fi
echo
echo "+---------------------------------------+"
echo "| Upgraded the Middleware Successfully! |"
echo "+---------------------------------------+"
echo
;;
1)
echo "Failed to update code. Upgrade aborted."
return 1 # Error
;;
esac
return 0
} }
# Function for the "status" command
status() { status() {
echo "Running the 'status' function." echo "Checking container status..."
docker if docker ps --filter "name=$CONTAINER_NAME" --format "{{.Status}}"; then
# Add your status-checking logic here return 0
else
echo "Failed to check container status."
return 1
fi
} }
# Function for the "start" command
start() { start() {
echo "+---------------------------+" echo "+---------------------------+"
echo "| Starting the Container... |" echo "| Starting the Container... |"
echo "+---------------------------+" echo "+---------------------------+"
echo echo
docker run db-middleware
if ! docker run --name "$CONTAINER_NAME" -p "${API_PORT:-8080}:8080" "$IMAGE_NAME"; then
echo "Failed to start container."
return 1
fi
return 0
} }
# Function for the "stop" command
stop() { stop() {
echo "Running the 'stop' function." echo "Stopping the container..."
# Add your stop logic here if docker stop "$CONTAINER_NAME"; then
echo "Container stopped successfully."
return 0
else
echo "Failed to stop container."
return 1
fi
} }
# Function to display usage instructions
usage() { usage() {
echo "Usage: $0 {install|upgrade|status|start|stop}" echo "Usage: $0 {install|upgrade|update_code|status|start|stop|show_config}"
exit 1 exit 1
} }
# Main script logic
main() { main() {
# Check if an argument is provided # Check if an argument is provided
if [[ $# -eq 0 ]]; then if [[ $# -eq 0 ]]; then
usage usage
fi fi
if ! load_config; then
echo "Failed to load config. Exiting."
exit 1
fi
# Handle the argument # Handle the argument
case "$1" in case "$1" in
install) install) install ;;
install update_code) update_code ;;
;; upgrade) upgrade ;;
update_code) status) status ;;
load_config start) start ;;
update_code show_config) show_config ;;
;; stop) stop ;;
upgrade) *) echo "Invalid argument: $1"; usage ;;
load_config
upgrade
;;
status)
load_config
status
;;
start)
load_config
start
;;
show_config)
load_config
show_config
;;
stop)
load_config
stop
;;
*)
echo "Invalid argument: $1"
usage
;;
esac esac
} }