Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 031d820f13 | |||
| ba2c207cce | |||
| 106f79399a | |||
| c3ec041556 | |||
| 3d5b12b276 | |||
| 416e90e477 |
11
ReadMe.md
11
ReadMe.md
@@ -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.
|
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
|
## TODO
|
||||||
|
|
||||||
Future versions will hold an incoming webhook handler and a polling scripts (systemd based)
|
Future versions will hold an incoming webhook handler and a polling scripts (systemd based)
|
||||||
|
|||||||
@@ -44,10 +44,19 @@ if [ $error -eq 1 ]; then
|
|||||||
fi;
|
fi;
|
||||||
|
|
||||||
# Define base folders
|
# Define base folders
|
||||||
|
# folder where all the repositories are located
|
||||||
CLONE_BASE="clone-base/"
|
CLONE_BASE="clone-base/"
|
||||||
|
# log folder for all log files
|
||||||
LOG_FOLDER="log/"
|
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/"
|
CONFIG_FOLDER="config/"
|
||||||
|
# admin/webhook web interface
|
||||||
WWW_BASE="www/"
|
WWW_BASE="www/"
|
||||||
WWW_WEBHOOK_INCOMING="${WWW_BASE}webhook-incoming";
|
WWW_WEBHOOK_INCOMING="${WWW_BASE}webhook-incoming";
|
||||||
WWW_ADMIN="${WWW_BASE}admin";
|
WWW_ADMIN="${WWW_BASE}admin";
|
||||||
@@ -67,7 +76,7 @@ if [ -d "${GIT_WEBHOOK_BASE_FOLDER}" ]; then
|
|||||||
# copy scripts & default config
|
# copy scripts & default config
|
||||||
echo "~ Copy basic script and config files";
|
echo "~ Copy basic script and config files";
|
||||||
# git_sync.sh, init.sh, new_clone.sh, webhook.default.cfg
|
# 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}";
|
cp "${CONFIG_BASE}/webhook.default.cfg" "${GIT_WEBHOOK_BASE_FOLDER}${CONFIG_FOLDER}";
|
||||||
# and make sure they are all owned by the correct user
|
# and make sure they are all owned by the correct user
|
||||||
chown "${SUDO_USER}" \
|
chown "${SUDO_USER}" \
|
||||||
@@ -118,20 +127,24 @@ EOF
|
|||||||
fi;
|
fi;
|
||||||
fi;
|
fi;
|
||||||
# All other FOLDER
|
# 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}" \
|
sudo -u "${SUDO_USER}" \
|
||||||
mkdir -p \
|
mkdir -p \
|
||||||
"${GIT_WEBHOOK_BASE_FOLDER}${CLONE_BASE}" \
|
"${GIT_WEBHOOK_BASE_FOLDER}${CLONE_BASE}" \
|
||||||
"${GIT_WEBHOOK_BASE_FOLDER}${LOG_FOLDER}" \
|
"${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}${CONFIG_FOLDER}" \
|
||||||
|
"${GIT_WEBHOOK_BASE_FOLDER}${SECRETS_FOLDER}" \
|
||||||
"${GIT_WEBHOOK_BASE_FOLDER}${WWW_WEBHOOK_INCOMING}" \
|
"${GIT_WEBHOOK_BASE_FOLDER}${WWW_WEBHOOK_INCOMING}" \
|
||||||
"${GIT_WEBHOOK_BASE_FOLDER}${WWW_ADMIN}";
|
"${GIT_WEBHOOK_BASE_FOLDER}${WWW_ADMIN}";
|
||||||
# set basic folder rights, clone folder is excluded
|
# set basic folder rights, clone folder is excluded
|
||||||
sudo -u "${SUDO_USER}" chmod 700 \
|
sudo -u "${SUDO_USER}" chmod 700 \
|
||||||
"${GIT_WEBHOOK_BASE_FOLDER}${LOG_FOLDER}" \
|
"${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}${CONFIG_FOLDER}" \
|
||||||
|
"${GIT_WEBHOOK_BASE_FOLDER}${SECRETS_FOLDER}" \
|
||||||
"${GIT_WEBHOOK_BASE_FOLDER}${WWW_WEBHOOK_INCOMING}" \
|
"${GIT_WEBHOOK_BASE_FOLDER}${WWW_WEBHOOK_INCOMING}" \
|
||||||
"${GIT_WEBHOOK_BASE_FOLDER}${WWW_ADMIN}";
|
"${GIT_WEBHOOK_BASE_FOLDER}${WWW_ADMIN}";
|
||||||
# setfacl -m u:"${SUDO_USER}":rwx -R "${GIT_WEBHOOK_BASE_FOLDER}${CLONE_BASE}"
|
# setfacl -m u:"${SUDO_USER}":rwx -R "${GIT_WEBHOOK_BASE_FOLDER}${CLONE_BASE}"
|
||||||
@@ -146,7 +159,7 @@ EOF
|
|||||||
# Copy files
|
# Copy files
|
||||||
echo "+ Copy basic script and config files";
|
echo "+ Copy basic script and config files";
|
||||||
# git_sync.sh, init.sh, new_clone.sh, webhook.default.cfg
|
# 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}";
|
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
|
# and make sure they are all owned by the correct user
|
||||||
chown "${SUDO_USER}" \
|
chown "${SUDO_USER}" \
|
||||||
|
|||||||
@@ -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}")
|
GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" "diff" "--stat" "HEAD" "${REMOTE_NAME}/${BRANCH}")
|
||||||
changes=$("${GIT_COMMAND[@]}" 2>&1)
|
changes=$("${GIT_COMMAND[@]}" 2>&1)
|
||||||
if [ -n "${changes}" ]; then
|
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}")
|
GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" merge "${REMOTE_NAME}/${BRANCH}")
|
||||||
log_data=$("${GIT_COMMAND[@]}" 2>&1);
|
log_data=$("${GIT_COMMAND[@]}" 2>&1);
|
||||||
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [${unique_id}] ${log_data}" &>> "$LOG_FILE";
|
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [${unique_id}] ${log_data}" &>> "$LOG_FILE";
|
||||||
|
|||||||
@@ -58,11 +58,25 @@ if [ $error -eq 1 ]; then
|
|||||||
exit;
|
exit;
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
# from the repository get the last path without the .git so we have the target folder
|
unique_id=$(uuidgen | tr -d '-' | head -c 8);
|
||||||
GIT_REPOSITORY_FOLDER=$(basename "${REPOSITORY}" .git);
|
|
||||||
|
|
||||||
echo "* New clone from ${REMOTE_HOST}:${REPOSITORY}::${BRANCH} into ${GIT_REPOSITORY_FOLDER}";
|
# strip .git from the repository path
|
||||||
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_REPOSITORY_NAME=$(basename "${REPOSITORY}" .git);
|
||||||
"${GIT_COMMAND[@]}";
|
# 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__
|
# __END__
|
||||||
|
|||||||
Reference in New Issue
Block a user