6 Commits

4 changed files with 50 additions and 12 deletions

View File

@@ -56,6 +56,17 @@ A [branch] name must be set all the time.
An optional [remote name] can be set, if not set "origin" will be used.
All sync progress will be written to the log folder inside the base folder, the log file has the name of [repository]
Sample
```log
[2025-07-04 16:06:31] [<uniq id>] [START] git merge <repository folder> <remote name>/<branch>
[2025-07-04 16:06:31] [<uniq id>] Updating <sha>..<sha>
<git inforation>
[2025-07-04 16:06:31] [<uniq id>] [END]
```
## TODO
Future versions will hold an incoming webhook handler and a polling scripts (systemd based)

View File

@@ -44,10 +44,19 @@ if [ $error -eq 1 ]; then
fi;
# Define base folders
# folder where all the repositories are located
CLONE_BASE="clone-base/"
# log folder for all log files
LOG_FOLDER="log/"
SCRIPT_FOLDER="scripts/"
# sync/lone/etc scripts
CLONE_SCRIPTS_FOLDER="scripts/"
# any scripts that have to be run before deploy
DEPLOY_SCRIPTS="deploy-scripts/";
# any secrets that might be needed after clone
SECRETS_FOLDER="secrets/"
# overall config file
CONFIG_FOLDER="config/"
# admin/webhook web interface
WWW_BASE="www/"
WWW_WEBHOOK_INCOMING="${WWW_BASE}webhook-incoming";
WWW_ADMIN="${WWW_BASE}admin";
@@ -67,7 +76,7 @@ if [ -d "${GIT_WEBHOOK_BASE_FOLDER}" ]; then
# copy scripts & default config
echo "~ Copy basic script and config files";
# git_sync.sh, init.sh, new_clone.sh, webhook.default.cfg
cp "${BASE_FOLDER}new_clone.sh" "${BASE_FOLDER}init.sh" "${BASE_FOLDER}git_sync.sh" "${GIT_WEBHOOK_BASE_FOLDER}${SCRIPT_FOLDER}";
cp "${BASE_FOLDER}new_clone.sh" "${BASE_FOLDER}init.sh" "${BASE_FOLDER}git_sync.sh" "${GIT_WEBHOOK_BASE_FOLDER}${CLONE_SCRIPTS_FOLDER}";
cp "${CONFIG_BASE}/webhook.default.cfg" "${GIT_WEBHOOK_BASE_FOLDER}${CONFIG_FOLDER}";
# and make sure they are all owned by the correct user
chown "${SUDO_USER}" \
@@ -118,20 +127,24 @@ EOF
fi;
fi;
# All other FOLDER
echo "+ Other folders for clone base: ${CLONE_BASE}, ${LOG_FOLDER}, ${SCRIPT_FOLDER}, ${CONFIG_FOLDER}, ${WWW_WEBHOOK_INCOMING}, ${WWW_ADMIN}"
echo "+ Other folders for clone base: ${CLONE_BASE}, ${LOG_FOLDER}, ${CLONE_SCRIPTS_FOLDER}, ${CONFIG_FOLDER}, ${WWW_WEBHOOK_INCOMING}, ${WWW_ADMIN}"
sudo -u "${SUDO_USER}" \
mkdir -p \
"${GIT_WEBHOOK_BASE_FOLDER}${CLONE_BASE}" \
"${GIT_WEBHOOK_BASE_FOLDER}${LOG_FOLDER}" \
"${GIT_WEBHOOK_BASE_FOLDER}${SCRIPT_FOLDER}" \
"${GIT_WEBHOOK_BASE_FOLDER}${CLONE_SCRIPTS_FOLDER}" \
"${GIT_WEBHOOK_BASE_FOLDER}${DEPLOY_SCRIPTS}" \
"${GIT_WEBHOOK_BASE_FOLDER}${CONFIG_FOLDER}" \
"${GIT_WEBHOOK_BASE_FOLDER}${SECRETS_FOLDER}" \
"${GIT_WEBHOOK_BASE_FOLDER}${WWW_WEBHOOK_INCOMING}" \
"${GIT_WEBHOOK_BASE_FOLDER}${WWW_ADMIN}";
# set basic folder rights, clone folder is excluded
sudo -u "${SUDO_USER}" chmod 700 \
"${GIT_WEBHOOK_BASE_FOLDER}${LOG_FOLDER}" \
"${GIT_WEBHOOK_BASE_FOLDER}${SCRIPT_FOLDER}" \
"${GIT_WEBHOOK_BASE_FOLDER}${CLONE_SCRIPTS_FOLDER}" \
"${GIT_WEBHOOK_BASE_FOLDER}${DEPLOY_SCRIPTS}" \
"${GIT_WEBHOOK_BASE_FOLDER}${CONFIG_FOLDER}" \
"${GIT_WEBHOOK_BASE_FOLDER}${SECRETS_FOLDER}" \
"${GIT_WEBHOOK_BASE_FOLDER}${WWW_WEBHOOK_INCOMING}" \
"${GIT_WEBHOOK_BASE_FOLDER}${WWW_ADMIN}";
# setfacl -m u:"${SUDO_USER}":rwx -R "${GIT_WEBHOOK_BASE_FOLDER}${CLONE_BASE}"
@@ -146,7 +159,7 @@ EOF
# Copy files
echo "+ Copy basic script and config files";
# git_sync.sh, init.sh, new_clone.sh, webhook.default.cfg
cp "${BASE_FOLDER}new_clone.sh" "${BASE_FOLDER}init.sh" "${BASE_FOLDER}git_sync.sh" "${GIT_WEBHOOK_BASE_FOLDER}${SCRIPT_FOLDER}";
cp "${BASE_FOLDER}new_clone.sh" "${BASE_FOLDER}init.sh" "${BASE_FOLDER}git_sync.sh" "${GIT_WEBHOOK_BASE_FOLDER}${CLONE_SCRIPTS_FOLDER}";
cp "${CONFIG_BASE}/webhook.cfg" "${CONFIG_BASE}/webhook.default.cfg" "${GIT_WEBHOOK_BASE_FOLDER}${CONFIG_FOLDER}";
# and make sure they are all owned by the correct user
chown "${SUDO_USER}" \

