From 65758559cdeb1ad49ac9ed4d76e82a0d7813043c Mon Sep 17 00:00:00 2001 From: "Dr. B. M. Riazul Islam" Date: Sun, 8 Mar 2026 18:40:08 +0600 Subject: [PATCH] Prepare 0.3.0: ICD-11 MMS integration --- .gitea/workflows/ci-cd.yaml | 644 ++++++++++++++++++------------------ 1 file changed, 324 insertions(+), 320 deletions(-) diff --git a/.gitea/workflows/ci-cd.yaml b/.gitea/workflows/ci-cd.yaml index 9af2e96..9551dc7 100644 --- a/.gitea/workflows/ci-cd.yaml +++ b/.gitea/workflows/ci-cd.yaml @@ -7,62 +7,76 @@ on: pull_request: branches: [ main ] +permissions: + contents: read + +concurrency: + group: fhir-ig-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + env: REGISTRY: git.dghs.gov.bd IMAGE_NAME: gitadmin/bd-core-fhir-ig +defaults: + run: + shell: bash + jobs: build-ig: runs-on: fhir-runner steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Extract version from IG id: version run: | - VERSION=$(grep -oP '> $GITHUB_OUTPUT + echo "Extracted version: ${VERSION}" + echo "version=${VERSION}" >> "$GITHUB_OUTPUT" - if [[ "$GITHUB_REF" == refs/tags/v* ]]; then + if [[ "${GITHUB_REF}" == refs/tags/v* ]]; then BUILD_TYPE="release" TAG_VERSION="${GITHUB_REF#refs/tags/v}" - if [ "$TAG_VERSION" != "$VERSION" ]; then - echo "ERROR: Git tag version ($TAG_VERSION) doesn't match IG version ($VERSION)" + if [[ "${TAG_VERSION}" != "${VERSION}" ]]; then + echo "ERROR: Git tag version (${TAG_VERSION}) doesn't match IG version (${VERSION})" exit 1 fi else BUILD_TYPE="dev" fi - echo "build_type=$BUILD_TYPE" >> $GITHUB_OUTPUT - echo "Build type: $BUILD_TYPE" + echo "build_type=${BUILD_TYPE}" >> "$GITHUB_OUTPUT" + echo "Build type: ${BUILD_TYPE}" - - name: Prepare package-list.json and history.xml for IG Publisher + - name: Prepare package-list.json and history.xml + env: + VERSION: ${{ steps.version.outputs.version }} + BUILD_TYPE: ${{ steps.version.outputs.build_type }} run: | - VERSION="${{ steps.version.outputs.version }}" - BUILD_TYPE="${{ steps.version.outputs.build_type }}" - DATE=$(date +%Y-%m-%d) + set -euo pipefail - export VERSION DATE BUILD_TYPE + DATE="$(date +%Y-%m-%d)" + export VERSION BUILD_TYPE DATE - echo "📋 Preparing package-list.json and history.xml for IG Publisher..." + echo "Preparing package-list.json and history.xml..." - if [ ! -f "package-list.json" ]; then - echo "âš ī¸ package-list.json not found in repo root" - echo "Creating initial package-list.json..." - cat > package-list.json << 'PKGEOF' + if [[ ! -f package-list.json ]]; then + echo "package-list.json not found in repo root. Creating initial file..." + cat > package-list.json <<'PKGEOF' { "package-id": "bd.fhir.core", "title": "Bangladesh Core FHIR Implementation Guide", @@ -81,25 +95,27 @@ jobs: PKGEOF fi - python3 << 'PYEOF' + python3 <<'PYEOF' import json import os import sys + from html import escape + from pathlib import Path - version = os.environ.get('VERSION', '') - date = os.environ.get('DATE', '') - build_type = os.environ.get('BUILD_TYPE', '') + version = os.environ["VERSION"] + date = os.environ["DATE"] + build_type = os.environ["BUILD_TYPE"] - with open('package-list.json', 'r', encoding='utf-8') as f: + pkg_path = Path("package-list.json") + with pkg_path.open("r", encoding="utf-8") as f: pkg_list = json.load(f) - if 'list' not in pkg_list or not isinstance(pkg_list['list'], list): + if "list" not in pkg_list or not isinstance(pkg_list["list"], list): print("ERROR: package-list.json does not contain a valid 'list' array") sys.exit(1) - current_entries = [e for e in pkg_list['list'] if e.get('version') == 'current'] - if not current_entries: - pkg_list['list'].insert(0, { + if not any(e.get("version") == "current" for e in pkg_list["list"]): + pkg_list["list"].insert(0, { "version": "current", "desc": "Continuous Integration Build (latest in version control)", "path": "https://fhir.dghs.gov.bd/core/", @@ -107,13 +123,9 @@ jobs: "current": True }) - if build_type == 'release': - version_entry = None - for e in pkg_list['list']: - if e.get('version') == version: - version_entry = e - break - if version_entry is None: + if build_type == "release": + existing = next((e for e in pkg_list["list"] if e.get("version") == version), None) + if existing is None: new_entry = { "version": version, "date": date, @@ -122,341 +134,320 @@ jobs: "status": "trial-use", "sequence": "STU 1" } - insert_index = 1 - for i, entry in enumerate(pkg_list['list']): - if entry.get('version') == 'current': + for i, entry in enumerate(pkg_list["list"]): + if entry.get("version") == "current": insert_index = i + 1 break - - pkg_list['list'].insert(insert_index, new_entry) - print(f"✅ Added version {version} to package-list.json") + pkg_list["list"].insert(insert_index, new_entry) + print(f"Added version {version} to package-list.json") else: - print(f"â„šī¸ Version {version} already exists in package-list.json") + print(f"Version {version} already exists in package-list.json") else: - print("â„šī¸ Dev build - using existing package-list.json without release modification") + print("Dev build - keeping existing package-list.json structure") - with open('package-list.json', 'w', encoding='utf-8') as f: + with pkg_path.open("w", encoding="utf-8") as f: json.dump(pkg_list, f, indent=2, ensure_ascii=False) - PYEOF - echo "🔍 Validating package-list.json..." - python3 -m json.tool package-list.json > /dev/null && echo "✅ Valid JSON" || (echo "❌ Invalid JSON!" && exit 1) + Path("input").mkdir(parents=True, exist_ok=True) + Path("input/package-list.json").write_text( + pkg_path.read_text(encoding="utf-8"), + encoding="utf-8" + ) - echo "📂 Ensuring package-list.json is in required locations..." - mkdir -p input - cp package-list.json input/package-list.json + Path("input/pagecontent").mkdir(parents=True, exist_ok=True) - echo "📝 Generating static history.xml from package-list.json..." - mkdir -p input/pagecontent - - python3 << 'PYEOF' - import json - import os - from html import escape - - os.makedirs('input/pagecontent', exist_ok=True) - - with open('package-list.json', 'r', encoding='utf-8') as f: - pkg_list = json.load(f) - - xml = ''' -
- -

This page provides the version history for the Bangladesh Core FHIR Implementation Guide.

- -

For a machine-readable version history see package-list.json.

- -

Published Versions

- - - - - - - - - - - - ''' - - def version_key(v): + def version_key(v: str): try: - return tuple(int(x) for x in v.split('.')) - except: + return tuple(int(x) for x in v.split(".")) + except Exception: return (0,) published = [ - e for e in pkg_list['list'] - if e.get('version') and e.get('version') != "current" + e for e in pkg_list["list"] + if e.get("version") and e.get("version") != "current" + ] + published.sort(key=lambda e: version_key(e.get("version", "0.0.0")), reverse=True) + + xml_parts = [ + '', + '
', + '', + '

This page provides the version history for the Bangladesh Core FHIR Implementation Guide.

', + '', + '

For a machine-readable version history see package-list.json.

', + '', + '

Published Versions

', + '', + '
VersionDateStatusDescription
', + '', + '', + '', + '', + '', + '', + '', + '', + '', ] - # Sort newest version first - published.sort( - key=lambda e: version_key(e.get("version", "0.0.0")), - reverse=True + if published: + for idx, entry in enumerate(published): + version_escaped = escape(entry.get("version", "Unknown")) + date_escaped = escape(entry.get("date", "N/A")) + desc_escaped = escape(entry.get("desc", "")) + path_escaped = escape(entry.get("path", "#")) + status_val = entry.get("status", "unknown") + + if status_val == "trial-use": + status = 'Trial Use' + elif status_val == "normative": + status = 'Normative' + else: + status = f'{escape(status_val)}' + + badge = 'Latest ' if idx == 0 else '' + + xml_parts.extend([ + '', + f'', + f'', + f'', + f'', + '', + ]) + else: + xml_parts.extend([ + '', + '', + '', + ]) + + xml_parts.extend([ + '', + '
VersionDateStatusDescription
{badge}{version_escaped}{date_escaped}{status}{desc_escaped}
No published versions available yet.
', + '', + '

Continuous Integration Build

', + ]) + + current_entry = next((e for e in pkg_list["list"] if e.get("version") == "current"), None) + if current_entry: + path_escaped = escape(current_entry.get("path", pkg_list.get("canonical", "") + "/")) + xml_parts.append( + f'

The latest development build is available at: {path_escaped}

' + ) + else: + xml_parts.append('

No CI build entry found in package-list.json.

') + + xml_parts.extend(['', '
', '']) + + Path("input/pagecontent/history.xml").write_text( + "\n".join(xml_parts), + encoding="utf-8" ) - published_found = False - first_row = True - - for entry in published: - published_found = True - - version = escape(entry.get('version', 'Unknown')) - date = escape(entry.get('date', 'N/A')) - desc = escape(entry.get('desc', '')) - path = escape(entry.get('path', '#')) - - status_val = entry.get('status', 'unknown') - - if status_val == "trial-use": - status = 'Trial Use' - elif status_val == "normative": - status = 'Normative' - else: - status = f'{escape(status_val)}' - - badge = 'Latest ' if first_row else '' - - xml += f''' - - {badge}{version} - {date} - {status} - {desc} - - ''' - - first_row = False - - if not published_found: - xml += ''' - - No published versions available yet. - - ''' - - xml += ''' - - - -

Continuous Integration Build

- ''' - - current_entry = None - for entry in pkg_list['list']: - if entry.get('version') == 'current': - current_entry = entry - break - - if current_entry: - path = escape(current_entry.get('path', pkg_list.get('canonical', '') + '/')) - xml += f''' -

The latest development build is available at: - {path}

- ''' - else: - xml += ''' -

No CI build entry found in package-list.json.

- ''' - - xml += ''' - - ''' - - with open('input/pagecontent/history.xml', 'w', encoding='utf-8') as f: - f.write(xml) - - print("✅ Generated static history.xml") - print(f" File location: {os.path.abspath('input/pagecontent/history.xml')}") - print(f" File size: {os.path.getsize('input/pagecontent/history.xml')} bytes") + print("Generated input/pagecontent/history.xml") PYEOF - if [ -f "input/pagecontent/history.xml" ]; then - echo "✅ Verified: history.xml exists" - echo " First 20 lines:" - head -20 input/pagecontent/history.xml + python3 -m json.tool package-list.json > /dev/null + test -f input/package-list.json + test -f input/pagecontent/history.xml + + echo "Prepared files:" + echo " - $(pwd)/package-list.json" + echo " - $(pwd)/input/package-list.json" + echo " - $(pwd)/input/pagecontent/history.xml" + + - name: Lightweight disk cleanup + run: | + set -euo pipefail + + echo "Disk usage before cleanup:" + df -h + + AVAIL_GB="$(df -BG "$GITHUB_WORKSPACE" | awk 'NR==2 {gsub(/G/, "", $4); print $4}')" + + if [[ "${AVAIL_GB}" -lt 10 ]]; then + echo "Low free disk detected (${AVAIL_GB}G). Running safe cleanup..." + docker system prune -af || true + rm -rf "${GITHUB_WORKSPACE}/output" \ + "${GITHUB_WORKSPACE}/temp" \ + "${GITHUB_WORKSPACE}/input-cache" \ + "${GITHUB_WORKSPACE}/fsh-generated" || true + rm -rf ~/.fhir/packages || true else - echo "❌ ERROR: history.xml was not created!" - exit 1 + echo "Sufficient disk available (${AVAIL_GB}G). Skipping aggressive cleanup." fi - echo "✅ Pre-build preparation complete:" - echo " - Root: $(pwd)/package-list.json" - echo " - Input: $(pwd)/input/package-list.json" - echo " - History: $(pwd)/input/pagecontent/history.xml" - echo "===============================" - echo "PACKAGE LIST USED FOR BUILD:" - cat package-list.json - echo "-------------------------------" - echo "INPUT COPY:" - cat input/package-list.json - echo "===============================" - - - name: Emergency Disk Cleanup - run: | - echo "Disk usage before:" + echo "Disk usage after cleanup:" df -h - echo "Clearing tool cache..." - rm -rf /opt/hostedtoolcache/* || true - - rm -rf /usr/share/dotnet || true - rm -rf /usr/local/lib/android || true - rm -rf /opt/ghc || true - rm -rf ~/.fhir/packages || true - - echo "Disk usage after:" - df -h - - - name: Install Docker CLI + - name: Ensure Docker is available run: | - apt-get update - apt-get install -y docker.io + set -euo pipefail + + if command -v docker >/dev/null 2>&1; then + echo "Docker already installed: $(docker --version)" + exit 0 + fi + + echo "Docker not found. Installing..." + sudo apt-get update + sudo apt-get install -y docker.io docker --version - name: Preload previous IG package for comparison + env: + VERSION: ${{ steps.version.outputs.version }} run: | + set -euo pipefail + echo "Detecting previous version..." - export VERSION="${{ steps.version.outputs.version }}" - PREV_VERSION=$(python3 <<'PY' + + PREV_VERSION="$( + python3 <<'PY' import json import os - current_build = os.environ.get("VERSION") + current_build = os.environ.get("VERSION", "") - with open("package-list.json") as f: + with open("package-list.json", encoding="utf-8") as f: data = json.load(f) def parse(v): try: return tuple(int(x) for x in v.split(".")) - except: + except Exception: return (0,) versions = [ - v["version"] - for v in data["list"] - if v.get("version") not in ("current", current_build) + entry["version"] + for entry in data.get("list", []) + if entry.get("version") not in ("current", current_build) ] - versions.sort(key=parse, reverse=True) - print(versions[0] if versions else "") PY - ) - - if [ -z "$PREV_VERSION" ]; then - echo "No previous version found. Skipping preload." - exit 0 - fi - - echo "Previous version detected: $PREV_VERSION" + )" + rm -rf previous-packages mkdir -p previous-packages - TMPDIR=$(mktemp -d) - URL="https://fhir.dghs.gov.bd/core/$PREV_VERSION/package.tgz" + if [[ -z "${PREV_VERSION}" ]]; then + echo "No previous version found. Skipping preload." + exit 0 + fi - echo "Downloading $URL" - curl -fL "$URL" -o "$TMPDIR/package.tgz" + echo "Previous version detected: ${PREV_VERSION}" - mkdir -p "previous-packages/bd.fhir.core#$PREV_VERSION" - tar -xzf "$TMPDIR/package.tgz" -C "previous-packages/bd.fhir.core#$PREV_VERSION" + TMPDIR="$(mktemp -d)" + trap 'rm -rf "$TMPDIR"' EXIT + + URL="https://fhir.dghs.gov.bd/core/${PREV_VERSION}/package.tgz" + echo "Downloading ${URL}" + curl -fL "${URL}" -o "${TMPDIR}/package.tgz" + + mkdir -p "previous-packages/bd.fhir.core#${PREV_VERSION}" + tar -xzf "${TMPDIR}/package.tgz" -C "previous-packages/bd.fhir.core#${PREV_VERSION}" echo "Previous package cached:" - ls previous-packages + ls -lah previous-packages - name: Build FHIR IG + env: + VERSION: ${{ steps.version.outputs.version }} run: | - echo "Building FHIR IG version ${{ steps.version.outputs.version }}..." + set -euo pipefail - CONTAINER_ID=$(docker create \ - -v $(pwd)/previous-packages:/previous-packages \ - hl7fhir/ig-publisher-base:latest \ - /bin/bash -c " + echo "Building FHIR IG version ${VERSION}..." - mkdir -p /tmp/build - cp -r /home/publisher/ig /tmp/build/ig + CONTAINER_ID="$( + docker create \ + -v "$(pwd)/previous-packages:/previous-packages" \ + hl7fhir/ig-publisher-base:latest \ + /bin/bash -lc ' + set -euo pipefail + mkdir -p /tmp/build + cp -r /home/publisher/ig /tmp/build/ig + cd /tmp/build/ig + rm -f package-list.json + _updatePublisher.sh -y + _genonce.sh + ' + )" - cd /tmp/build/ig + echo "Container ID: ${CONTAINER_ID}" - rm -f package-list.json + cleanup() { + docker rm -f "${CONTAINER_ID}" >/dev/null 2>&1 || true + } + trap cleanup EXIT - _updatePublisher.sh -y - _genonce.sh - ") + docker cp "$(pwd)/." "${CONTAINER_ID}:/home/publisher/ig/" - echo "Container ID: $CONTAINER_ID" - - docker cp "$(pwd)/." "$CONTAINER_ID:/home/publisher/ig/" - echo "Mounted FHIR packages:" + echo "Mounted previous packages:" ls -R previous-packages || echo "No previous packages directory" - docker start -a "$CONTAINER_ID" + + docker start -a "${CONTAINER_ID}" EXIT_CODE=$? echo "Copying outputs from container..." - docker cp "$CONTAINER_ID:/tmp/build/ig/output" ./output || echo "Warning: No output directory" - docker cp "$CONTAINER_ID:/tmp/build/ig/fsh-generated" ./fsh-generated || echo "No FSH generated" - docker cp "$CONTAINER_ID:/tmp/build/ig/input-cache" ./input-cache || echo "No input-cache" - docker cp "$CONTAINER_ID:/tmp/build/ig/temp" ./temp || echo "No temp directory" + docker cp "${CONTAINER_ID}:/tmp/build/ig/output" ./output || echo "Warning: No output directory" + docker cp "${CONTAINER_ID}:/tmp/build/ig/fsh-generated" ./fsh-generated || echo "No FSH generated" + docker cp "${CONTAINER_ID}:/tmp/build/ig/input-cache" ./input-cache || echo "No input-cache" + docker cp "${CONTAINER_ID}:/tmp/build/ig/temp" ./temp || echo "No temp directory" - if [ $EXIT_CODE -ne 0 ]; then - echo "Build failed, showing logs:" - docker logs "$CONTAINER_ID" - docker rm "$CONTAINER_ID" + if [[ ${EXIT_CODE} -ne 0 ]]; then + echo "Build failed." + exit "${EXIT_CODE}" + fi + + if [[ ! -f output/index.html ]]; then + echo "ERROR: Build failed - output/index.html not found" exit 1 fi - docker rm "$CONTAINER_ID" - - if [ ! -f "output/index.html" ]; then - echo "ERROR: Build failed - no index.html" - exit 1 - fi - - echo "" - echo "🔍 Checking for history.html..." - if [ -f "output/history.html" ]; then - echo "✅ history.html generated successfully!" - echo "📄 history.html size: $(ls -lh output/history.html | awk '{print $5}')" + echo "Checking for history.html..." + if [[ -f output/history.html ]]; then + echo "history.html generated successfully" + ls -lh output/history.html else - echo "âš ī¸ WARNING: history.html was NOT generated" - echo "This might indicate an issue with the template or history.xml/package-list.json" + echo "WARNING: history.html was not generated" fi - echo "================================" + echo "IG Publisher comparison log:" cat output/qa.compare.txt || echo "qa.compare.txt not found" - echo "================================" - echo "✅ Build successful!" + + echo "Build successful" - name: Update package-feed.xml for releases if: steps.version.outputs.build_type == 'release' + env: + VERSION: ${{ steps.version.outputs.version }} run: | - VERSION="${{ steps.version.outputs.version }}" - DATETIME=$(date -u +%Y-%m-%dT%H:%M:%SZ) + set -euo pipefail - if [ ! -f "package-feed.xml" ]; then - echo "âš ī¸ package-feed.xml not found, creating initial feed..." + DATETIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)" + export DATETIME + if [[ ! -f package-feed.xml ]]; then + echo "package-feed.xml not found, creating initial feed..." cat > package-feed.xml < bd.fhir.core https://fhir.dghs.gov.bd/core/package-feed.xml - $DATETIME + ${DATETIME} EOF - fi + fi - cat > update-feed.py << 'EOF' - import sys + python3 <<'PYEOF' + import os import xml.etree.ElementTree as ET - version = sys.argv[1] - datetime_iso = sys.argv[2] + version = os.environ["VERSION"] + datetime_iso = os.environ["DATETIME"] ET.register_namespace('', 'http://www.w3.org/2005/Atom') @@ -507,33 +498,35 @@ jobs: root.insert(insert_pos, new_entry) tree.write('output/package-feed.xml', encoding='utf-8', xml_declaration=True) - print("✅ Updated package-feed.xml") - EOF + print("Updated package-feed.xml") + PYEOF - python3 update-feed.py "$VERSION" "$DATETIME" - - cp package-list.json output/package-list.json - - echo "📋 Updated registry files" + cp package-list.json output/package-list.json + echo "Updated registry files" - name: Prepare deployment artifact run: | + set -euo pipefail + VERSION="${{ steps.version.outputs.version }}" BUILD_TYPE="${{ steps.version.outputs.build_type }}" + BUILD_DATE="$(date -u +%Y-%m-%dT%H:%M:%SZ)" tar -czf ig-output.tar.gz -C output . - echo "version=$VERSION" > deployment.env - echo "build_type=$BUILD_TYPE" >> deployment.env - echo "build_date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> deployment.env + { + echo "version=${VERSION}" + echo "build_type=${BUILD_TYPE}" + echo "build_date=${BUILD_DATE}" + } > deployment.env - echo "đŸ“Ļ Output contents:" + echo "Output contents:" ls -lh output/ | grep -E "(history\.html|package-list\.json|package-feed\.xml|index\.html)" || echo "Some files may be missing" ls -lh ig-output.tar.gz - name: Upload artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ig-output path: | @@ -541,6 +534,7 @@ jobs: deployment.env package-list.json package-feed.xml + if-no-files-found: warn retention-days: 30 deploy: @@ -550,22 +544,25 @@ jobs: steps: - name: Download artifact - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ig-output - name: Load deployment env id: deploy_info run: | + set -euo pipefail + source deployment.env - echo "version=$version" >> $GITHUB_OUTPUT - echo "build_type=$build_type" >> $GITHUB_OUTPUT - echo "build_date=$build_date" >> $GITHUB_OUTPUT - echo "Deploying version: $version" - echo "Build type: $build_type" + echo "version=${version}" >> "$GITHUB_OUTPUT" + echo "build_type=${build_type}" >> "$GITHUB_OUTPUT" + echo "build_date=${build_date}" >> "$GITHUB_OUTPUT" - - name: Deploy to server + echo "Deploying version: ${version}" + echo "Build type: ${build_type}" + + - name: Deploy files to server uses: appleboy/scp-action@v0.1.7 with: host: ${{ secrets.DEPLOY_HOST }} @@ -583,7 +580,7 @@ jobs: password: ${{ secrets.DEPLOY_PASSWORD }} port: ${{ secrets.DEPLOY_PORT || 22 }} script: | - set -e + set -euo pipefail source /tmp/fhir-ig-deploy/deployment.env @@ -597,12 +594,12 @@ jobs: VERSIONS_DIR="/opt/fhir-ig/versions" mkdir -p "$VERSIONS_DIR" - if [ "$build_type" = "release" ]; then + if [[ "$build_type" == "release" ]]; then TARGET_DIR="$VERSIONS_DIR/$version" - echo "đŸ“Ļ Deploying release version to: $TARGET_DIR" + echo "Deploying release version to: $TARGET_DIR" else TARGET_DIR="$VERSIONS_DIR/dev" - echo "🔧 Deploying dev build to: $TARGET_DIR" + echo "Deploying dev build to: $TARGET_DIR" mkdir -p "$TARGET_DIR" echo "Cleaning old dev files..." rm -rf "$TARGET_DIR"/* @@ -613,29 +610,37 @@ jobs: echo "Extracting IG output..." tar -xzf /tmp/fhir-ig-deploy/ig-output.tar.gz -C "$TARGET_DIR" - if [ -f "$TARGET_DIR/history.html" ]; then - echo "✅ history.html deployed successfully" + if [[ -f "$TARGET_DIR/history.html" ]]; then + echo "history.html deployed successfully" else - echo "âš ī¸ WARNING: history.html not found in deployment" + echo "WARNING: history.html not found in deployment" fi - cp "$TARGET_DIR/package-list.json" "$VERSIONS_DIR/package-list.json" - cp "$TARGET_DIR/package-feed.xml" "$VERSIONS_DIR/package-feed.xml" + if [[ -f "$TARGET_DIR/package-list.json" ]]; then + cp "$TARGET_DIR/package-list.json" "$VERSIONS_DIR/package-list.json" + cp "$TARGET_DIR/package-list.json" "/opt/fhir-ig/package-list.json" + elif [[ -f /tmp/fhir-ig-deploy/package-list.json ]]; then + cp /tmp/fhir-ig-deploy/package-list.json "$VERSIONS_DIR/package-list.json" + cp /tmp/fhir-ig-deploy/package-list.json "/opt/fhir-ig/package-list.json" + fi - cp "$TARGET_DIR/package-list.json" "/opt/fhir-ig/package-list.json" - cp "$TARGET_DIR/package-feed.xml" "/opt/fhir-ig/package-feed.xml" + if [[ -f "$TARGET_DIR/package-feed.xml" ]]; then + cp "$TARGET_DIR/package-feed.xml" "$VERSIONS_DIR/package-feed.xml" + cp "$TARGET_DIR/package-feed.xml" "/opt/fhir-ig/package-feed.xml" + elif [[ -f /tmp/fhir-ig-deploy/package-feed.xml ]]; then + cp /tmp/fhir-ig-deploy/package-feed.xml "$VERSIONS_DIR/package-feed.xml" + cp /tmp/fhir-ig-deploy/package-feed.xml "/opt/fhir-ig/package-feed.xml" + fi - if [ "$build_type" = "release" ]; then - echo "Updating 'current' symlink to point to $version" - rm -f "$VERSIONS_DIR/current" - ln -sf "$version" "$VERSIONS_DIR/current" + if [[ "$build_type" == "release" ]]; then + echo "Updating current symlink to point to $version" + ln -sfn "$version" "$VERSIONS_DIR/current" fi cd /opt/fhir-ig - if [ ! -f "docker-compose.prod.yml" ]; then + if [[ ! -f docker-compose.prod.yml ]]; then echo "ERROR: docker-compose.prod.yml not found!" - echo "Please deploy the updated docker-compose.prod.yml and nginx.conf first" exit 1 fi @@ -644,9 +649,8 @@ jobs: rm -rf /tmp/fhir-ig-deploy echo "==========================================" - echo "✅ Deployment completed successfully!" - echo "Version $version is now available at:" - if [ "$build_type" = "release" ]; then + echo "Deployment completed successfully" + if [[ "$build_type" == "release" ]]; then echo " - https://fhir.dghs.gov.bd/core/$version/" echo " - https://fhir.dghs.gov.bd/core/$version/history.html" echo " - https://fhir.dghs.gov.bd/core/ (current)" @@ -656,4 +660,4 @@ jobs: echo "==========================================" echo "Available versions:" - ls -lh "$VERSIONS_DIR" | grep -v total \ No newline at end of file + ls -lh "$VERSIONS_DIR" | grep -v total || true \ No newline at end of file