Repository: eclipse-che/che-server
Pull request #777: Do not fetch git username and email if the gitconfig configmap contains the data
Author: login: vinokurig
Labels: name: lgtm
Created: 2025-03-05T12:04:01Z | Merged: 2025-03-06T14:13:13Z

<!-- Please review the following before submitting a PR:
Che's Contributing Guide: https://github.com/eclipse/che/blob/master/CONTRIBUTING.md
Pull Request Policy: https://github.com/eclipse/che/wiki/Development-Workflow#pull-requests
-->

### What does this PR do?
Check the `workspace-userdata-gitconfig-configmap` configmap if it contains gitconfig with username and email and the data is not empty. Only then, try to fetch username and email from a git provider.

### Screenshot/screencast of this PR
<!-- Please include a screenshot or a screencast explaining what is doing this PR -->


### What issues does this PR fix or reference?
<!-- Please include any related issue from eclipse che repository (or from another issue tracker).
     Include link to other pull requests like documentation PR from [the docs repo](https://github.com/eclipse/che-docs)
-->
fixes https://github.com/eclipse-che/che/issues/23376

### How to test this PR?
<!-- Please explain for example :
  - The test platform (openshift, kubernetes, minikube, CodeReady Container, docker-desktop, etc)
  - Installation method: chectl / che-operator
  - steps to reproduce
 -->
N/A

### PR Checklist

[As the author of this Pull Request I made sure that:](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#pull-request-template-and-its-checklist)

- [ ] [The Eclipse Contributor Agreement is valid](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#the-eclipse-contributor-agreement-is-valid)
- [ ] [Code produced is complete](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#code-produced-is-complete)
- [ ] [Code builds without errors](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#code-builds-without-errors)
- [ ] [Tests are covering the bugfix](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#tests-are-covering-the-bugfix)
- [ ] [The repository devfile is up to date and works](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#the-repository-devfile-is-up-to-date-and-works)
- [ ] [Sections `What issues does this PR fix or reference` and `How to test this PR` completed](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#sections-what-issues-does-this-pr-fix-or-reference-and-how-to-test-this-pr-completed)
- [ ] [Relevant user documentation updated](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#relevant-contributing-documentation-updated)
- [ ] [Relevant contributing documentation updated](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#relevant-contributing-documentation-updated)
- [ ] [CI/CD changes implemented, documented and communicated](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#cicd-changes-implemented-documented-and-communicated)

### Release Notes

### Reviewers

Reviewers, please comment how you tested the PR when approving it.



Diff:
diff --git a/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/GitconfigConfigurator.java b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/GitconfigConfigurator.java
index e25e82e2dd9..04eeba828aa 100644
--- a/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/GitconfigConfigurator.java
+++ b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/GitconfigConfigurator.java
@@ -75,25 +75,26 @@ public void configure(NamespaceResolutionContext namespaceResolutionContext, Str
       throws InfrastructureException {
     KubernetesClient client = cheServerKubernetesClientFactory.create();
     Optional<String> gitconfigOptional = getGitconfig(client, namespaceName);
-    Optional<Pair<String, String>> usernameAndEmailFromGitconfigOptional = Optional.empty();
-    Optional<Pair<String, String>> usernameAndEmailFromFetcherOptional =
-        getUsernameAndEmailFromFetcher(namespaceName);
-    if (gitconfigOptional.isPresent()) {
-      String gitconfig = gitconfigOptional.get();
-      usernameAndEmailFromGitconfigOptional = getUsernameAndEmailFromGitconfig(gitconfig);
-    }
-    if (needUpdateGitconfigConfigmap(
-        usernameAndEmailFromGitconfigOptional, usernameAndEmailFromFetcherOptional)) {
-      ConfigMap gitconfigConfigmap = buildGitconfigConfigmap();
-      Optional<Pair<String, String>> usernameAndEmailOptional =
-          usernameAndEmailFromGitconfigOptional.isPresent()
-              ? usernameAndEmailFromGitconfigOptional
-              : usernameAndEmailFromFetcherOptional;
-      Optional<String> gitconfigSectionsOptional =
-          generateGitconfigSections(gitconfigOptional, usernameAndEmailOptional);
-      gitconfigConfigmap.setData(
-          ImmutableMap.of(CONFIGMAP_DATA_KEY, gitconfigSectionsOptional.orElse("")));
-      client.configMaps().inNamespace(namespaceName).createOrReplace(gitconfigConfigmap);
+    // Try to get username and email from the gitconfig configmap if present.
+    Optional<Pair<String, String>> usernameAndEmailFromGitconfigOptional =
+        gitconfigOptional.isPresent()
+            ? getUsernameAndEmailFromGitconfig(gitconfigOptional.get())
+            : Optional.empty();
+    // If username and email are not present in the gitconfig configmap, or the values are empty, or
+    // the gitconfig configmap is empty, try to get them from the fetcher.
+    if (usernameAndEmailFromGitconfigOptional.isEmpty()) {
+      Optional<Pair<String, String>> usernameAndEmailFromFetcher =
+          // Fetch username and email from a token secret if it is present.
+          getUsernameAndEmailFromFetcher(namespaceName);
+      // If username and email are present, create or update the gitconfig configmap.
+      if (usernameAndEmailFromFetcher.isPresent()) {
+        ConfigMap gitconfigConfigmap = buildGitconfigConfigmap();
+        Optional<String> gitconfigSectionsOptional =
+            generateGitconfigSections(gitconfigOptional, usernameAndEmailFromFetcher);
+        gitconfigConfigmap.setData(
+            ImmutableMap.of(CONFIGMAP_DATA_KEY, gitconfigSectionsOptional.orElse("")));
+        client.configMaps().inNamespace(namespaceName).createOrReplace(gitconfigConfigmap);
+      }
     }
   }
 
@@ -107,13 +108,6 @@ private ConfigMap buildGitconfigConfigmap() {
         .build();
   }
 
-  private boolean needUpdateGitconfigConfigmap(
-      Optional<Pair<String, String>> usernameAndEmailFromGitconfigOptional,
-      Optional<Pair<String, String>> usernameAndEmailFromFetcher) {
-    return usernameAndEmailFromGitconfigOptional.isEmpty()
-        && usernameAndEmailFromFetcher.isPresent();
-  }
-
   private Optional<String> generateGitconfigSections(
       Optional<String> gitconfigOptional, Optional<Pair<String, String>> usernameAndEmailOptional) {
     Optional<String> userSectionOptional =
diff --git a/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/GitconfigConfiguratorTest.java b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/GitconfigConfiguratorTest.java
index c7850431eac..a89d89ece1d 100644
--- a/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/GitconfigConfiguratorTest.java
+++ b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/GitconfigConfiguratorTest.java
@@ -12,7 +12,9 @@
 package org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;
 
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableMap;
@@ -193,8 +195,6 @@ public void shouldNotUpdateGitconfigConfigmapWithUserSection()
     serverMock.getClient().configMaps().inNamespace(TEST_NAMESPACE_NAME).create(gitconfigConfigmap);
     configurator =
         new GitconfigConfigurator(cheServerKubernetesClientFactory, Set.of(gitUserDataFetcher));
-    when(gitUserDataFetcher.fetchGitUserData(anyString()))
-        .thenReturn(new GitUserData("fetcher-username", "fetcher-userEmail"));
     // when
     configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);
     // then
@@ -204,5 +204,7 @@ public void shouldNotUpdateGitconfigConfigmapWithUserSection()
     Assert.assertEquals(configMaps.size(), 1);
     String expected = "[user]\n\tname = gitconfig-username\n\temail = gitconfig-email";
     Assert.assertEquals(configMaps.get(0).getData().get("gitconfig"), expected);
+    // Check that fetchGitUserData was not called.
+    verify(gitUserDataFetcher, never()).fetchGitUserData(anyString());
   }
 }


Reviews:
user: login: ibuziuk
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-05T13:14:44Z
user: login: vinokurig
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-05T13:22:40Z
user: login: ibuziuk
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-05T16:27:07Z
user: login: vinokurig
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-06T09:23:24Z
user: login: ibuziuk
state: APPROVED
author_association: MEMBER
submitted_at: 2025-03-06T09:45:08Z
user: login: artaleks9
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-06T12:34:24Z
user: login: tolusha
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-06T13:47:22Z

Review comments:
diff_hunk: @@ -76,24 +76,25 @@ public void configure(NamespaceResolutionContext namespaceResolutionContext, Str
     KubernetesClient client = cheServerKubernetesClientFactory.create();
     Optional<String> gitconfigOptional = getGitconfig(client, namespaceName);
     Optional<Pair<String, String>> usernameAndEmailFromGitconfigOptional = Optional.empty();
+<<<<<<< Updated upstream
path: infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/GitconfigConfigurator.java
user: login: ibuziuk
body: smth. wrong with stashes
created_at: 2025-03-05T13:14:44Z
author_association: MEMBER
diff_hunk: @@ -76,24 +76,25 @@ public void configure(NamespaceResolutionContext namespaceResolutionContext, Str
     KubernetesClient client = cheServerKubernetesClientFactory.create();
     Optional<String> gitconfigOptional = getGitconfig(client, namespaceName);
     Optional<Pair<String, String>> usernameAndEmailFromGitconfigOptional = Optional.empty();
+<<<<<<< Updated upstream
path: infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/GitconfigConfigurator.java
user: login: vinokurig
body: fixed
created_at: 2025-03-05T13:22:40Z
author_association: CONTRIBUTOR
diff_hunk: @@ -76,24 +76,21 @@ public void configure(NamespaceResolutionContext namespaceResolutionContext, Str
     KubernetesClient client = cheServerKubernetesClientFactory.create();
     Optional<String> gitconfigOptional = getGitconfig(client, namespaceName);
     Optional<Pair<String, String>> usernameAndEmailFromGitconfigOptional = Optional.empty();
-    Optional<Pair<String, String>> usernameAndEmailFromFetcherOptional =
-        getUsernameAndEmailFromFetcher(namespaceName);
     if (gitconfigOptional.isPresent()) {
       String gitconfig = gitconfigOptional.get();
       usernameAndEmailFromGitconfigOptional = getUsernameAndEmailFromGitconfig(gitconfig);
     }
-    if (needUpdateGitconfigConfigmap(
-        usernameAndEmailFromGitconfigOptional, usernameAndEmailFromFetcherOptional)) {
-      ConfigMap gitconfigConfigmap = buildGitconfigConfigmap();
-      Optional<Pair<String, String>> usernameAndEmailOptional =
-          usernameAndEmailFromGitconfigOptional.isPresent()
-              ? usernameAndEmailFromGitconfigOptional
-              : usernameAndEmailFromFetcherOptional;
-      Optional<String> gitconfigSectionsOptional =
-          generateGitconfigSections(gitconfigOptional, usernameAndEmailOptional);
-      gitconfigConfigmap.setData(
-          ImmutableMap.of(CONFIGMAP_DATA_KEY, gitconfigSectionsOptional.orElse("")));
-      client.configMaps().inNamespace(namespaceName).createOrReplace(gitconfigConfigmap);
+    if (usernameAndEmailFromGitconfigOptional.isEmpty()) {
+      Optional<Pair<String, String>> usernameAndEmailFromFetcher =
+          getUsernameAndEmailFromFetcher(namespaceName);
+      if (usernameAndEmailFromFetcher.isPresent()) {
+        ConfigMap gitconfigConfigmap = buildGitconfigConfigmap();
+        Optional<String> gitconfigSectionsOptional =
+            generateGitconfigSections(gitconfigOptional, usernameAndEmailFromFetcher);
+        gitconfigConfigmap.setData(
+            ImmutableMap.of(CONFIGMAP_DATA_KEY, gitconfigSectionsOptional.orElse("")));
+        client.configMaps().inNamespace(namespaceName).createOrReplace(gitconfigConfigmap);
+      }
path: infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/GitconfigConfigurator.java
user: login: ibuziuk
body: can we extract it to a separate method and add clear javadoc?
created_at: 2025-03-05T16:27:07Z
author_association: MEMBER
diff_hunk: @@ -76,24 +76,21 @@ public void configure(NamespaceResolutionContext namespaceResolutionContext, Str
     KubernetesClient client = cheServerKubernetesClientFactory.create();
     Optional<String> gitconfigOptional = getGitconfig(client, namespaceName);
     Optional<Pair<String, String>> usernameAndEmailFromGitconfigOptional = Optional.empty();
-    Optional<Pair<String, String>> usernameAndEmailFromFetcherOptional =
-        getUsernameAndEmailFromFetcher(namespaceName);
     if (gitconfigOptional.isPresent()) {
       String gitconfig = gitconfigOptional.get();
       usernameAndEmailFromGitconfigOptional = getUsernameAndEmailFromGitconfig(gitconfig);
     }
-    if (needUpdateGitconfigConfigmap(
-        usernameAndEmailFromGitconfigOptional, usernameAndEmailFromFetcherOptional)) {
-      ConfigMap gitconfigConfigmap = buildGitconfigConfigmap();
-      Optional<Pair<String, String>> usernameAndEmailOptional =
-          usernameAndEmailFromGitconfigOptional.isPresent()
-              ? usernameAndEmailFromGitconfigOptional
-              : usernameAndEmailFromFetcherOptional;
-      Optional<String> gitconfigSectionsOptional =
-          generateGitconfigSections(gitconfigOptional, usernameAndEmailOptional);
-      gitconfigConfigmap.setData(
-          ImmutableMap.of(CONFIGMAP_DATA_KEY, gitconfigSectionsOptional.orElse("")));
-      client.configMaps().inNamespace(namespaceName).createOrReplace(gitconfigConfigmap);
+    if (usernameAndEmailFromGitconfigOptional.isEmpty()) {
+      Optional<Pair<String, String>> usernameAndEmailFromFetcher =
+          getUsernameAndEmailFromFetcher(namespaceName);
+      if (usernameAndEmailFromFetcher.isPresent()) {
+        ConfigMap gitconfigConfigmap = buildGitconfigConfigmap();
+        Optional<String> gitconfigSectionsOptional =
+            generateGitconfigSections(gitconfigOptional, usernameAndEmailFromFetcher);
+        gitconfigConfigmap.setData(
+            ImmutableMap.of(CONFIGMAP_DATA_KEY, gitconfigSectionsOptional.orElse("")));
+        client.configMaps().inNamespace(namespaceName).createOrReplace(gitconfigConfigmap);
+      }
path: infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/GitconfigConfigurator.java
user: login: vinokurig
body: Added javadocs to each step.
created_at: 2025-03-06T09:23:23Z
author_association: CONTRIBUTOR

PR comments:
user: login: vinokurig
created_at: 2025-03-06T11:00:08Z
body: /retest
author_association: CONTRIBUTOR
user: login: openshift-ci[bot]
created_at: 2025-03-06T11:58:25Z
body: @vinokurig: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
ci/prow/v14-gitlab-with-oauth-setup-flow | 6678d862fe68c296b5c811dd4d871c13f22f7016 | [link](https://prow.ci.openshift.org/view/gs/test-platform-results/pr-logs/pull/eclipse-che_che-server/777/pull-ci-eclipse-che-che-server-main-v14-gitlab-with-oauth-setup-flow/1897603139729625088) | true | `/test v14-gitlab-with-oauth-setup-flow`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=eclipse-che&repo=che-server&pr=777). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:vinokurig).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
author_association: NONE
user: login: artaleks9
created_at: 2025-03-06T12:33:57Z
body: Verified on Eclipse Che with `quay.io/eclipse/che-server:pr-777` -  **the functionality works properly**
author_association: CONTRIBUTOR
user: login: openshift-ci[bot]
created_at: 2025-03-06T13:47:27Z
body: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/eclipse-che/che-server/pull/777#pullrequestreview-2664311857" title="Approved">artaleks9</a>*, *<a href="https://github.com/eclipse-che/che-server/pull/777#pullrequestreview-2663901867" title="Approved">ibuziuk</a>*, *<a href="https://github.com/eclipse-che/che-server/pull/777#pullrequestreview-2664498347" title="Approved">tolusha</a>*, *<a href="https://github.com/eclipse-che/che-server/pull/777#" title="Author self-approved">vinokurig</a>*


The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=eclipse-che%2Fche-server).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/eclipse-che/che-server/blob/main/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
author_association: NONE
user: login: devspacesbuild
created_at: 2025-03-06T14:13:36Z
body: Build [3.20](https://github.com/redhat-developer/devspaces-images/tree/devspaces-3-rhel-9/) :: [server_3.x/387](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/server_3.x/387/): [Console](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/server_3.x/387/console), [Changes](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/server_3.x/387/changes), [Git Data](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/server_3.x/387/git)
author_association: NONE
user: login: devspacesbuild
created_at: 2025-03-06T14:25:06Z
body: Build [3.20](https://github.com/redhat-developer/devspaces-images/tree/devspaces-3-rhel-9/) :: [sync-to-downstream_3.x/8853](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/sync-to-downstream_3.x/8853/): [Console](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/sync-to-downstream_3.x/8853/console), [Changes](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/sync-to-downstream_3.x/8853/changes), [Git Data](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/sync-to-downstream_3.x/8853/git)
author_association: NONE
user: login: devspacesbuild
created_at: 2025-03-06T14:25:38Z
body: Build [3.20](https://github.com/redhat-developer/devspaces-images/tree/devspaces-3-rhel-9/) :: [get-sources-rhpkg-container-build_3.x/8972](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/get-sources-rhpkg-container-build_3.x/8972/): [Console](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/get-sources-rhpkg-container-build_3.x/8972/console), [Changes](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/get-sources-rhpkg-container-build_3.x/8972/changes), [Git Data](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/get-sources-rhpkg-container-build_3.x/8972/git)
author_association: NONE
user: login: devspacesbuild
created_at: 2025-03-06T14:54:50Z
body: Build [3.20](https://github.com/redhat-developer/devspaces-images/tree/devspaces-3-rhel-9/) :: [push-latest-container-to-quay_3.x/5106](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/push-latest-container-to-quay_3.x/5106/): [Console](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/push-latest-container-to-quay_3.x/5106/console), [Changes](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/push-latest-container-to-quay_3.x/5106/changes), [Git Data](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/push-latest-container-to-quay_3.x/5106/git)
author_association: NONE
user: login: devspacesbuild
created_at: 2025-03-06T15:04:11Z
body: Build [3.20](https://github.com/redhat-developer/devspaces-images/tree/devspaces-3-rhel-9/) :: [get-sources-rhpkg-container-build_3.x/8972](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/get-sources-rhpkg-container-build_3.x/8972/): [![SUCCESS](https://img.shields.io/badge/Build-SUCCESS-brightgreen?style=plastic&logo=redhat)](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/get-sources-rhpkg-container-build_3.x/8972/)<br /><blockquote>server : 3.x :: <a href='https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=66900338'> Build  66900338</a> : <a href=https://quay.io/devspaces/server-rhel9:3.20-5>quay.io/devspaces/server-rhel9:3.20-5</a> <br /> SUCCESS; copied to quay; <a href=https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/push-latest-container-to-quay_3.x/5106/>/DS_CI/push-latest-container-to-quay_3.x/5106</a> triggered</blockquote>
author_association: NONE
user: login: devspacesbuild
created_at: 2025-03-06T15:04:15Z
body: Build [3.20](https://github.com/redhat-developer/devspaces-images/tree/devspaces-3-rhel-9/) :: [server_3.x/387](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/server_3.x/387/): [![SUCCESS](https://img.shields.io/badge/Build-SUCCESS-brightgreen?style=plastic&logo=redhat)](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/server_3.x/387/)<br /><blockquote>Upstream sync done; <a href=https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/sync-to-downstream_3.x/8853/>/DS_CI/sync-to-downstream_3.x/8853</a> triggered</blockquote>
author_association: NONE
user: login: devspacesbuild
created_at: 2025-03-06T15:06:51Z
body: Build [3.20](https://github.com/redhat-developer/devspaces-images/tree/devspaces-3-rhel-9/) :: [update-digests_3.x/8732](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/update-digests_3.x/8732/): [Console](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/update-digests_3.x/8732/console), [Changes](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/update-digests_3.x/8732/changes), [Git Data](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/update-digests_3.x/8732/git)
author_association: NONE
user: login: devspacesbuild
created_at: 2025-03-06T15:08:19Z
body: Build [3.20](https://github.com/redhat-developer/devspaces-images/tree/devspaces-3-rhel-9/) :: [operator-bundle_3.x/4506](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/operator-bundle_3.x/4506/): [Console](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/operator-bundle_3.x/4506/console), [Changes](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/operator-bundle_3.x/4506/changes), [Git Data](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/operator-bundle_3.x/4506/git)
author_association: NONE
user: login: devspacesbuild
created_at: 2025-03-06T15:11:18Z
body: Build [3.20](https://github.com/redhat-developer/devspaces-images/tree/devspaces-3-rhel-9/) :: [sync-to-downstream_3.x/8856](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/sync-to-downstream_3.x/8856/): [Console](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/sync-to-downstream_3.x/8856/console), [Changes](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/sync-to-downstream_3.x/8856/changes), [Git Data](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/sync-to-downstream_3.x/8856/git)
author_association: NONE
user: login: devspacesbuild
created_at: 2025-03-06T15:16:22Z
body: Build [3.20](https://github.com/redhat-developer/devspaces-images/tree/devspaces-3-rhel-9/) :: [get-sources-rhpkg-container-build_3.x/8975](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/get-sources-rhpkg-container-build_3.x/8975/): [Console](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/get-sources-rhpkg-container-build_3.x/8975/console), [Changes](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/get-sources-rhpkg-container-build_3.x/8975/changes), [Git Data](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/get-sources-rhpkg-container-build_3.x/8975/git)
author_association: NONE
user: login: devspacesbuild
created_at: 2025-03-06T15:18:46Z
body: Build [3.20](https://github.com/redhat-developer/devspaces-images/tree/devspaces-3-rhel-9/) :: [get-sources-rhpkg-container-build_3.x/8975](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/get-sources-rhpkg-container-build_3.x/8975/): [![FAILURE](https://img.shields.io/badge/Build-FAILURE-red?style=plastic&logo=redhat)](https://jenkins-csb-crwqe-main.dno.corp.redhat.com/job/DS_CI/job/get-sources-rhpkg-container-build_3.x/8975/)<br /><blockquote>devspaces-operator-bundle : 3.x :: <a href='https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=66901388'> Failed in  66901388</a> : BREW:BUILD/STATUS:UNKNOWN <br /> FAILURE:; copied to quay</blockquote>
author_association: NONE