View File

@@ -31,7 +31,7 @@ GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" "fetch" "-
GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" "diff" "--stat" "HEAD" "${REMOTE_NAME}/${BRANCH}")
changes=$("${GIT_COMMAND[@]}" 2>&1)
if [ -n "${changes}" ]; then
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [${unique_id}] [START] Changes" &>> "$LOG_FILE";
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [${unique_id}] [START] git merge ${GIT_REPOSITORY_FOLDER} ${REMOTE_NAME}/${BRANCH}" &>> "$LOG_FILE";
GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" merge "${REMOTE_NAME}/${BRANCH}")
log_data=$("${GIT_COMMAND[@]}" 2>&1);
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [${unique_id}] ${log_data}" &>> "$LOG_FILE";

View File

@@ -58,11 +58,25 @@ if [ $error -eq 1 ]; then
exit;
fi;
# from the repository get the last path without the .git so we have the target folder
GIT_REPOSITORY_FOLDER=$(basename "${REPOSITORY}" .git);
unique_id=$(uuidgen | tr -d '-' | head -c 8);
echo "* New clone from ${REMOTE_HOST}:${REPOSITORY}::${BRANCH} into ${GIT_REPOSITORY_FOLDER}";
GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "clone" "-b" "${BRANCH}" "--single-branch" "--depth" "1" "--origin" "${REMOTE_NAME}" "${REMOTE_HOST}:${REPOSITORY}" "${GIT_WEBHOOK_BASE_FOLDER}${CLONE_BASE}${GIT_REPOSITORY_FOLDER}")
"${GIT_COMMAND[@]}";
# strip .git from the repository path
GIT_REPOSITORY_NAME=$(basename "${REPOSITORY}" .git);
# log folder target
LOG_FILE="${GIT_WEBHOOK_BASE_FOLDER}${LOG_FOLDER}${GIT_REPOSITORY_NAME}.log";
# from the repository get the last path without the .git so we have the target folder
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [${unique_id}] [START] New clone from ${REMOTE_HOST}:${REPOSITORY}::${BRANCH} into ${GIT_REPOSITORY_NAME}" | tee -a "$LOG_FILE";
# clone everything
GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "clone" "-b" "${BRANCH}" "--single-branch" "--depth" "1" "--origin" "${REMOTE_NAME}" "${REMOTE_HOST}:${REPOSITORY}" "${GIT_WEBHOOK_BASE_FOLDER}${CLONE_BASE}${GIT_REPOSITORY_NAME}")
"${GIT_COMMAND[@]}" 2>&1 | tee -a "$LOG_FILE";
# set the repository folder
GIT_REPOSITORY_FOLDER="${GIT_WEBHOOK_BASE_FOLDER}${CLONE_BASE}${GIT_REPOSITORY_NAME}";
# show origin info
GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" remote show "${REMOTE_NAME}" );
"${GIT_COMMAND[@]}" 2>&1 | tee -a "$LOG_FILE";
# get last log entry
GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" log -n 1 --pretty=short --no-color);
"${GIT_COMMAND[@]}" 2>&1 | tee -a "$LOG_FILE";
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [${unique_id}] [FINISH] clone completed" | tee -a "$LOG_FILE";
# __END__