#!/usr/bin/env sh set -eu if [ "$#" -ne 5 ]; then echo "用法: $0 <环境> <镜像仓库> <镜像标签> <逗号分隔服务> <环境文件>" >&2 exit 2 fi DEPLOY_ENV="$1" IMAGE_REPOSITORY="$2" IMAGE_TAG="$3" SERVICE_CSV="$4" ENV_FILE="$5" if [ ! -f "$ENV_FILE" ]; then echo "环境文件不存在: $ENV_FILE" >&2 exit 2 fi SERVICES=$(printf '%s' "$SERVICE_CSV" | tr ',' ' ') env_file_has_key() { grep -q "^$1=" "$ENV_FILE" } env_file_value() { sed -n "s/^$1=//p" "$ENV_FILE" | tail -n 1 | tr -d '\r' } case " $SERVICES " in *" file "*) if ! env_file_has_key ROCKETMQ_NAME_SERVER || [ -z "$(env_file_value ROCKETMQ_NAME_SERVER)" ]; then echo "部署 file 服务时,环境文件必须包含非空 ROCKETMQ_NAME_SERVER" >&2 exit 2 fi if ! env_file_has_key MQ_TOPIC_PREFIX; then echo "部署 file 服务时,环境文件必须显式包含 MQ_TOPIC_PREFIX:测试填 test-,生产填空字符串" >&2 exit 2 fi MQ_PREFIX=$(env_file_value MQ_TOPIC_PREFIX) case "$DEPLOY_ENV" in test) if [ "$MQ_PREFIX" != "test-" ]; then echo "测试环境部署 file 服务时 MQ_TOPIC_PREFIX 必须为 test-" >&2 exit 2 fi ;; production) if [ -n "$MQ_PREFIX" ]; then echo "生产环境部署 file 服务时 MQ_TOPIC_PREFIX 必须显式为空字符串" >&2 exit 2 fi ;; *) if [ -z "$MQ_PREFIX" ] || [ "$MQ_PREFIX" = "test-" ]; then echo "预发布环境部署 file 服务时 MQ_TOPIC_PREFIX 必须为非空且不能使用 test-" >&2 exit 2 fi ;; esac ;; esac export DEPLOY_ENV IMAGE_REPOSITORY IMAGE_TAG PULL_POLICY_ARGS="" if [ "$DEPLOY_ENV" = "test" ]; then PULL_POLICY_ARGS="--pull never" else docker compose \ --project-name "firstleg-${DEPLOY_ENV}" \ --env-file "$ENV_FILE" \ -f deploy/docker-compose.yml \ pull $SERVICES fi docker compose \ --project-name "firstleg-${DEPLOY_ENV}" \ --env-file "$ENV_FILE" \ -f deploy/docker-compose.yml \ up -d --remove-orphans $PULL_POLICY_ARGS $SERVICES docker compose \ --project-name "firstleg-${DEPLOY_ENV}" \ --env-file "$ENV_FILE" \ -f deploy/docker-compose.yml \ ps $SERVICES