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.
|
||||
|
||||
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)
|
||||
|
||||
@@ -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}" \
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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__
|
||||
|
||||
Reference in New Issue
Block a user