diff --git a/.github/workflows/sync-deprecations.yaml b/.github/workflows/sync-deprecations.yaml new file mode 100644 index 000000000000..57c8a1f1f6bd --- /dev/null +++ b/.github/workflows/sync-deprecations.yaml @@ -0,0 +1,19 @@ +name: Sync containers repositories + +on: + schedule: + # Every day at 1 AM + - cron: '0 1 * * *' + workflow_dispatch: +jobs: + build: + name: Sync deprecations + runs-on: ubuntu-latest + steps: + - name: Checkout bitnami/containers + uses: actions/checkout@v3 + with: + token: ${{ secrets.BITNAMI_BOT_SECRET }} + fetch-depth: 0 + - name: Sync Containers + run: ./scripts/sync-deprecations.sh \ No newline at end of file diff --git a/scripts/sync-deprecations.sh b/scripts/sync-deprecations.sh new file mode 100755 index 000000000000..8d28afc2f8f5 --- /dev/null +++ b/scripts/sync-deprecations.sh @@ -0,0 +1,117 @@ +#!/bin/bash + +set -o errexit +set -o nounset +set -o pipefail +#set -o xtrace # Uncomment this line for debugging purpose + +TARGET_DIR="." + +######################## +# Query github api to get containers repositories +# Arguments: +# None +# Returns: +# None +######################### +queryRepos() { + local page=0 + local repos="[]" # Initial empty JSON array + local -r repos_per_page="100" + + while [[ "$page" -gt -1 ]]; do + # Query only the public repos since we won't add private containers to bitnami/containers + page_repos="$(curl -sH 'Content-Type: application/json' -H 'Accept: application/json' "https://api.github.com/orgs/bitnami/repos?type=public&per_page=${repos_per_page}&page=${page}")" + repos="$(jq -s 'reduce .[] as $x ([]; . + $x)' <(echo "$repos") <(echo "$page_repos"))" + n_repos="$(jq length <<< "$page_repos")" + if [[ "$n_repos" -lt "$repos_per_page" ]]; then + page="-1" + else + page="$((page + 1))" + fi + done + + echo "$repos" +} + +######################## +# Get non archived bitnami containers repositories +# Arguments: +# None +# Returns: +# None +######################### +getContainerRepos() { + local -r repos="$(queryRepos)" + local -r container_repos="$(jq -r '[ .[] | select(.name | test("bitnami-docker-.")) | select(.archived == false) ]' <<< "$repos")" + local result="" + while read -r repo_url; do + result="${result} ${repo_url:42}" + done < <(echo "$container_repos" | jq -r '.[].html_url' | uniq | sort) + echo "$result" +} + +######################## +# Set git user +# Arguments: +# None +# Returns: +# None +######################### +gitConfigure() { + git config --global user.name "Bitnami Containers" + git config --global user.email "bitnami-bot@vmware.com" +} + +######################## +# Push changes to right branch. +# Arguments: +# None +# Returns: +# None +######################### +pushChanges() { + git push origin "$(git rev-parse --abbrev-ref HEAD)" +} + +######################## +# Sync deprecations. +# Arguments: +# None +# Returns: +# None +######################### +syncDeprecations() { + gitConfigure # Configure Git client + mkdir -p "$TARGET_DIR" + local -r repos="$(getContainerRepos)" + + cd "${TARGET_DIR}/bitnami" || exit + for container in *; do + if [[ ! $repos =~ (^|[[:space:]])$container($|[[:space:]]) ]]; then + # Clean deprecated assets + echo "Removing container: ${container}" + rm -rf "${container}" + git add "${container}" + git commit -q -m "Remove deprecated container ${container}" + else + # Clean deprecated branches + git clone --quiet --depth 1 "https://github.com/bitnami/bitnami-docker-${container}" "/tmp/${container}" + cd "${container}" || exit + for branch in *; do + if [[ -d "${branch}" ]] && [[ ! -d "/tmp/${container}/${branch}" ]]; then + # Branch exists in bitnami/containers but it doesn't in bitnami-docker repo + echo "Removing branch: ${container}/${branch}" + rm -rf "${branch}" + git add "${branch}" + git commit -q -m "Remove deprecated branch ${container}/${branch}" + fi + done + cd - || exit + fi + done + + pushChanges +} + +syncDeprecations \ No newline at end of file