Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CCM-6405 adding initial repo sync script and workflow #33

Merged
merged 2 commits into from
Sep 9, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions .github/workflows/scheduled-repository-template-sync.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Repository Template Sync

on:
schedule:
- cron: '0 0 1 * *'
workflow_dispatch:

permissions:
contents: write
pull-requests: write
checks: read

jobs:
update-external-repo:
runs-on: ubuntu-latest

steps:
- name: Check out the repository
uses: actions/checkout@v3

- name: Check out external repository
uses: actions/checkout@v3
with:
repository: nhsdigital/nhs-notify-repository-template
path: nhs-notify-repository-template

- name: Run syncronisation script
run: |
/scripts/githooks/sync-template-repo.sh

- name: Create Pull Request
aidenvaines-bjss marked this conversation as resolved.
Show resolved Hide resolved
uses: peter-evans/[email protected]
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: Drift from template
branch: scheduledTemplateRepositorySync
delete-branch: true
title: '[Template Sync] Drift from template-repository remediation'
body: |
# Resultant drift from repository template

## Who should respond to this PR?
The team which owns the responsibility for the services the repository maintains

## How to progress this PR
The repositories guardians should review the contents of the PR and decide
how to proceed, you may wish to back-out certain changes or accept them from the upstream
`nhsdigital/nhs-notify-repository-template` repository.

If there are changes you do not wish to see again, it is recommended you add exclusions to
`scripts/config/.repository-template-sync-ignore`
labels: |
template
automation
draft: false
16 changes: 16 additions & 0 deletions scripts/config/.repository-template-sync-ignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Files and folders to ignore when syncing nhs-notify-repository-template back in to this repository
scripts/config/.repository-template-sync-ignore

# Files and Folders in this repository to ignore
.vscode/
CHANGELOG.md
project.code-workspace
README.md
VERSION

# Files and Folders in the template repository to disregard
.devcontainer/
.github/workflows/cicd-*.yaml
*/examples/
docs/
infrastructure/terraform/components/
111 changes: 111 additions & 0 deletions scripts/githooks/sync-template-repo.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
#!/bin/bash

set -euo pipefail

# Script to synchronise the nhs-notify-template-repository with this repository
#
# Usage:
# $ [options] ./check-terraform-format.sh
#
# Options:
# new_only=true # Only identify new files from the template-repository
# changes_only=true # Only identify files which have drifted from the template-repository

# ==============================================================================

# Command line prameters
new_only=${new_only:-false}
changes_only=${changes_only:-false}

# Set variables
TEMPLATE_REPO_DIR="nhs-notify-repository-template"
IGNORE_FILE="scripts/config/.repository-template-sync-ignore"

# Check if the template directory exists
if [ ! -d "${TEMPLATE_REPO_DIR}" ]; then
echo "Template directory ${TEMPLATE_REPO_DIR} not found!"
exit 1
fi

# Check if the .template-ignore file exists, create an empty one if not
if [ ! -f "${IGNORE_FILE}" ]; then
echo "# Files and folders to ignore when syncing ${TEMPLATE_REPO_DIR} back in to this repository" > ${IGNORE_FILE}
echo "# Files and Folders in this repository to ignore" >> ${IGNORE_FILE}
echo "# Files and Folders in the template repository to disregard" >> ${IGNORE_FILE}
fi

# Read the .template-ignore file into an array
# readarray -t IGNORED_PATHS < "${IGNORE_FILE}"
while IFS= read -r line || [ -n "$line" ]; do
IGNORED_PATHS+=("$line")
done < "$IGNORE_FILE"

# Check if a file is ignored.
is_ignored() {
local file=${1}

# Ignore .git directories and files
if [[ "$file" == *.git/* ]]; then
return 0
fi

for ignored in "${IGNORED_PATHS[@]}"; do
if [[ "$file" =~ $ignored ]]; then
return 0
fi
done
return 1
}

# Navigate to the template directory
cd "${TEMPLATE_REPO_DIR}" || exit
FILES_ADDED=()
FILES_WITH_CHANGES=()

# Loop through all files in the template directory
while IFS= read -r -d '' file; do
relative_path="${file#./}" # Remove leading './'

# Check if the file is ignored
if is_ignored "$relative_path"; then
# echo "Ignoring $relative_path"
continue
fi

target_path="../$relative_path"
mkdir -p "$(dirname "$target_path")"

# Copy the file to the root directory if it doesn't exist or is different
if [ ! -f "$target_path" ] && [ "$changes_only" == false ]; then
echo "Copying $relative_path to the repository"
FILES_ADDED+=("${relative_path}")
# cp "$file" "$target_path"
aidenvaines-bjss marked this conversation as resolved.
Show resolved Hide resolved

else
# If the file exists, check if it's different
if [ "$new_only" == false ]; then
if ! diff -q "$file" "$target_path" > /dev/null 2>&1; then
# echo "Merging changes from $relative_path"
FILES_WITH_CHANGES+=("${relative_path}")
# cp "$file" "$target_path"
fi
fi
fi
done < <(find . -type f -print0)

echo "${#FILES_ADDED[@]}" files added, "${#FILES_WITH_CHANGES[@]}" files with changes detected.

echo ------------------------------------------

if [ "$changes_only" == false ]; then
echo ------------------------------------------
echo "New files added:"
printf ' - %s\n' "${FILES_ADDED[@]}"
fi


if [ "$new_only" == false ]; then
echo ------------------------------------------
echo "Changed files:"
printf ' - %s\n' "${FILES_WITH_CHANGES[@]}"
fi
Loading