From e090b55a555025613bc4e30635a8186e61185b1f Mon Sep 17 00:00:00 2001 From: "sas.fajri" Date: Wed, 15 Apr 2026 15:36:54 +0700 Subject: [PATCH] Add main branch sync automation --- .githooks/post-commit | 5 ++ .githooks/post-merge | 5 ++ .githooks/post-rewrite | 5 ++ README.md | 7 ++- scripts/install_devone_sync_hooks.sh | 7 +++ scripts/sync_devone_changed_files.sh | 73 ++++++++++++++++++++++++++++ 6 files changed, 101 insertions(+), 1 deletion(-) create mode 100755 .githooks/post-commit create mode 100755 .githooks/post-merge create mode 100755 .githooks/post-rewrite create mode 100755 scripts/install_devone_sync_hooks.sh create mode 100755 scripts/sync_devone_changed_files.sh diff --git a/.githooks/post-commit b/.githooks/post-commit new file mode 100755 index 00000000..14f937a1 --- /dev/null +++ b/.githooks/post-commit @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +exec "$ROOT_DIR/scripts/sync_devone_changed_files.sh" commit diff --git a/.githooks/post-merge b/.githooks/post-merge new file mode 100755 index 00000000..d4f46099 --- /dev/null +++ b/.githooks/post-merge @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +exec "$ROOT_DIR/scripts/sync_devone_changed_files.sh" merge diff --git a/.githooks/post-rewrite b/.githooks/post-rewrite new file mode 100755 index 00000000..14f937a1 --- /dev/null +++ b/.githooks/post-rewrite @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +exec "$ROOT_DIR/scripts/sync_devone_changed_files.sh" commit diff --git a/README.md b/README.md index c7f8354b..914859bd 100644 --- a/README.md +++ b/README.md @@ -1 +1,6 @@ -Ini adalah BE untuk IBL \ No newline at end of file +Ini adalah BE untuk IBL + +## Auto sync ke devone + +Jalankan `./scripts/install_devone_sync_hooks.sh` sekali untuk mengaktifkan hook Git lokal. +Setelah itu, commit atau merge ke `main` akan otomatis sync file yang berubah ke `devone.aplikasi.web.id:/home/one/project/one/one-api-lab/` memakai `scripts/sync_devone_changed_files.sh`. diff --git a/scripts/install_devone_sync_hooks.sh b/scripts/install_devone_sync_hooks.sh new file mode 100755 index 00000000..ce861a71 --- /dev/null +++ b/scripts/install_devone_sync_hooks.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +git -C "$ROOT_DIR" config core.hooksPath .githooks +printf 'Installed git hooks path: %s\n' "$ROOT_DIR/.githooks" diff --git a/scripts/sync_devone_changed_files.sh b/scripts/sync_devone_changed_files.sh new file mode 100755 index 00000000..feffd04d --- /dev/null +++ b/scripts/sync_devone_changed_files.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" + +TARGET_HOST="${SYNC_TARGET_HOST:-devone.aplikasi.web.id}" +REMOTE_USER="${SYNC_REMOTE_USER:-one}" +REMOTE_PATH="${SYNC_REMOTE_PATH:-/home/one/project/one/one-api-lab/}" +PRIVATE_KEY_PATH="${SYNC_PRIVATE_KEY_PATH:-/Users/fajrihardhitamurti/id_rsa}" +STATE_FILE="${SYNC_STATE_FILE:-$ROOT_DIR/.git/devone-last-synced-head}" +MODE="${1:-commit}" + +log() { + printf '[devone-sync] %s\n' "$*" +} + +fail() { + printf '[devone-sync] %s\n' "$*" >&2 + exit 1 +} + +if ! git -C "$ROOT_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1; then + exit 0 +fi + +branch="$(git -C "$ROOT_DIR" symbolic-ref --quiet --short HEAD 2>/dev/null || true)" +if [[ "$branch" != "main" ]]; then + exit 0 +fi + +[[ -f "$PRIVATE_KEY_PATH" ]] || fail "Private key not found: $PRIVATE_KEY_PATH" + +current_head="$(git -C "$ROOT_DIR" rev-parse HEAD)" +if [[ -f "$STATE_FILE" ]] && [[ "$(cat "$STATE_FILE")" == "$current_head" ]]; then + exit 0 +fi + +tmpdir="$(mktemp -d)" +trap 'rm -rf "$tmpdir"' EXIT +changed_list="$tmpdir/changed-files.z" + +case "$MODE" in + commit) + git -C "$ROOT_DIR" diff-tree --no-commit-id --root --diff-filter=ACMR -r -z HEAD > "$changed_list" + ;; + merge) + if git -C "$ROOT_DIR" rev-parse -q --verify ORIG_HEAD >/dev/null 2>&1; then + git -C "$ROOT_DIR" diff --diff-filter=ACMR -z --name-only ORIG_HEAD HEAD > "$changed_list" + else + git -C "$ROOT_DIR" diff-tree --no-commit-id --root --diff-filter=ACMR -r -z HEAD > "$changed_list" + fi + ;; + *) + fail "Unknown mode: $MODE" + ;; +esac + +if [[ ! -s "$changed_list" ]]; then + printf '%s\n' "$current_head" > "$STATE_FILE" + exit 0 +fi + +SSH_CMD="ssh -i $PRIVATE_KEY_PATH -o BatchMode=yes -o StrictHostKeyChecking=accept-new" +destination="${REMOTE_USER}@${TARGET_HOST}:${REMOTE_PATH%/}/" + +log "Syncing changed files to $destination" +if rsync -az --from0 --files-from="$changed_list" --relative --info=progress2 --human-readable --exclude='.git/' --exclude='.DS_Store' -e "$SSH_CMD" "$ROOT_DIR/" "$destination"; then + printf '%s\n' "$current_head" > "$STATE_FILE" + log "Done: $current_head" +else + fail "Sync failed" +fi