Commit 1744d1fc authored by Nikos Psaromanolakis's avatar Nikos Psaromanolakis
Browse files

fix: Edit .gitlab-ci.yml

parent 2a2a5e8d
Loading
Loading
Loading
Loading
Loading
+215 −8
Original line number Diff line number Diff line
@@ -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 \
@@ -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)
@@ -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
@@ -796,7 +1004,6 @@ nightly_compare_failed_images_job:
    - when: never



nightly_cleanup_job:
  stage: nightly_cleanup
  image: