#!/usr/bin/env bash # deploy.yml › detect — decide what this push deploys. # # A side deploys when its folder's tree hash differs from the hash last deployed SUCCESSFULLY to # this environment (stored on the server in /opt/erpcore//.deployed). So: # • docs / PROGRESS.md / smoke-script pushes deploy nothing, # • a failed deploy is retried by the next run (its stored hash never moved), # • force-pushes, multi-commit pushes and merges need no special handling. # Manual runs can force a side (config change) or pin an older hash (rollback). # shellcheck source=common.sh source "$(dirname "${BASH_SOURCE[0]}")/common.sh" : "${REF_NAME:?REF_NAME (the pushed branch) is required}" env_name="$(env_for_branch "$REF_NAME")" || fail "branch '$REF_NAME' is not deployable (Dev → test, production → release)" load_env "$env_name" be_hash="$(tree_hash "$BACKEND_PATH")" fe_hash="$(tree_hash "$FRONTEND_PATH")" mig_hash="$(tree_hash "$MIGRATIONS_PATH")" [[ -n "$be_hash" && -n "$fe_hash" ]] || fail "could not compute tree hashes — is this an ERP-core checkout?" be_rollback=false fe_rollback=false if [[ -n "${BACKEND_HASH_INPUT:-}" ]]; then be_hash="$BACKEND_HASH_INPUT" && be_rollback=true; fi if [[ -n "${FRONTEND_HASH_INPUT:-}" ]]; then fe_hash="$FRONTEND_HASH_INPUT" && fe_rollback=true; fi be_deployed="$(read_state backend)" fe_deployed="$(read_state frontend)" be_changed=false fe_changed=false if [[ "$be_hash" != "$be_deployed" ]]; then be_changed=true; fi if [[ "$fe_hash" != "$fe_deployed" ]]; then fe_changed=true; fi deploy_backend=$be_changed deploy_frontend=$fe_changed if [[ "${FORCE_BACKEND:-}" == true ]]; then deploy_backend=true; fi if [[ "${FORCE_FRONTEND:-}" == true ]]; then deploy_frontend=true; fi migrations_changed=false if ! $be_rollback && [[ "$mig_hash" != "$(read_state migrations)" ]]; then migrations_changed=true; fi # A Gitea release records real content changes on release only — not forced restarts or # rollbacks (those are in .deployed/history.log on the server). record_release=false if [[ "$env_name" == release ]] && ! $be_rollback && ! $fe_rollback && { $be_changed || $fe_changed; }; then record_release=true fi log "environment $env_name — deployed now: backend ${be_deployed:-none}, frontend ${fe_deployed:-none}" set_output env "$env_name" set_output backend "$deploy_backend" set_output frontend "$deploy_frontend" set_output backend_hash "$be_hash" set_output frontend_hash "$fe_hash" set_output backend_rollback "$be_rollback" set_output frontend_rollback "$fe_rollback" set_output migrations_hash "$mig_hash" set_output migrations_changed "$migrations_changed" set_output record_release "$record_release"