diff --git a/isolated/apply-update.sh b/isolated/apply-update.sh index 0da9c5e..4798570 100644 --- a/isolated/apply-update.sh +++ b/isolated/apply-update.sh @@ -136,6 +136,42 @@ contains_service() { return 1 } +escape_sed_replacement() { + local value="$1" + value="${value//\\/\\\\}" + value="${value//&/\\&}" + value="${value//|/\\|}" + printf '%s\n' "$value" +} + +apply_runtime_env_defaults() { + local defaults_file="$SCRIPT_DIR/update-env.defaults" + [[ -f "$defaults_file" ]] || return 0 + + local backup_file line key value escaped + backup_file="${ENV_FILE}.bak-$(date '+%Y%m%d%H%M%S')" + cp "$ENV_FILE" "$backup_file" + log "Apply runtime env defaults: $defaults_file" + log "Runtime env backup: $backup_file" + + while IFS= read -r line || [[ -n "$line" ]]; do + [[ -n "$line" ]] || continue + [[ "$line" == \#* ]] && continue + [[ "$line" == *"="* ]] || continue + + key="${line%%=*}" + value="${line#*=}" + [[ "$key" =~ ^[A-Za-z_][A-Za-z0-9_]*$ ]] || die "Invalid env key in $defaults_file: $key" + + escaped="$(escape_sed_replacement "$value")" + if grep -q "^${key}=" "$ENV_FILE"; then + sed -i "s|^${key}=.*|${key}=${escaped}|" "$ENV_FILE" + else + printf '\n%s=%s\n' "$key" "$value" >> "$ENV_FILE" + fi + done < "$defaults_file" +} + need_cmd docker ENV_FILE="$(resolve_runtime_file "$ENV_FILE" ".env")" resolve_compose_files @@ -147,6 +183,8 @@ mapfile -t UPDATE_SERVICES < <(read_services "$@") COMPOSE_CMD="$(resolve_compose_cmd)" +apply_runtime_env_defaults + log "Compose files: ${RESOLVED_COMPOSE_FILES[*]}" log "Load images: $IMAGE_TAR" docker load -i "$IMAGE_TAR" diff --git a/isolated/build-update.sh b/isolated/build-update.sh index b31840b..5866666 100644 --- a/isolated/build-update.sh +++ b/isolated/build-update.sh @@ -224,6 +224,11 @@ prepare_package() { cp "$SCRIPT_DIR/apply-update.sh" "$PACKAGE_DIR/apply-update.sh" chmod +x "$PACKAGE_DIR/apply-update.sh" + local profile_dir="${PROFILE_DIR:-$SCRIPT_DIR/profiles/$DEPLOY_ENV}" + if [[ -f "$profile_dir/update-env.defaults" ]]; then + cp "$profile_dir/update-env.defaults" "$PACKAGE_DIR/update-env.defaults" + fi + local service for service in "${REQUESTED_SERVICES[@]}"; do compose_service_name "$service" diff --git a/isolated/profiles/docker-compose.yml b/isolated/profiles/docker-compose.yml index 2b856c1..a9673b0 100644 --- a/isolated/profiles/docker-compose.yml +++ b/isolated/profiles/docker-compose.yml @@ -244,12 +244,12 @@ services: emp-data: <<: *app-env image: ${IMAGE_NAMESPACE:-emp-test}/emp-data:${IMAGE_TAG:-latest} - mem_limit: ${EMP_DATA_MEM_LIMIT:-5g} + mem_limit: ${EMP_DATA_MEM_LIMIT:-12g} volumes: - /data/emp/logs/${IMAGE_NAMESPACE:-emp}/emp-data:/logs environment: <<: *java-file-log - JAVA_TOOL_OPTIONS: "${EMP_DATA_JAVA_TOOL_OPTIONS:--Xms2g -Xmx4g}" + JAVA_TOOL_OPTIONS: "${EMP_DATA_JAVA_TOOL_OPTIONS:--Xms4g -Xmx8g}" LOGGING_FILE_NAME: /logs/emp-data.log LOGGING_LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN: /logs/emp-data-%d{yyyy-MM-dd}.%i.log SPRING_KAFKA_LISTENER_CONCURRENCY: ${EMP_DATA_KAFKA_CONCURRENCY:-10} diff --git a/isolated/profiles/emp-uat/.env.example b/isolated/profiles/emp-uat/.env.example index 02f4abe..175a6e0 100644 --- a/isolated/profiles/emp-uat/.env.example +++ b/isolated/profiles/emp-uat/.env.example @@ -52,6 +52,8 @@ KAFKA_TOPIC=YuanJing-uat-vehicle-mock-data KAFKA_USER= KAFKA_PWD= # emp-data Kafka listener 消费线程数,profiles/docker-compose.yml 会映射为 Spring Kafka concurrency。 +EMP_DATA_MEM_LIMIT=12g +EMP_DATA_JAVA_TOOL_OPTIONS=-Xms4g -Xmx8g EMP_DATA_KAFKA_CONCURRENCY=10 EMP_DATA_KAFKA_MAX_POLL_RECORDS=500 diff --git a/isolated/profiles/emp-uat/update-env.defaults b/isolated/profiles/emp-uat/update-env.defaults new file mode 100644 index 0000000..29cc8f4 --- /dev/null +++ b/isolated/profiles/emp-uat/update-env.defaults @@ -0,0 +1,4 @@ +# Runtime defaults that emp-uat incremental update packages should enforce +# before recreating services. +EMP_DATA_MEM_LIMIT=12g +EMP_DATA_JAVA_TOOL_OPTIONS=-Xms4g -Xmx8g