Skip to content
Snippets Groups Projects
Commit d926301c authored by Pierre Smeyers's avatar Pierre Smeyers
Browse files

perf: reduce the number of API calls

Retrieves the entire list of releases in dest project all at once instead of one by one.
parent b9ee3d4d
No related branches found
No related tags found
No related merge requests found
......@@ -106,19 +106,19 @@ function maybe_create_group() {
# Synchronize a Release for a project
# $1: source project ID
# $2: destination project ID
# $3: release (as JSON object)
# $3: source release (as JSON object)
# $4: destination release (as JSON object or empty string)
function sync_release() {
src_project_id=$1
dest_project_id=$2
src_release=$3
dest_release=$4
tag_name=$(echo "$src_release" | jq -r .tag_name)
log_info "Synchronizing release \\e[33;1m${tag_name}\\e[0m to project ID \\e[33;1m${dest_project_id}\\e[0m)"
dest_release_status=$(curl ${INSECURE:+-k} -s -o /dev/null -I -w "%{http_code}" -H "${DEST_TOKEN:+PRIVATE-TOKEN: $DEST_TOKEN}" "$DEST_GITLAB_API/projects/$dest_project_id/releases/$tag_name")
if [[ "$dest_release_status" == 404* ]]
if [[ -z "$dest_release" ]]
then
# dest release does not exist: create
log_info "Release \\e[33;1m${tag_name}\\e[0m not found in project \\e[33;1m${dest_project_id}\\e[0m): create"
curl ${INSECURE:+-k} -sSf -H "${DEST_TOKEN:+PRIVATE-TOKEN: $DEST_TOKEN}" -H "Content-Type: application/json" -X POST "$DEST_GITLAB_API/projects/$dest_project_id/releases" \
--data "{
\"tag_name\": \"$tag_name\",
......@@ -126,12 +126,10 @@ function sync_release() {
\"released_at\": $(echo "$src_release" | jq .released_at),
\"description\": $(echo "$src_release" | jq .description)
}" >/dev/null
elif [[ "$dest_release_status" == 200* ]]
then
if [[ "$UPDATE_RELEASE" == "true" ]]
elif [[ "$UPDATE_RELEASE" == "true" ]]
then
log_info "... release \\e[33;1m$tag_name\\e[0m exists: update"
# dest release does not exist: create
log_info "Release \\e[33;1m${tag_name}\\e[0m found in project \\e[33;1m${dest_project_id}\\e[0m): update (force)"
# dest release already exists: update
curl ${INSECURE:+-k} -sSf -H "${DEST_TOKEN:+PRIVATE-TOKEN: $DEST_TOKEN}" -H "Content-Type: application/json" -X PUT "$DEST_GITLAB_API/projects/$dest_project_id/releases/$tag_name" \
--data "{
\"tag_name\": \"$tag_name\",
......@@ -140,11 +138,8 @@ function sync_release() {
\"description\": $(echo "$src_release" | jq .description)
}" >/dev/null
else
log_info "... release \\e[33;1m$tag_name\\e[0m exists: skip"
fi
else
# another error: abort
fail "... unexpected error: $dest_release_status"
# dest release already exists: skip
log_info "Release \\e[33;1m${tag_name}\\e[0m found in project \\e[33;1m${dest_project_id}\\e[0m): skip"
fi
}
......@@ -274,8 +269,13 @@ function sync_project() {
fi
# 3: sync Releases
curl ${INSECURE:+-k} -sSf -H "${SRC_TOKEN:+PRIVATE-TOKEN: $SRC_TOKEN}" "$SRC_GITLAB_API/projects/$src_project_id/releases?per_page=100" | jq -c '.[]' | while read -r release; do
sync_release "$src_project_id" "$dest_project_id" "$release"
src_releases_json=$(curl ${INSECURE:+-k} -sSf -H "${SRC_TOKEN:+PRIVATE-TOKEN: $SRC_TOKEN}" "$SRC_GITLAB_API/projects/$src_project_id/releases?per_page=100")
dest_releases_json=$(curl ${INSECURE:+-k} -sSf -H "${DEST_TOKEN:+PRIVATE-TOKEN: $DEST_TOKEN}" "$DEST_GITLAB_API/projects/$dest_project_id/releases?per_page=100")
printf '%s' "$src_releases_json" | jq -c '.[]' | while read -r src_release_json
do
tag_name=$(printf '%s' "$src_release_json" | jq -r '.tag_name')
dest_release_json=$(printf '%s' "$dest_releases_json" | jq -c '.[] | select(.tag_name == "'"${tag_name}"'")')
sync_release "$src_project_id" "$dest_project_id" "$src_release_json" "$dest_release_json"
done
fi
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment