From c267d4f6416560c4cc94276239e50822f2f2cfa7 Mon Sep 17 00:00:00 2001 From: Yonas Tewabe Date: Tue, 16 Jun 2026 10:18:32 +0300 Subject: [PATCH 1/6] Enhance deployment workflow with change detection Added a job to detect changed services and conditionally deploy based on changes. Updated deployment strategy to handle service-specific environment files. --- .github/workflows/deploy.yml | 181 ++++++++++++++++++++++++++++++----- 1 file changed, 155 insertions(+), 26 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index dd241242e..c7ad58650 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,5 +1,4 @@ name: Deploy Stacks - on: push: branches: @@ -9,52 +8,182 @@ on: workflow_dispatch: permissions: - contents: read + contents: read concurrency: group: deploy-${{ github.ref_name }} cancel-in-progress: true jobs: + detect-changes: + name: Detect changed services + runs-on: self-hosted + outputs: + matrix: ${{ steps.filter.outputs.matrix }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - name: Determine changed services + id: filter + run: | + set -euo pipefail + ALL_SERVICES=( + "freight-api" + # "freight-portal" + # "freight-backoffice" + "passenger-api" + "passenger-portal" + "passenger-backoffice" + "payment-api" + ) + + # workflow_dispatch: deploy everything + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + JSON=$(printf '%s\n' "${ALL_SERVICES[@]}" | jq -R . | jq -sc .) + echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" + exit 0 + fi + + CHANGED=$(git diff --name-only HEAD~1 HEAD) + echo "=== Changed files ===" + echo "$CHANGED" + echo "=====================" + + SERVICES=() + + # ------------------------------------------------------- + # Tier 1: Non-deployable files — skip if ONLY these changed + # ------------------------------------------------------- + NON_DEPLOYABLE_PATTERN="^docs/\ +|^README\.md$\ +|^DEPLOYMENT\.md$\ +|^CLAUDE\.md$\ +|^checkpoint\.md$\ +|^orgstructure\.md$\ +|^ITMLS_DB_Design\.md$\ +|.*\.md$\ +|^\.eslintrc\ +|^\.prettierrc\ +|^\.editorconfig\ +|^\.gitignore\ +|^\.gitattributes\ +|^commitlint\.config\.js$" + + ALL_NON_DEPLOYABLE=true + while IFS= read -r file; do + if ! echo "$file" | grep -qE "$NON_DEPLOYABLE_PATTERN"; then + ALL_NON_DEPLOYABLE=false + break + fi + done <<< "$CHANGED" + + if [ "$ALL_NON_DEPLOYABLE" = "true" ]; then + echo "Only non-deployable files changed. Skipping deploy." + echo "matrix=[]" >> "$GITHUB_OUTPUT" + exit 0 + fi + + # ------------------------------------------------------- + # Tier 2: Global files — deploy all services + # ------------------------------------------------------- + GLOBAL_PATTERN="^\.github/\ +|^docker-compose\.yaml$\ +|^turbo\.json$\ +|^tsconfig\.json$\ +|^tsconfig\.base\.json$\ +|^pnpm-workspace\.yaml$\ +|^pnpm-lock\.yaml$\ +|^package\.json$\ +|^\.env(\.[a-z]+)?$\ +|^packages/\ +|^infrastructure/\ +|^scripts/deploy/\ +|^wagon.*\.ts$\ +|^cargo.*\.ts$\ +|^container.*\.ts$\ +|^use-.*\.ts$\ +|^.*\.service\.ts$\ +|^.*\.entity\.ts$\ +|^.*-types\.ts$" + + if echo "$CHANGED" | grep -qE "$GLOBAL_PATTERN"; then + echo "Global file(s) changed — deploying all services." + JSON=$(printf '%s\n' "${ALL_SERVICES[@]}" | jq -R . | jq -sc .) + echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" + exit 0 + fi + + # ------------------------------------------------------- + # Tier 3: Per-service app paths (exact structure) + # ------------------------------------------------------- + + # Freight + echo "$CHANGED" | grep -q "^apps/edr-freight-api/" && SERVICES+=("freight-api") + # echo "$CHANGED" | grep -q "^apps/edr-freight-web/portal/" && SERVICES+=("freight-portal") + # echo "$CHANGED" | grep -q "^apps/edr-freight-web/backoffice/" && SERVICES+=("freight-backoffice") + + # Passenger + echo "$CHANGED" | grep -q "^apps/edr-passenger-api/" && SERVICES+=("passenger-api") + echo "$CHANGED" | grep -q "^apps/edr-passenger-web/portal/" && SERVICES+=("passenger-portal") + echo "$CHANGED" | grep -q "^apps/edr-passenger-web/backoffice/" && SERVICES+=("passenger-backoffice") + + # Payment + echo "$CHANGED" | grep -q "^apps/edr-payment-api/" && SERVICES+=("payment-api") + + # Deduplicate while preserving consistent order + SERVICES=($(printf '%s\n' "${SERVICES[@]}" | sort -u)) + + if [ ${#SERVICES[@]} -eq 0 ]; then + echo "No deployable service changes detected." + echo "matrix=[]" >> "$GITHUB_OUTPUT" + else + echo "Services to deploy: ${SERVICES[*]}" + JSON=$(printf '%s\n' "${SERVICES[@]}" | jq -R . | jq -sc .) + echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" + fi + deploy: name: Deploy ${{ matrix.service }} + needs: detect-changes + if: ${{ needs.detect-changes.outputs.matrix != '[]' }} runs-on: self-hosted strategy: fail-fast: false matrix: - include: - - project: edr-freight - build_env_file: freight-web.build.env - service: freight-api - # - project: edr-freight - # build_env_file: freight-web.build.env - # service: freight-portal - # - project: edr-freight - # build_env_file: freight-web.build.env - # service: freight-backoffice - - project: edr-passenger - build_env_file: passenger-web.build.env - service: passenger-api - - project: edr-passenger - build_env_file: passenger-web.build.env - service: passenger-portal - - project: edr-passenger - build_env_file: passenger-web.build.env - service: passenger-backoffice - - project: edr-payment - build_env_file: payment-web.build.env - service: payment-api + service: ${{ fromJson(needs.detect-changes.outputs.matrix) }} env: - PROJECT: ${{ matrix.project }} BRANCH: ${{ github.ref_name }} DEPLOY_USER: tria - BUILD_ENV_FILE: ${{ matrix.build_env_file }} DOCKER_BUILDKIT: "1" COMPOSE_DOCKER_CLI_BUILD: "1" + steps: - name: Checkout uses: actions/checkout@v4 + - name: Resolve project and build env file + run: | + case "${{ matrix.service }}" in + freight-api|freight-portal|freight-backoffice) + echo "PROJECT=edr-freight" >> "$GITHUB_ENV" + echo "BUILD_ENV_FILE=freight-web.build.env" >> "$GITHUB_ENV" + ;; + passenger-api|passenger-portal|passenger-backoffice) + echo "PROJECT=edr-passenger" >> "$GITHUB_ENV" + echo "BUILD_ENV_FILE=passenger-web.build.env" >> "$GITHUB_ENV" + ;; + payment-api) + echo "PROJECT=edr-payment" >> "$GITHUB_ENV" + echo "BUILD_ENV_FILE=payment-web.build.env" >> "$GITHUB_ENV" + ;; + *) + echo "Unknown service: ${{ matrix.service }}" && exit 1 + ;; + esac + - name: Sync environment from server run: | chmod +x scripts/deploy/*.sh From f52fc44ca1cc01c4d6a602046805bb86a270f5d4 Mon Sep 17 00:00:00 2001 From: Yonas Tewabe Date: Tue, 16 Jun 2026 10:21:57 +0300 Subject: [PATCH 2/6] Update deploy.yml --- .github/workflows/deploy.yml | 36 ++---------------------------------- 1 file changed, 2 insertions(+), 34 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c7ad58650..091226cee 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -57,20 +57,7 @@ jobs: # ------------------------------------------------------- # Tier 1: Non-deployable files — skip if ONLY these changed # ------------------------------------------------------- - NON_DEPLOYABLE_PATTERN="^docs/\ -|^README\.md$\ -|^DEPLOYMENT\.md$\ -|^CLAUDE\.md$\ -|^checkpoint\.md$\ -|^orgstructure\.md$\ -|^ITMLS_DB_Design\.md$\ -|.*\.md$\ -|^\.eslintrc\ -|^\.prettierrc\ -|^\.editorconfig\ -|^\.gitignore\ -|^\.gitattributes\ -|^commitlint\.config\.js$" + NON_DEPLOYABLE_PATTERN="^docs/|^README\.md$|^DEPLOYMENT\.md$|^CLAUDE\.md$|^checkpoint\.md$|^orgstructure\.md$|^ITMLS_DB_Design\.md$|.*\.md$|^\.eslintrc|^\.prettierrc|^\.editorconfig|^\.gitignore|^\.gitattributes|^commitlint\.config\.js$" ALL_NON_DEPLOYABLE=true while IFS= read -r file; do @@ -89,26 +76,7 @@ jobs: # ------------------------------------------------------- # Tier 2: Global files — deploy all services # ------------------------------------------------------- - GLOBAL_PATTERN="^\.github/\ -|^docker-compose\.yaml$\ -|^turbo\.json$\ -|^tsconfig\.json$\ -|^tsconfig\.base\.json$\ -|^pnpm-workspace\.yaml$\ -|^pnpm-lock\.yaml$\ -|^package\.json$\ -|^\.env(\.[a-z]+)?$\ -|^packages/\ -|^infrastructure/\ -|^scripts/deploy/\ -|^wagon.*\.ts$\ -|^cargo.*\.ts$\ -|^container.*\.ts$\ -|^use-.*\.ts$\ -|^.*\.service\.ts$\ -|^.*\.entity\.ts$\ -|^.*-types\.ts$" - + GLOBAL_PATTERN="^\.github/^docker-compose\.yaml$|^turbo\.json$|^tsconfig\.json$|^tsconfig\.base\.json$|^pnpm-workspace\.yaml$|^pnpm-lock\.yaml$|^package\.json$|^\.env(\.[a-z]+)?$|^packages/|^infrastructure/|^scripts/deploy/|^wagon.*\.ts$|^cargo.*\.ts$|^container.*\.ts$|^use-.*\.ts$|^.*\.service\.ts$|^.*\.entity\.ts$|^.*-types\.ts$" if echo "$CHANGED" | grep -qE "$GLOBAL_PATTERN"; then echo "Global file(s) changed — deploying all services." JSON=$(printf '%s\n' "${ALL_SERVICES[@]}" | jq -R . | jq -sc .) From d0689dfe04b46cc6489a08db563d80ce4a095673 Mon Sep 17 00:00:00 2001 From: Yonas Tewabe Date: Tue, 16 Jun 2026 10:23:51 +0300 Subject: [PATCH 3/6] Update deploy.yml --- .github/workflows/deploy.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 091226cee..79d5ec843 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -76,8 +76,7 @@ jobs: # ------------------------------------------------------- # Tier 2: Global files — deploy all services # ------------------------------------------------------- - GLOBAL_PATTERN="^\.github/^docker-compose\.yaml$|^turbo\.json$|^tsconfig\.json$|^tsconfig\.base\.json$|^pnpm-workspace\.yaml$|^pnpm-lock\.yaml$|^package\.json$|^\.env(\.[a-z]+)?$|^packages/|^infrastructure/|^scripts/deploy/|^wagon.*\.ts$|^cargo.*\.ts$|^container.*\.ts$|^use-.*\.ts$|^.*\.service\.ts$|^.*\.entity\.ts$|^.*-types\.ts$" - if echo "$CHANGED" | grep -qE "$GLOBAL_PATTERN"; then + GLOBAL_PATTERN="^[.]github/|^docker-compose\.yaml$|^turbo\.json$|^tsconfig\.json$|^tsconfig\.base\.json$|^pnpm-workspace\.yaml$|^pnpm-lock\.yaml$|^package\.json$|^[.]env([.][a-z]+)?$|^packages/|^infrastructure/|^scripts/deploy/|^wagon.*\.ts$|^cargo.*\.ts$|^container.*\.ts$|^use-.*\.ts$|^.*\.service\.ts$|^.*\.entity\.ts$|^.*-types\.ts$" if echo "$CHANGED" | grep -qE "$GLOBAL_PATTERN"; then echo "Global file(s) changed — deploying all services." JSON=$(printf '%s\n' "${ALL_SERVICES[@]}" | jq -R . | jq -sc .) echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" From ae967b324c2d92eabe1cc8621038269483d24731 Mon Sep 17 00:00:00 2001 From: Yonas Tewabe Date: Tue, 16 Jun 2026 10:26:01 +0300 Subject: [PATCH 4/6] Update deploy.yml --- .github/workflows/deploy.yml | 127 ++++++++++++++--------------------- 1 file changed, 52 insertions(+), 75 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 79d5ec843..c05e88f58 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -27,91 +27,68 @@ jobs: fetch-depth: 2 - name: Determine changed services - id: filter - run: | - set -euo pipefail - ALL_SERVICES=( - "freight-api" - # "freight-portal" - # "freight-backoffice" - "passenger-api" - "passenger-portal" - "passenger-backoffice" - "payment-api" - ) + id: filter + run: | + set -euo pipefail + ALL_SERVICES=( + "freight-api" + "passenger-api" + "passenger-portal" + "passenger-backoffice" + "payment-api" + ) - # workflow_dispatch: deploy everything - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - JSON=$(printf '%s\n' "${ALL_SERVICES[@]}" | jq -R . | jq -sc .) - echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" - exit 0 - fi + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + JSON=$(printf '%s\n' "${ALL_SERVICES[@]}" | jq -R . | jq -sc .) + echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" + exit 0 + fi - CHANGED=$(git diff --name-only HEAD~1 HEAD) - echo "=== Changed files ===" - echo "$CHANGED" - echo "=====================" + CHANGED=$(git diff --name-only HEAD~1 HEAD) + echo "=== Changed files ===" + echo "$CHANGED" + echo "=====================" - SERVICES=() + SERVICES=() - # ------------------------------------------------------- - # Tier 1: Non-deployable files — skip if ONLY these changed - # ------------------------------------------------------- - NON_DEPLOYABLE_PATTERN="^docs/|^README\.md$|^DEPLOYMENT\.md$|^CLAUDE\.md$|^checkpoint\.md$|^orgstructure\.md$|^ITMLS_DB_Design\.md$|.*\.md$|^\.eslintrc|^\.prettierrc|^\.editorconfig|^\.gitignore|^\.gitattributes|^commitlint\.config\.js$" + NON_DEPLOYABLE_PATTERN="^docs/|^README[.]md$|^DEPLOYMENT[.]md$|^CLAUDE[.]md$|^checkpoint[.]md$|^orgstructure[.]md$|^ITMLS_DB_Design[.]md$|.*[.]md$|^[.]eslintrc|^[.]prettierrc|^[.]editorconfig|^[.]gitignore|^[.]gitattributes|^commitlint[.]config[.]js$" - ALL_NON_DEPLOYABLE=true - while IFS= read -r file; do - if ! echo "$file" | grep -qE "$NON_DEPLOYABLE_PATTERN"; then - ALL_NON_DEPLOYABLE=false - break - fi - done <<< "$CHANGED" + GLOBAL_PATTERN="^[.]github/|^docker-compose[.]yaml$|^turbo[.]json$|^tsconfig[.]json$|^tsconfig[.]base[.]json$|^pnpm-workspace[.]yaml$|^pnpm-lock[.]yaml$|^package[.]json$|^[.]env([.][a-z]+)?$|^packages/|^infrastructure/|^scripts/deploy/|^wagon.*[.]ts$|^cargo.*[.]ts$|^container.*[.]ts$|^use-.*[.]ts$|^.*[.]service[.]ts$|^.*[.]entity[.]ts$|^.*-types[.]ts$" - if [ "$ALL_NON_DEPLOYABLE" = "true" ]; then - echo "Only non-deployable files changed. Skipping deploy." - echo "matrix=[]" >> "$GITHUB_OUTPUT" - exit 0 - fi + # Tier 1: skip if only non-deployable files changed + DEPLOYABLE=$(echo "$CHANGED" | grep -vE "$NON_DEPLOYABLE_PATTERN" || true) + if [ -z "$DEPLOYABLE" ]; then + echo "Only non-deployable files changed. Skipping deploy." + echo "matrix=[]" >> "$GITHUB_OUTPUT" + exit 0 + fi - # ------------------------------------------------------- - # Tier 2: Global files — deploy all services - # ------------------------------------------------------- - GLOBAL_PATTERN="^[.]github/|^docker-compose\.yaml$|^turbo\.json$|^tsconfig\.json$|^tsconfig\.base\.json$|^pnpm-workspace\.yaml$|^pnpm-lock\.yaml$|^package\.json$|^[.]env([.][a-z]+)?$|^packages/|^infrastructure/|^scripts/deploy/|^wagon.*\.ts$|^cargo.*\.ts$|^container.*\.ts$|^use-.*\.ts$|^.*\.service\.ts$|^.*\.entity\.ts$|^.*-types\.ts$" if echo "$CHANGED" | grep -qE "$GLOBAL_PATTERN"; then - echo "Global file(s) changed — deploying all services." - JSON=$(printf '%s\n' "${ALL_SERVICES[@]}" | jq -R . | jq -sc .) - echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" - exit 0 - fi + # Tier 2: deploy all if any global file changed + if echo "$CHANGED" | grep -qE "$GLOBAL_PATTERN"; then + echo "Global file(s) changed — deploying all services." + JSON=$(printf '%s\n' "${ALL_SERVICES[@]}" | jq -R . | jq -sc .) + echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" + exit 0 + fi - # ------------------------------------------------------- - # Tier 3: Per-service app paths (exact structure) - # ------------------------------------------------------- + # Tier 3: per-service paths + echo "$CHANGED" | grep -q "^apps/edr-freight-api/" && SERVICES+=("freight-api") + echo "$CHANGED" | grep -q "^apps/edr-passenger-api/" && SERVICES+=("passenger-api") + echo "$CHANGED" | grep -q "^apps/edr-passenger-web/portal/" && SERVICES+=("passenger-portal") + echo "$CHANGED" | grep -q "^apps/edr-passenger-web/backoffice/" && SERVICES+=("passenger-backoffice") + echo "$CHANGED" | grep -q "^apps/edr-payment-api/" && SERVICES+=("payment-api") - # Freight - echo "$CHANGED" | grep -q "^apps/edr-freight-api/" && SERVICES+=("freight-api") - # echo "$CHANGED" | grep -q "^apps/edr-freight-web/portal/" && SERVICES+=("freight-portal") - # echo "$CHANGED" | grep -q "^apps/edr-freight-web/backoffice/" && SERVICES+=("freight-backoffice") - - # Passenger - echo "$CHANGED" | grep -q "^apps/edr-passenger-api/" && SERVICES+=("passenger-api") - echo "$CHANGED" | grep -q "^apps/edr-passenger-web/portal/" && SERVICES+=("passenger-portal") - echo "$CHANGED" | grep -q "^apps/edr-passenger-web/backoffice/" && SERVICES+=("passenger-backoffice") - - # Payment - echo "$CHANGED" | grep -q "^apps/edr-payment-api/" && SERVICES+=("payment-api") - - # Deduplicate while preserving consistent order - SERVICES=($(printf '%s\n' "${SERVICES[@]}" | sort -u)) - - if [ ${#SERVICES[@]} -eq 0 ]; then - echo "No deployable service changes detected." - echo "matrix=[]" >> "$GITHUB_OUTPUT" - else - echo "Services to deploy: ${SERVICES[*]}" - JSON=$(printf '%s\n' "${SERVICES[@]}" | jq -R . | jq -sc .) - echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" - fi + SERVICES=($(printf '%s\n' "${SERVICES[@]}" | sort -u)) + if [ ${#SERVICES[@]} -eq 0 ]; then + echo "No deployable service changes detected." + echo "matrix=[]" >> "$GITHUB_OUTPUT" + else + echo "Services to deploy: ${SERVICES[*]}" + JSON=$(printf '%s\n' "${SERVICES[@]}" | jq -R . | jq -sc .) + echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" + fi + deploy: name: Deploy ${{ matrix.service }} needs: detect-changes From 3fef8106665b6b62e82942e777e43bf39e002b4a Mon Sep 17 00:00:00 2001 From: Yonas Tewabe Date: Tue, 16 Jun 2026 10:27:24 +0300 Subject: [PATCH 5/6] Update deploy.yml --- .github/workflows/deploy.yml | 102 +++++++++++++++++------------------ 1 file changed, 50 insertions(+), 52 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c05e88f58..13c1f18fb 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -27,68 +27,66 @@ jobs: fetch-depth: 2 - name: Determine changed services - id: filter - run: | - set -euo pipefail - ALL_SERVICES=( - "freight-api" - "passenger-api" - "passenger-portal" - "passenger-backoffice" - "payment-api" - ) + id: filter + run: | + set -euo pipefail - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - JSON=$(printf '%s\n' "${ALL_SERVICES[@]}" | jq -R . | jq -sc .) - echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" - exit 0 - fi + ALL_SERVICES=( + "freight-api" + "passenger-api" + "passenger-portal" + "passenger-backoffice" + "payment-api" + ) - CHANGED=$(git diff --name-only HEAD~1 HEAD) - echo "=== Changed files ===" - echo "$CHANGED" - echo "=====================" + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + JSON=$(printf '%s\n' "${ALL_SERVICES[@]}" | jq -R . | jq -sc .) + echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" + exit 0 + fi - SERVICES=() + CHANGED=$(git diff --name-only HEAD~1 HEAD) + echo "=== Changed files ===" + echo "$CHANGED" + echo "=====================" - NON_DEPLOYABLE_PATTERN="^docs/|^README[.]md$|^DEPLOYMENT[.]md$|^CLAUDE[.]md$|^checkpoint[.]md$|^orgstructure[.]md$|^ITMLS_DB_Design[.]md$|.*[.]md$|^[.]eslintrc|^[.]prettierrc|^[.]editorconfig|^[.]gitignore|^[.]gitattributes|^commitlint[.]config[.]js$" + SERVICES=() - GLOBAL_PATTERN="^[.]github/|^docker-compose[.]yaml$|^turbo[.]json$|^tsconfig[.]json$|^tsconfig[.]base[.]json$|^pnpm-workspace[.]yaml$|^pnpm-lock[.]yaml$|^package[.]json$|^[.]env([.][a-z]+)?$|^packages/|^infrastructure/|^scripts/deploy/|^wagon.*[.]ts$|^cargo.*[.]ts$|^container.*[.]ts$|^use-.*[.]ts$|^.*[.]service[.]ts$|^.*[.]entity[.]ts$|^.*-types[.]ts$" + NON_DEPLOYABLE_PATTERN="^docs/|^README[.]md$|^DEPLOYMENT[.]md$|^CLAUDE[.]md$|^checkpoint[.]md$|^orgstructure[.]md$|^ITMLS_DB_Design[.]md$|.*[.]md$|^[.]eslintrc|^[.]prettierrc|^[.]editorconfig|^[.]gitignore|^[.]gitattributes|^commitlint[.]config[.]js$" - # Tier 1: skip if only non-deployable files changed - DEPLOYABLE=$(echo "$CHANGED" | grep -vE "$NON_DEPLOYABLE_PATTERN" || true) - if [ -z "$DEPLOYABLE" ]; then - echo "Only non-deployable files changed. Skipping deploy." - echo "matrix=[]" >> "$GITHUB_OUTPUT" - exit 0 - fi + GLOBAL_PATTERN="^[.]github/|^docker-compose[.]yaml$|^turbo[.]json$|^tsconfig[.]json$|^tsconfig[.]base[.]json$|^pnpm-workspace[.]yaml$|^pnpm-lock[.]yaml$|^package[.]json$|^[.]env([.][a-z]+)?$|^packages/|^infrastructure/|^scripts/deploy/|^wagon.*[.]ts$|^cargo.*[.]ts$|^container.*[.]ts$|^use-.*[.]ts$|^.*[.]service[.]ts$|^.*[.]entity[.]ts$|^.*-types[.]ts$" - # Tier 2: deploy all if any global file changed - if echo "$CHANGED" | grep -qE "$GLOBAL_PATTERN"; then - echo "Global file(s) changed — deploying all services." - JSON=$(printf '%s\n' "${ALL_SERVICES[@]}" | jq -R . | jq -sc .) - echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" - exit 0 - fi + DEPLOYABLE=$(echo "$CHANGED" | grep -vE "$NON_DEPLOYABLE_PATTERN" || true) + if [ -z "$DEPLOYABLE" ]; then + echo "Only non-deployable files changed. Skipping deploy." + echo "matrix=[]" >> "$GITHUB_OUTPUT" + exit 0 + fi - # Tier 3: per-service paths - echo "$CHANGED" | grep -q "^apps/edr-freight-api/" && SERVICES+=("freight-api") - echo "$CHANGED" | grep -q "^apps/edr-passenger-api/" && SERVICES+=("passenger-api") - echo "$CHANGED" | grep -q "^apps/edr-passenger-web/portal/" && SERVICES+=("passenger-portal") - echo "$CHANGED" | grep -q "^apps/edr-passenger-web/backoffice/" && SERVICES+=("passenger-backoffice") - echo "$CHANGED" | grep -q "^apps/edr-payment-api/" && SERVICES+=("payment-api") + if echo "$CHANGED" | grep -qE "$GLOBAL_PATTERN"; then + echo "Global file(s) changed — deploying all services." + JSON=$(printf '%s\n' "${ALL_SERVICES[@]}" | jq -R . | jq -sc .) + echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" + exit 0 + fi - SERVICES=($(printf '%s\n' "${SERVICES[@]}" | sort -u)) + echo "$CHANGED" | grep -q "^apps/edr-freight-api/" && SERVICES+=("freight-api") + echo "$CHANGED" | grep -q "^apps/edr-passenger-api/" && SERVICES+=("passenger-api") + echo "$CHANGED" | grep -q "^apps/edr-passenger-web/portal/" && SERVICES+=("passenger-portal") + echo "$CHANGED" | grep -q "^apps/edr-passenger-web/backoffice/" && SERVICES+=("passenger-backoffice") + echo "$CHANGED" | grep -q "^apps/edr-payment-api/" && SERVICES+=("payment-api") + + SERVICES=($(printf '%s\n' "${SERVICES[@]}" | sort -u)) + + if [ ${#SERVICES[@]} -eq 0 ]; then + echo "No deployable service changes detected." + echo "matrix=[]" >> "$GITHUB_OUTPUT" + else + echo "Services to deploy: ${SERVICES[*]}" + JSON=$(printf '%s\n' "${SERVICES[@]}" | jq -R . | jq -sc .) + echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" + fi - if [ ${#SERVICES[@]} -eq 0 ]; then - echo "No deployable service changes detected." - echo "matrix=[]" >> "$GITHUB_OUTPUT" - else - echo "Services to deploy: ${SERVICES[*]}" - JSON=$(printf '%s\n' "${SERVICES[@]}" | jq -R . | jq -sc .) - echo "matrix=${JSON}" >> "$GITHUB_OUTPUT" - fi - deploy: name: Deploy ${{ matrix.service }} needs: detect-changes From 38175cbdb7c8654437c677fcaf3f2f65a0a1de71 Mon Sep 17 00:00:00 2001 From: Abubeker Yasin Date: Tue, 16 Jun 2026 12:07:38 +0300 Subject: [PATCH 6/6] Update seed.ts --- apps/edr-passenger-api/prisma/seed.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/edr-passenger-api/prisma/seed.ts b/apps/edr-passenger-api/prisma/seed.ts index 17283e15b..79933843b 100644 --- a/apps/edr-passenger-api/prisma/seed.ts +++ b/apps/edr-passenger-api/prisma/seed.ts @@ -422,6 +422,7 @@ async function seedPaymentMethods() { { type: 'TELEBIRR', displayName: 'Telebirr', region: 'ETHIOPIA' }, { type: 'CBE_BIRR', displayName: 'CBE Birr', region: 'ETHIOPIA' }, { type: 'EBIRR', displayName: 'eBirr', region: 'ETHIOPIA' }, + { type: 'WAAFI', displayName: 'Waffi', region: 'DJIBOUTI' }, { type: 'CARD', displayName: 'Credit/Debit Card', region: 'GLOBAL' }, { type: 'WALLET', displayName: 'Wallet', region: 'GLOBAL' }, ];