diff --git a/.env b/.env index 185c80c..29ca32a 100644 --- a/.env +++ b/.env @@ -1,10 +1,11 @@ -# Repository to Pull -REPO_URL=https://git.cyberstrawberry.net/cyberstrawberry/website.git +# Gitea Credentials GIT_USERNAME=nicole.rappe GIT_PASSWORD=USE-AN-APP-PASSWORD -# NTFY Server to Notify on Pull Events +# NTFY Push Notification Server URL NTFY_URL=https://ntfy.cyberstrawberry.net/git-repo-updater -# Folder of the destination server / container folder where you want the repository data to transfer -DESTINATION=/srv/containers/nginx-portfolio-website/www \ No newline at end of file +# Repository/Destination Pairs (Add as Many as Needed) +REPO_01="https://git.bunny-lab.io/repo1.git,/srv/containers/destination" +REPO_02="https://git.bunny-lab.io/repo1.git,/srv/containers/destination" +REPO_03="https://git.bunny-lab.io/repo1.git,/srv/containers/destination" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 9aebc2e..a4bc0d4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,13 +3,9 @@ services: git-repo-updater: privileged: true container_name: git-repo-updater - environment: - - REPO_URL=${REPO_URL} - - COPY_DIR=${COPY_DIR} - - NTFY_URL=${NTFY_URL} - - GIT_USERNAME=${GIT_USERNAME} - - GIT_PASSWORD=${GIT_PASSWORD} - image: git.cyberstrawberry.net/container-registry/git-repo-updater:latest + env_file: + - stack.env + image: git.bunny-lab.io/container-registry/git-repo-updater:latest volumes: - - ${DESTINATION}:/DATA + - /srv/containers:/srv/containers restart: always \ No newline at end of file diff --git a/repo_watcher.sh b/repo_watcher.sh index e500202..567db68 100644 --- a/repo_watcher.sh +++ b/repo_watcher.sh @@ -1,44 +1,52 @@ #!/bin/sh +# Function to process each repo-destination pair +process_repo() { + REPO_URL=$1 + DESTINATION=$2 + + # Set Git credentials + git config --global credential.helper 'store --file /tmp/git-credentials' + echo "url=$REPO_URL" > /tmp/git-credentials + echo "username=$GIT_USERNAME" >> /tmp/git-credentials + echo "password=$GIT_PASSWORD" >> /tmp/git-credentials + + # Directory to hold the repository locally + REPO_DIR="/root/Repo_Watcher/$(basename $REPO_URL)" + + # Clone the repo if it doesn't exist, or navigate to it if it does + if [ ! -d "$REPO_DIR" ]; then + curl -d "Cloning: $REPO_URL" $NTFY_URL + echo "Cloning: $REPO_URL" + git clone "$REPO_URL" "$REPO_DIR" + fi + cd "$REPO_DIR" + + # Fetch the latest changes + git fetch origin main + + # Check if the local repository is behind the remote + LOCAL=$(git rev-parse @) + REMOTE=$(git rev-parse @{u}) + + if [ $LOCAL != $REMOTE ]; then + curl -d "Updating: $REPO_URL" $NTFY_URL + echo "Updating: $REPO_URL" + git pull origin main + rsync -av --delete --exclude '.git/' ./ "$DESTINATION" + else + echo "Repository $REPO_URL Up-to-Date" + fi +} + +# Main loop while true; do - # Set Git credentials - git config --global credential.helper 'store --file /tmp/git-credentials' - echo "url=$REPO_URL" > /tmp/git-credentials - echo "username=$GIT_USERNAME" >> /tmp/git-credentials - echo "password=$GIT_PASSWORD" >> /tmp/git-credentials - - # Navigate to the watcher directory - cd /root/Repo_Watcher - - # Clone the repo if it doesn't exist - if [ -z "$(find /root/Repo_Watcher/repo -maxdepth 1 -mindepth 1 -type f -o -type d 2>/dev/null)" ]; then - curl -d "Pulling: $REPO_URL" $NTFY_URL - echo "Pulling: $REPO_URL" - git clone $REPO_URL repo - cd repo - rsync -av --delete --exclude '.git/' ./ /DATA - fi - - cd repo - - # Fetch the latest changes - git fetch origin main - - # Check if the local repository is behind the remote - LOCAL=$(git rev-parse @) - REMOTE=$(git rev-parse @{u}) - BASE=$(git merge-base @ @{u}) - - if [ $LOCAL = $REMOTE ]; then - echo "Repository Up-to-Date" - else - curl -d "Pulling: $REPO_URL" $NTFY_URL - echo "Pulling: $REPO_URL" - git pull origin main - rsync -av --delete --exclude '.git/' ./ /DATA - fi - - # Wait for 5 seconds before the next iteration - sleep 5 + # Iterate over each environment variable matching 'REPO_[0-9]+' + env | grep '^REPO_[0-9]\+=' | while IFS='=' read -r name value; do + IFS=',' read -ra REPO_DEST <<< "$value" + process_repo "${REPO_DEST[0]}" "${REPO_DEST[1]}" + done + # Wait for 5 seconds before the next iteration + sleep 5 done