Commit f31a2c1b authored by Marco Cavalli's avatar Marco Cavalli
Browse files

add publish_spec.sh for NGSI-LD repos

parent 1dcc0b80
Loading
Loading
Loading
Loading
+151 −0
Original line number Diff line number Diff line
#!/usr/bin/env bash

set -euo pipefail

cleanup_on_failure() {
  local exit_code=$?
  if [[ $exit_code -eq 0 ]]; then
    return 0
  fi

  echo "Execution failed (exit code: $exit_code). Cleaning run artifacts..."

  if [[ -n "${FOLDER_NAME:-}" ]]; then
    rm -rf "GENERATED_FILES/${FOLDER_NAME}"
  fi

  if [[ -n "${SPEC_NAME:-}" && -n "${COMMIT_TAG:-}" ]]; then
    rm -f "baseline/${SPEC_NAME}_${COMMIT_TAG}.docx"
    rm -f "baseline/${SPEC_NAME}_${COMMIT_TAG}.pdf"
    rm -f "baseline/${SPEC_NAME}_${COMMIT_TAG}.epub"
  fi
}

trap cleanup_on_failure EXIT

PROJECT_URL="${1:-}"
COMMIT_TAG="${2:-}"
TEMPLATE_DOCX_ARG="${3:-}"
SPEC_NAME="${4:-}"

if [[ -z "$PROJECT_URL" || -z "$COMMIT_TAG" ]]; then
  echo "Usage: ./publish_spec.sh <project_url> <commit_tag> [template_docx_ignored] [spec_name]"
  exit 1
fi

IMAGE_NAME="${IMAGE_NAME:-mirkesx/spec-converter}"
DOCKERFILE_PATH="${DOCKERFILE_PATH:-Dockerfile.cicd}"
ARCH="${ARCH:-amd64}"
REBUILD="${REBUILD:-false}"
SOURCE_FORMAT="${SOURCE_FORMAT:-md}"

if [[ "$ARCH" != "amd64" && "$ARCH" != "arm64" ]]; then
  echo "Error: ARCH must be either 'amd64' or 'arm64'"
  exit 1
fi

# Allow explicit override from CI when needed.
MD_SOURCE_DIR="${MD_SOURCE_DIR:-}"
if [[ -z "$MD_SOURCE_DIR" ]]; then
  if [[ -d "./md" ]]; then
    MD_SOURCE_DIR="./md"
  else
    mapfile -t md_candidates < <(find . -mindepth 2 -maxdepth 2 -type d -name md | sort)
    if [[ ${#md_candidates[@]} -eq 0 ]]; then
      echo "Error: could not find an md directory at ./md or ./*/md"
      exit 1
    fi
    MD_SOURCE_DIR="${md_candidates[0]}"
    if [[ ${#md_candidates[@]} -gt 1 ]]; then
      echo "Warning: multiple md directories found, using: $MD_SOURCE_DIR"
      echo "Set MD_SOURCE_DIR to choose a specific one."
    fi
  fi
fi

if [[ ! -d "$MD_SOURCE_DIR" ]]; then
  echo "Error: MD_SOURCE_DIR does not exist: $MD_SOURCE_DIR"
  exit 1
fi

ABS_MD_SOURCE="$(cd "$MD_SOURCE_DIR" && pwd)"
TOP_FOLDER_NAME="$(basename "$(dirname "$ABS_MD_SOURCE")")"
FOLDER_NAME="${FOLDER_NAME:-$TOP_FOLDER_NAME}"

if [[ -z "$SPEC_NAME" ]]; then
  SPEC_NAME="$FOLDER_NAME"
fi

echo "Publishing from project: $PROJECT_URL"
echo "Detected source: $ABS_MD_SOURCE"
echo "Conversion folder: $FOLDER_NAME"
echo "Spec name: $SPEC_NAME"

if ! docker image inspect "$IMAGE_NAME" >/dev/null 2>&1 || [[ "$REBUILD" == "true" ]]; then
  if [[ ! -f "$DOCKERFILE_PATH" ]]; then
    echo "Error: Dockerfile not found at $DOCKERFILE_PATH"
    echo "Info: pull the image first (default: $IMAGE_NAME) or provide a valid Dockerfile path"
    exit 1
  fi
  docker build --build-arg TARGETARCH="$ARCH" -f "$DOCKERFILE_PATH" -t "$IMAGE_NAME" .
fi

if [[ -n "$TEMPLATE_DOCX_ARG" ]]; then
  echo "Info: template_docx argument is ignored. Using customized_reference.docx when available."
fi

mkdir -p GENERATED_FILES baseline

TEMPLATE_MOUNT=""
if [[ -f "customized_reference.docx" ]]; then
  TEMPLATE_MOUNT="$(pwd)/customized_reference.docx:/app/customized_reference.docx:ro"
else
  echo "Warning: customized_reference.docx not found, running with container default template"
fi

TEMPLATE_ARGS=()
if [[ -n "$TEMPLATE_MOUNT" ]]; then
  TEMPLATE_ARGS=(-v "$TEMPLATE_MOUNT")
fi

if [[ "$SOURCE_FORMAT" == "md" ]]; then
  docker run --rm \
    -v "$(pwd)/GENERATED_FILES:/app/GENERATED_FILES:rw" \
    -v "$ABS_MD_SOURCE:/data/sources:rw" \
    "${TEMPLATE_ARGS[@]}" \
    "$IMAGE_NAME" \
    --frm md \
    --to html \
    --folder "$FOLDER_NAME" \
    --src /data/sources
elif [[ "$SOURCE_FORMAT" != "html" ]]; then
  echo "Error: SOURCE_FORMAT must be either 'md' or 'html'"
  exit 1
fi

docker run --rm \
  -v "$(pwd)/GENERATED_FILES:/app/GENERATED_FILES:rw" \
  "${TEMPLATE_ARGS[@]}" \
  "$IMAGE_NAME" \
  --frm html \
  --to docx \
  --folder "$FOLDER_NAME" \
  --extra-outputs pdf,epub

OUTPUT_DIR="GENERATED_FILES/$FOLDER_NAME/docx"
if [[ ! -d "$OUTPUT_DIR" ]]; then
  echo "Error: expected output directory not found: $OUTPUT_DIR"
  exit 1
fi

for ext in docx pdf epub; do
  source_file="$OUTPUT_DIR/document.$ext"
  target_file="baseline/${SPEC_NAME}_${COMMIT_TAG}.$ext"
  if [[ -f "$source_file" ]]; then
    cp "$source_file" "$target_file"
  else
    echo "Warning: output not found: $source_file"
  fi
done

echo "Publication artifacts copied to baseline/"
 No newline at end of file