Loading .gitlab-ci.yml +215 −8 Original line number Diff line number Diff line Loading @@ -649,7 +649,11 @@ nightly_compare_failed_images_job: artifacts: false optional: true before_script: # Required for querying the GitLab Container Registry API - apk add --no-cache curl jq - docker info >/dev/null - | echo -n "$CI_REGISTRY_PASSWORD" | docker login \ Loading @@ -666,6 +670,189 @@ nightly_compare_failed_images_job: FAILED_DATE_TAG="failed-nightly-$(date +%Y-%m-%d)" DIFFERENCES_FOUND=false # Maps an image registry path to the variable containing # the GitLab API URL for that project's registry repositories. get_repository_api_url() { case "$1" in */fabric-api-jvm) printf '%s\n' "${FABRIC_API_URL:-}" ;; */peering-api-jvm) printf '%s\n' "${PEERING_API_URL:-}" ;; */registry-api-jvm) printf '%s\n' "${REGISTRY_API_URL:-}" ;; */tmf-api-jvm) printf '%s\n' "${TMF_API_URL:-}" ;; */oss-client-jvm) printf '%s\n' "${OSS_CLIENT_URL:-}" ;; */telemetry-api-jvm) printf '%s\n' "${TELEMETRY_CLIENT_URL:-}" ;; */pkg-manager) printf '%s\n' "${PKG_MANAGER_URL:-}" ;; */sonata-core-jvm) printf '%s\n' "${SONATA_URL:-}" ;; */hypo-portal-jvm) printf '%s\n' "${PORTAL_CART_URL:-}" ;; */hypo-portal) printf '%s\n' "${PORTAL_URL:-}" ;; *) printf '%s\n' "" ;; esac } # Finds the 8-character commit tag whose registry digest # matches failed-nightly-YYYY-MM-DD. find_commit_for_failed_image() { IMAGE_PATH="$1" FAILED_TAG="$2" REPOSITORIES_URL="$3" if [ -z "$REPOSITORIES_URL" ]; then printf '%s\n' "Unknown" return fi REPOSITORIES_JSON=$( curl \ --fail \ --silent \ --show-error \ --header "PRIVATE-TOKEN: $GROUP_ACCESS_TOKEN" \ --url "$REPOSITORIES_URL" ) || { printf '%s\n' "Unknown" return } REPOSITORY_ID=$( printf '%s' "$REPOSITORIES_JSON" | jq -r \ --arg IMAGE_PATH "$IMAGE_PATH" \ '.[] | select(.location == $IMAGE_PATH) | .id' | head -n 1 ) PROJECT_ID=$( printf '%s' "$REPOSITORIES_JSON" | jq -r \ --arg IMAGE_PATH "$IMAGE_PATH" \ '.[] | select(.location == $IMAGE_PATH) | .project_id' | head -n 1 ) if [ -z "$REPOSITORY_ID" ] || [ "$REPOSITORY_ID" = "null" ] || [ -z "$PROJECT_ID" ] || [ "$PROJECT_ID" = "null" ]; then printf '%s\n' "Unknown" return fi FAILED_TAG_JSON=$( curl \ --fail \ --silent \ --show-error \ --header "PRIVATE-TOKEN: $GROUP_ACCESS_TOKEN" \ --url "${CI_API_V4_URL}/projects/${PROJECT_ID}/registry/repositories/${REPOSITORY_ID}/tags/${FAILED_TAG}" ) || { printf '%s\n' "Unknown" return } FAILED_DIGEST=$( printf '%s' "$FAILED_TAG_JSON" | jq -r '.digest // empty' ) if [ -z "$FAILED_DIGEST" ]; then printf '%s\n' "Unknown" return fi PAGE=1 while true; do TAGS_JSON=$( curl \ --fail \ --silent \ --show-error \ --header "PRIVATE-TOKEN: $GROUP_ACCESS_TOKEN" \ --url "${CI_API_V4_URL}/projects/${PROJECT_ID}/registry/repositories/${REPOSITORY_ID}/tags?per_page=100&page=${PAGE}" ) || { printf '%s\n' "Unknown" return } TAG_COUNT=$( printf '%s' "$TAGS_JSON" | jq 'length' ) if [ "$TAG_COUNT" -eq 0 ]; then break fi COMMIT_TAGS=$( printf '%s' "$TAGS_JSON" | jq -r '.[].name' | grep -E '^[0-9a-fA-F]{8}$' || true ) for TAG in $COMMIT_TAGS; do TAG_JSON=$( curl \ --fail \ --silent \ --show-error \ --header "PRIVATE-TOKEN: $GROUP_ACCESS_TOKEN" \ --url "${CI_API_V4_URL}/projects/${PROJECT_ID}/registry/repositories/${REPOSITORY_ID}/tags/${TAG}" \ 2>/dev/null ) || continue TAG_DIGEST=$( printf '%s' "$TAG_JSON" | jq -r '.digest // empty' ) if [ "$TAG_DIGEST" = "$FAILED_DIGEST" ]; then printf '%s\n' "$TAG" return fi done PAGE=$((PAGE + 1)) done printf '%s\n' "Unknown" } cat > "$REPORT_FILE" <<EOF Nightly failure report Date: $(date +%F) Loading Loading @@ -735,24 +922,45 @@ nightly_compare_failed_images_job: docker tag "$DEV_IMAGE" "$FAILED_IMAGE" docker push "$FAILED_IMAGE" echo "Saved failed image as:" echo " $FAILED_IMAGE" # Find the CI_COMMIT_SHORT_SHA tag that points # to the same registry digest as the failed image. REPOSITORIES_URL=$( get_repository_api_url "$IMAGE" ) COMMIT_SHORT_SHA=$( find_commit_for_failed_image \ "$IMAGE" \ "$FAILED_DATE_TAG" \ "$REPOSITORIES_URL" ) if [ -z "$COMMIT_SHORT_SHA" ]; then COMMIT_SHORT_SHA="Unknown" fi echo "Matching commit:" echo " $COMMIT_SHORT_SHA" # Restore dev-latest from the last successful latest image docker tag "$LATEST_IMAGE" "$DEV_IMAGE" docker push "$DEV_IMAGE" echo "Restored dev-latest from:" echo " $LATEST_IMAGE" # Add it to the report only after both pushes succeed cat >> "$REPORT_FILE" <<EOF - $(basename "$IMAGE") ${FAILED_IMAGE} Backup: ${FAILED_IMAGE} Commit: ${COMMIT_SHORT_SHA} EOF DIFFERENCES_FOUND=true echo "Saved failed image as:" echo " $FAILED_IMAGE" echo "Restored dev-latest from:" echo " $LATEST_IMAGE" else echo "Result: SAME" fi Loading Loading @@ -796,7 +1004,6 @@ nightly_compare_failed_images_job: - when: never nightly_cleanup_job: stage: nightly_cleanup image: Loading Loading
.gitlab-ci.yml +215 −8 Original line number Diff line number Diff line Loading @@ -649,7 +649,11 @@ nightly_compare_failed_images_job: artifacts: false optional: true before_script: # Required for querying the GitLab Container Registry API - apk add --no-cache curl jq - docker info >/dev/null - | echo -n "$CI_REGISTRY_PASSWORD" | docker login \ Loading @@ -666,6 +670,189 @@ nightly_compare_failed_images_job: FAILED_DATE_TAG="failed-nightly-$(date +%Y-%m-%d)" DIFFERENCES_FOUND=false # Maps an image registry path to the variable containing # the GitLab API URL for that project's registry repositories. get_repository_api_url() { case "$1" in */fabric-api-jvm) printf '%s\n' "${FABRIC_API_URL:-}" ;; */peering-api-jvm) printf '%s\n' "${PEERING_API_URL:-}" ;; */registry-api-jvm) printf '%s\n' "${REGISTRY_API_URL:-}" ;; */tmf-api-jvm) printf '%s\n' "${TMF_API_URL:-}" ;; */oss-client-jvm) printf '%s\n' "${OSS_CLIENT_URL:-}" ;; */telemetry-api-jvm) printf '%s\n' "${TELEMETRY_CLIENT_URL:-}" ;; */pkg-manager) printf '%s\n' "${PKG_MANAGER_URL:-}" ;; */sonata-core-jvm) printf '%s\n' "${SONATA_URL:-}" ;; */hypo-portal-jvm) printf '%s\n' "${PORTAL_CART_URL:-}" ;; */hypo-portal) printf '%s\n' "${PORTAL_URL:-}" ;; *) printf '%s\n' "" ;; esac } # Finds the 8-character commit tag whose registry digest # matches failed-nightly-YYYY-MM-DD. find_commit_for_failed_image() { IMAGE_PATH="$1" FAILED_TAG="$2" REPOSITORIES_URL="$3" if [ -z "$REPOSITORIES_URL" ]; then printf '%s\n' "Unknown" return fi REPOSITORIES_JSON=$( curl \ --fail \ --silent \ --show-error \ --header "PRIVATE-TOKEN: $GROUP_ACCESS_TOKEN" \ --url "$REPOSITORIES_URL" ) || { printf '%s\n' "Unknown" return } REPOSITORY_ID=$( printf '%s' "$REPOSITORIES_JSON" | jq -r \ --arg IMAGE_PATH "$IMAGE_PATH" \ '.[] | select(.location == $IMAGE_PATH) | .id' | head -n 1 ) PROJECT_ID=$( printf '%s' "$REPOSITORIES_JSON" | jq -r \ --arg IMAGE_PATH "$IMAGE_PATH" \ '.[] | select(.location == $IMAGE_PATH) | .project_id' | head -n 1 ) if [ -z "$REPOSITORY_ID" ] || [ "$REPOSITORY_ID" = "null" ] || [ -z "$PROJECT_ID" ] || [ "$PROJECT_ID" = "null" ]; then printf '%s\n' "Unknown" return fi FAILED_TAG_JSON=$( curl \ --fail \ --silent \ --show-error \ --header "PRIVATE-TOKEN: $GROUP_ACCESS_TOKEN" \ --url "${CI_API_V4_URL}/projects/${PROJECT_ID}/registry/repositories/${REPOSITORY_ID}/tags/${FAILED_TAG}" ) || { printf '%s\n' "Unknown" return } FAILED_DIGEST=$( printf '%s' "$FAILED_TAG_JSON" | jq -r '.digest // empty' ) if [ -z "$FAILED_DIGEST" ]; then printf '%s\n' "Unknown" return fi PAGE=1 while true; do TAGS_JSON=$( curl \ --fail \ --silent \ --show-error \ --header "PRIVATE-TOKEN: $GROUP_ACCESS_TOKEN" \ --url "${CI_API_V4_URL}/projects/${PROJECT_ID}/registry/repositories/${REPOSITORY_ID}/tags?per_page=100&page=${PAGE}" ) || { printf '%s\n' "Unknown" return } TAG_COUNT=$( printf '%s' "$TAGS_JSON" | jq 'length' ) if [ "$TAG_COUNT" -eq 0 ]; then break fi COMMIT_TAGS=$( printf '%s' "$TAGS_JSON" | jq -r '.[].name' | grep -E '^[0-9a-fA-F]{8}$' || true ) for TAG in $COMMIT_TAGS; do TAG_JSON=$( curl \ --fail \ --silent \ --show-error \ --header "PRIVATE-TOKEN: $GROUP_ACCESS_TOKEN" \ --url "${CI_API_V4_URL}/projects/${PROJECT_ID}/registry/repositories/${REPOSITORY_ID}/tags/${TAG}" \ 2>/dev/null ) || continue TAG_DIGEST=$( printf '%s' "$TAG_JSON" | jq -r '.digest // empty' ) if [ "$TAG_DIGEST" = "$FAILED_DIGEST" ]; then printf '%s\n' "$TAG" return fi done PAGE=$((PAGE + 1)) done printf '%s\n' "Unknown" } cat > "$REPORT_FILE" <<EOF Nightly failure report Date: $(date +%F) Loading Loading @@ -735,24 +922,45 @@ nightly_compare_failed_images_job: docker tag "$DEV_IMAGE" "$FAILED_IMAGE" docker push "$FAILED_IMAGE" echo "Saved failed image as:" echo " $FAILED_IMAGE" # Find the CI_COMMIT_SHORT_SHA tag that points # to the same registry digest as the failed image. REPOSITORIES_URL=$( get_repository_api_url "$IMAGE" ) COMMIT_SHORT_SHA=$( find_commit_for_failed_image \ "$IMAGE" \ "$FAILED_DATE_TAG" \ "$REPOSITORIES_URL" ) if [ -z "$COMMIT_SHORT_SHA" ]; then COMMIT_SHORT_SHA="Unknown" fi echo "Matching commit:" echo " $COMMIT_SHORT_SHA" # Restore dev-latest from the last successful latest image docker tag "$LATEST_IMAGE" "$DEV_IMAGE" docker push "$DEV_IMAGE" echo "Restored dev-latest from:" echo " $LATEST_IMAGE" # Add it to the report only after both pushes succeed cat >> "$REPORT_FILE" <<EOF - $(basename "$IMAGE") ${FAILED_IMAGE} Backup: ${FAILED_IMAGE} Commit: ${COMMIT_SHORT_SHA} EOF DIFFERENCES_FOUND=true echo "Saved failed image as:" echo " $FAILED_IMAGE" echo "Restored dev-latest from:" echo " $LATEST_IMAGE" else echo "Result: SAME" fi Loading Loading @@ -796,7 +1004,6 @@ nightly_compare_failed_images_job: - when: never nightly_cleanup_job: stage: nightly_cleanup image: Loading