From f31a2c1b04864c1ff5cfbf5b668ee5713cf37aad Mon Sep 17 00:00:00 2001 From: Marco Cavalli Date: Tue, 14 Apr 2026 14:44:51 +0000 Subject: [PATCH 1/2] add publish_spec.sh for NGSI-LD repos --- specifications/generateCR/publish_spec.sh | 151 ++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 specifications/generateCR/publish_spec.sh diff --git a/specifications/generateCR/publish_spec.sh b/specifications/generateCR/publish_spec.sh new file mode 100644 index 0000000..c33650e --- /dev/null +++ b/specifications/generateCR/publish_spec.sh @@ -0,0 +1,151 @@ +#!/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 [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 -- GitLab From bf00e18da9de68455fd129a9f7542a0818d20326 Mon Sep 17 00:00:00 2001 From: Marco Cavalli Date: Tue, 14 Apr 2026 14:56:31 +0000 Subject: [PATCH 2/2] simplify logic --- specifications/generateCR/publish_spec.sh | 48 ++++++++--------------- 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/specifications/generateCR/publish_spec.sh b/specifications/generateCR/publish_spec.sh index c33650e..ecdb637 100644 --- a/specifications/generateCR/publish_spec.sh +++ b/specifications/generateCR/publish_spec.sh @@ -33,16 +33,12 @@ if [[ -z "$PROJECT_URL" || -z "$COMMIT_TAG" ]]; then 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 +# Execution assumptions for this repository pipeline: +# - fixed container image: mirkesx/spec-converter +# - pull image on each run +# - source format is always markdown +# - no local image build path +IMAGE_NAME="mirkesx/spec-converter" # Allow explicit override from CI when needed. MD_SOURCE_DIR="${MD_SOURCE_DIR:-}" @@ -81,14 +77,7 @@ 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 +docker pull "$IMAGE_NAME" if [[ -n "$TEMPLATE_DOCX_ARG" ]]; then echo "Info: template_docx argument is ignored. Using customized_reference.docx when available." @@ -108,20 +97,15 @@ 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" \ + -v "$ABS_MD_SOURCE:/data/sources:rw" \ + "${TEMPLATE_ARGS[@]}" \ + "$IMAGE_NAME" \ + --frm md \ + --to html \ + --folder "$FOLDER_NAME" \ + --src /data/sources docker run --rm \ -v "$(pwd)/GENERATED_FILES:/app/GENERATED_FILES:rw" \ -- GitLab