Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions .github/workflows/deploy-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ on:
- test2
- test3
theia_cloud_tag:
description: 'Theia Cloud components tag (operator, service, landing-page)'
description: 'Theia Cloud components tag (operator, service, landing-page). Leave empty to use the tag defined in values.yaml (no override).'
required: false
default: 'latest'
default: ''
ide_images_tag:
description: 'IDE images tag (appdefinitions and preloading)'
description: 'IDE images tag (appdefinitions and preloading). Leave empty to use the tag defined in values.yaml (no override).'
required: false
default: 'latest'
default: ''
helm_chart_tag:
description: 'Preview OCI tag from theia-cloud-helm to use (for example pr-123)'
required: false
Expand All @@ -47,8 +47,8 @@ jobs:
uses: ./.github/workflows/deploy-theia.yml
with:
environment: test1
theia_cloud_tag: ${{ inputs.theia_cloud_tag || 'latest' }}
ide_images_tag: ${{ inputs.ide_images_tag || 'latest' }}
theia_cloud_tag: ${{ inputs.theia_cloud_tag }}
ide_images_tag: ${{ inputs.ide_images_tag }}
helm_chart_tag: ${{ inputs.helm_chart_tag || '' }}
deploy_shared_gateway: false
shared_gateway_values_file: deployments/shared-gateway/values.yaml
Expand All @@ -65,8 +65,8 @@ jobs:
uses: ./.github/workflows/deploy-theia.yml
with:
environment: test2
theia_cloud_tag: ${{ inputs.theia_cloud_tag || 'latest' }}
ide_images_tag: ${{ inputs.ide_images_tag || 'latest' }}
theia_cloud_tag: ${{ inputs.theia_cloud_tag }}
ide_images_tag: ${{ inputs.ide_images_tag }}
helm_chart_tag: ${{ inputs.helm_chart_tag || '' }}
deploy_shared_gateway: false
shared_gateway_values_file: deployments/shared-gateway/values.yaml
Expand All @@ -83,8 +83,8 @@ jobs:
uses: ./.github/workflows/deploy-theia.yml
with:
environment: test3
theia_cloud_tag: ${{ inputs.theia_cloud_tag || 'latest' }}
ide_images_tag: ${{ inputs.ide_images_tag || 'latest' }}
theia_cloud_tag: ${{ inputs.theia_cloud_tag }}
ide_images_tag: ${{ inputs.ide_images_tag }}
helm_chart_tag: ${{ inputs.helm_chart_tag || '' }}
deploy_shared_gateway: false
shared_gateway_values_file: deployments/shared-gateway/values.yaml
Expand Down
71 changes: 46 additions & 25 deletions .github/workflows/deploy-theia.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,15 @@ on:
required: true
type: string
theia_cloud_tag:
description: "Image tag for Theia Cloud components (operator, service, landing-page)"
description: "Image tag for Theia Cloud components (operator, service, landing-page). Leave empty to use the tag defined in values.yaml (no override)."
required: false
type: string
default: "latest"
default: ""
ide_images_tag:
description: "Image tag for IDE images (appdefinitions and preloading)"
description: "Image tag for IDE images (appdefinitions and preloading). Leave empty to use the tag defined in values.yaml (no override)."
required: false
type: string
default: "latest"
default: ""
helm_chart_tag:
description: "Published OCI preview tag to use for upstream helm charts (e.g. pr-123)"
required: false
Expand Down Expand Up @@ -162,7 +162,7 @@ jobs:
set -euo pipefail

THEIA_CLOUD_BASE_VERSION="1.4.0-next.0"
THEIA_CLOUD_CRDS_VERSION="1.2.0-next.0"
THEIA_CLOUD_CRDS_VERSION="1.2.0-next.1"

Comment on lines 164 to 166
if [ -n "${{ inputs.helm_chart_tag }}" ]; then
normalize_preview_version() {
Expand Down Expand Up @@ -219,6 +219,8 @@ jobs:
env:
KUBECONFIG: ${{ github.workspace }}/kubeconfig
run: |
set -euo pipefail

# Prepare SSL certificates for ingress
# Note: Secrets are already base64 encoded, but we need to write them to files
echo "${{ secrets.THEIA_WILDCARD_CERTIFICATE_CERT }}" | base64 -w 0 > wildcard.crt
Expand All @@ -229,26 +231,45 @@ jobs:
THEIA_CLOUD_TAG="${{ inputs.theia_cloud_tag }}"
IDE_IMAGES_TAG="${{ inputs.ide_images_tag }}"

# Build base helm command with always-present flags
HELM_CMD=(helm upgrade --install theia-cloud-combined ./charts/theia-cloud-combined
--namespace ${{ vars.NAMESPACE }}
--create-namespace
-f ${{ vars.HELM_VALUES_PATH }}/values.yaml
--set-string theia-certificates.adminApiToken="${ADMIN_API_TOKEN_B64}"
--set theia-certificates.wildcardCertificate="$(cat wildcard.crt)"
--set theia-certificates.wildcardKey="$(cat wildcard.key)"
--set theia-cloud.keycloak.cookieSecret="${{ secrets.THEIA_KEYCLOAK_COOKIE_SECRET }}")

# Only override Theia Cloud component images when a tag is explicitly provided
if [ -n "${THEIA_CLOUD_TAG}" ]; then
HELM_CMD+=(
--set theia-cloud.landingPage.image="ghcr.io/eduide/eduide-cloud/landing-page:${THEIA_CLOUD_TAG}"
--set theia-cloud.operator.image="ghcr.io/eduide/eduide-cloud/operator:${THEIA_CLOUD_TAG}"
--set theia-cloud.service.image="ghcr.io/eduide/eduide-cloud/service:${THEIA_CLOUD_TAG}"
--set "theia-cloud.preloading.images[0]=ghcr.io/eduide/eduide-cloud/landing-page:${THEIA_CLOUD_TAG}"
Comment on lines +245 to +250
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Keep theia_cloud_tag as a tag-only override.

This block switches the repository from ghcr.io/eduide/eduide/... to ghcr.io/eduide/eduide-cloud/... instead of only changing the tag. Any deployment that passes theia_cloud_tag will therefore stop matching the images configured in charts/theia-cloud-combined/values.yaml.

Proposed fix
           if [ -n "${THEIA_CLOUD_TAG}" ]; then
             HELM_CMD+=(
-              --set theia-cloud.landingPage.image="ghcr.io/eduide/eduide-cloud/landing-page:${THEIA_CLOUD_TAG}"
-              --set theia-cloud.operator.image="ghcr.io/eduide/eduide-cloud/operator:${THEIA_CLOUD_TAG}"
-              --set theia-cloud.service.image="ghcr.io/eduide/eduide-cloud/service:${THEIA_CLOUD_TAG}"
-              --set "theia-cloud.preloading.images[0]=ghcr.io/eduide/eduide-cloud/landing-page:${THEIA_CLOUD_TAG}"
+              --set theia-cloud.landingPage.image="ghcr.io/eduide/eduide/landing-page:${THEIA_CLOUD_TAG}"
+              --set theia-cloud.operator.image="ghcr.io/eduide/eduide/operator:${THEIA_CLOUD_TAG}"
+              --set theia-cloud.service.image="ghcr.io/eduide/eduide/service:${THEIA_CLOUD_TAG}"
+              --set "theia-cloud.preloading.images[0]=ghcr.io/eduide/eduide/landing-page:${THEIA_CLOUD_TAG}"
             )
           fi
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if [ -n "${THEIA_CLOUD_TAG}" ]; then
HELM_CMD+=(
--set theia-cloud.landingPage.image="ghcr.io/eduide/eduide-cloud/landing-page:${THEIA_CLOUD_TAG}"
--set theia-cloud.operator.image="ghcr.io/eduide/eduide-cloud/operator:${THEIA_CLOUD_TAG}"
--set theia-cloud.service.image="ghcr.io/eduide/eduide-cloud/service:${THEIA_CLOUD_TAG}"
--set "theia-cloud.preloading.images[0]=ghcr.io/eduide/eduide-cloud/landing-page:${THEIA_CLOUD_TAG}"
if [ -n "${THEIA_CLOUD_TAG}" ]; then
HELM_CMD+=(
--set theia-cloud.landingPage.image="ghcr.io/eduide/eduide/landing-page:${THEIA_CLOUD_TAG}"
--set theia-cloud.operator.image="ghcr.io/eduide/eduide/operator:${THEIA_CLOUD_TAG}"
--set theia-cloud.service.image="ghcr.io/eduide/eduide/service:${THEIA_CLOUD_TAG}"
--set "theia-cloud.preloading.images[0]=ghcr.io/eduide/eduide/landing-page:${THEIA_CLOUD_TAG}"
)
fi
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/deploy-theia.yml around lines 245 - 250, The current helm
overrides replace the full image repository/name instead of just the tag; update
the HELM_CMD entries that set theia-cloud.landingPage.image,
theia-cloud.operator.image, theia-cloud.service.image and
theia-cloud.preloading.images[0] so they only override the image tag (e.g. use
theia-cloud.landingPage.image.tag="${THEIA_CLOUD_TAG}",
theia-cloud.operator.image.tag="${THEIA_CLOUD_TAG}",
theia-cloud.service.image.tag="${THEIA_CLOUD_TAG}" and
theia-cloud.preloading.images[0].tag="${THEIA_CLOUD_TAG}" or the equivalent
tag-only keys used by the chart) to preserve the repository/name from
charts/theia-cloud-combined/values.yaml while changing only the tag.

)
fi

# Only override IDE images when a tag is explicitly provided
if [ -n "${IDE_IMAGES_TAG}" ]; then
HELM_CMD+=(
--set "theia-cloud.preloading.images[1]=ghcr.io/eduide/eduide/java-17:${IDE_IMAGES_TAG}"
--set "theia-cloud.preloading.images[2]=ghcr.io/eduide/eduide/c:${IDE_IMAGES_TAG}"
--set "theia-cloud.preloading.images[3]=ghcr.io/eduide/eduide/javascript:${IDE_IMAGES_TAG}"
--set "theia-cloud.preloading.images[4]=ghcr.io/eduide/eduide/ocaml:${IDE_IMAGES_TAG}"
--set "theia-cloud.preloading.images[5]=ghcr.io/eduide/eduide/rust:${IDE_IMAGES_TAG}"
--set "theia-cloud.preloading.images[6]=ghcr.io/eduide/eduide/python:${IDE_IMAGES_TAG}"
--set "theia-cloud.preloading.images[7]=ghcr.io/eduide/eduide/java-17-no-ls:${IDE_IMAGES_TAG}"
--set "theia-cloud.preloading.images[8]=ghcr.io/eduide/eduide/rust-no-ls:${IDE_IMAGES_TAG}"
--set "theia-cloud.preloading.images[9]=ghcr.io/eduide/eduide/langserver-java:${IDE_IMAGES_TAG}"
--set "theia-cloud.preloading.images[10]=ghcr.io/eduide/eduide/langserver-rust:${IDE_IMAGES_TAG}"
Comment on lines +263 to +266
--set theia-appdefinitions.defaultImageTag="${IDE_IMAGES_TAG}"
)
fi

# Install/upgrade the Helm chart with all configuration
# --install: Create if it doesn't exist, upgrade if it does
# --create-namespace: Create the namespace if it doesn't exist
# Image tags controlled by two variables: THEIA_CLOUD_TAG and IDE_IMAGES_TAG
helm upgrade --install theia-cloud-combined ./charts/theia-cloud-combined \
--namespace ${{ vars.NAMESPACE }} \
--create-namespace \
-f ${{ vars.HELM_VALUES_PATH }}/values.yaml \
--set-string theia-certificates.adminApiToken="${ADMIN_API_TOKEN_B64}" \
--set theia-certificates.wildcardCertificate="$(cat wildcard.crt)" \
--set theia-certificates.wildcardKey="$(cat wildcard.key)" \
--set theia-cloud.keycloak.cookieSecret="${{ secrets.THEIA_KEYCLOAK_COOKIE_SECRET }}" \
--set theia-cloud.landingPage.image="ghcr.io/eduide/eduide-cloud/landing-page:${THEIA_CLOUD_TAG}" \
--set theia-cloud.operator.image="ghcr.io/eduide/eduide-cloud/operator:${THEIA_CLOUD_TAG}" \
--set theia-cloud.service.image="ghcr.io/eduide/eduide-cloud/service:${THEIA_CLOUD_TAG}" \
--set "theia-cloud.preloading.images[0]=ghcr.io/eduide/eduide-cloud/landing-page:${THEIA_CLOUD_TAG}" \
--set "theia-cloud.preloading.images[1]=ghcr.io/eduide/eduide/java-17:${IDE_IMAGES_TAG}" \
--set "theia-cloud.preloading.images[2]=ghcr.io/eduide/eduide/c:${IDE_IMAGES_TAG}" \
--set "theia-cloud.preloading.images[3]=ghcr.io/eduide/eduide/javascript:${IDE_IMAGES_TAG}" \
--set "theia-cloud.preloading.images[4]=ghcr.io/eduide/eduide/ocaml:${IDE_IMAGES_TAG}" \
--set "theia-cloud.preloading.images[5]=ghcr.io/eduide/eduide/rust:${IDE_IMAGES_TAG}" \
--set "theia-cloud.preloading.images[6]=ghcr.io/eduide/eduide/python:${IDE_IMAGES_TAG}" \
--set theia-appdefinitions.defaultImageTag="${IDE_IMAGES_TAG}"
# Image tag overrides are applied only when non-empty; otherwise values.yaml settings are preserved
"${HELM_CMD[@]}"
40 changes: 38 additions & 2 deletions charts/theia-appdefinitions/templates/appdefinition.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{{- range .Values.apps }}
{{- $existingApp := lookup "theia.cloud/v1beta10" "AppDefinition" $.Release.Namespace .name }}
{{- $existingApp := lookup "theia.cloud/v1beta11" "AppDefinition" $.Release.Namespace .name }}
{{- $existingSpec := dict }}
{{- if $existingApp }}
{{- $existingSpec = get $existingApp "spec" | default dict }}
Expand All @@ -14,7 +14,7 @@
{{- $maxInstances = get $existingSpec "maxInstances" }}
{{- end }}
---
apiVersion: theia.cloud/v1beta10
apiVersion: theia.cloud/v1beta11
kind: AppDefinition
Comment on lines 1 to 18
metadata:
name: {{ .name }}
Expand Down Expand Up @@ -54,4 +54,40 @@ spec:
options:
{{- toYaml .options | nindent 4 }}
{{- end }}
{{- if .sidecars }}
sidecars:
{{- range .sidecars }}
- name: {{ .name }}
{{- $sidecarImage := .image }}
{{- if or (contains "@sha256:" $sidecarImage) (regexMatch ".*:[^/]+$" $sidecarImage) }}
image: {{ $sidecarImage }}
{{- else }}
image: {{ $sidecarImage }}:{{ .imageTag | default $.Values.defaultImageTag | default "latest" }}
{{- end }}
Comment on lines +61 to +66
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check current values for sidecar blocks that might miss "image".
# Expected: no sidecar entries without image.
rg -n -A8 -B2 'sidecars:' charts deployments

Repository: EduIDE/EduIDE-deployment

Length of output: 2961


🏁 Script executed:

#!/bin/bash
# Find all sidecar entries across all deployment values files
# Check if any sidecar is missing the image field
find deployments -name "values.yaml" -o -name "*.yaml" | xargs rg -A10 "^\s+- name:" | rg -B10 "sidecars:" | grep -E "(sidecars:|name:|image:)" | head -100

Repository: EduIDE/EduIDE-deployment

Length of output: 805


🏁 Script executed:

#!/bin/bash
# More direct: find all sidecar entries and check for missing image field
rg -n -A15 "sidecars:" deployments --type yaml | grep -E "(sidecars:|name:|image:|port:|languages:)" | head -150

Repository: EduIDE/EduIDE-deployment

Length of output: 1198


🌐 Web query:

Helm template contains function nil value behavior

💡 Result:

In Helm templates (Go text/template + Sprig), nil/null and “missing values” mainly matter in two places: field access and “emptiness” checks.

  • Accessing nested fields on a missing map/object can hard-fail with errors like nil pointer evaluating interface {} (e.g., .Values.foo.bar when foo isn’t set). This happens before functions like default can run if the evaluation of .Values.foo.bar itself panics. A common workaround is to avoid direct dot-chains and use safer access patterns (index, hasKey, etc.). [1], [2], [3]

  • default uses “empty” semantics, not “is nil” semantics. In Helm, default X Y returns X when Y is considered “empty”. “Empty” includes nil, "", 0, false, and empty lists/maps—so default true .Values.flag will override an explicitly-set false. [4], [5]

  • required fails on empty values using the same emptiness rules (so it fails for nil, "", etc.). [4]

Practical patterns

  • Prefer index/hasKey when a parent key may not exist (avoids nil-pointer evaluation). [3]
  • Use default only when you truly want “empty/false/0” to be treated as “unset”; otherwise handle booleans and zeros explicitly. [5]
  • If you expected default to protect you from missing intermediate objects, it won’t in cases where the intermediate lookup panics (this is a known/recurring issue pattern). [2]

Sources: Helm function docs and guides on default/empty/required, plus community reports on nil-pointer evaluation and default not preventing it in missing-parent scenarios. [1], [2], [4], [5]

[1] https://helm.sh/docs/v3/chart_template_guide/functions_and_pipelines/
[2] helm/helm#8026
[3] https://stackoverflow.com/questions/59571842/helm-charts-how-do-i-use-default-on-undefined-object-property-values
[4] https://blog.helm.sh/docs/chart_template_guide/function_list/
[5] https://stackoverflow.com/questions/74257084/how-to-pass-false-value-to-helm-default


🌐 Web query:

Helm regexMatch function nil value error handling

💡 Result:

In Helm, regexMatch (Sprig) expects its second argument to be a string; if the value is nil (or a non-string type), template rendering fails (often as invalid value; expected string). Also, regexMatch can panic on problems, while mustRegexMatch reports an error back to the template engine. [1]

Safe patterns

1) Default nil to an empty string (most common)

{{- $s := default "" .Values.someValue -}}
{{- if regexMatch "^foo" $s -}}
...
{{- end -}}

This ensures regexMatch always receives a string.

2) Guard the call (short-circuit)

{{- if and .Values.someValue (regexMatch "^foo" .Values.someValue) -}}
...
{{- end -}}

Only runs regexMatch when the value is non-empty/non-nil.

3) If the value is nested and parent maps may be missing, don’t dot-walk directly
Dot-walking like .Values.a.b.c can error before default runs if a/b is missing; instead, default intermediate maps first: [2]

{{- $a := default dict .Values.a -}}
{{- $b := default dict $a.b -}}
{{- $s := default "" $b.c -}}
{{- if regexMatch "^foo" $s -}} ... {{- end -}}

4) Use hasKey before accessing missing parents (alternative)

{{- if hasKey .Values "a" -}}
  {{- /* then safely read .Values.a ... */ -}}
{{- end -}}

This avoids nil-pointer-style failures when parent keys don’t exist. [3]

Sources: Sprig string/regex function docs [1]; Helm templating nil/default handling examples on missing nested keys [2], [3].


Add explicit validation for required sidecar image.

The contains and regexMatch functions expect string values and will fail with unclear errors if sidecars[].image is missing. Use required to catch missing images early with a clear failure message.

Suggested diff
-      {{- $sidecarImage := .image }}
+      {{- $sidecarImage := required "sidecars[].image is required" .image }}
       {{- if or (contains "@sha256:" $sidecarImage) (regexMatch ".*:[^/]+$" $sidecarImage) }}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@charts/theia-appdefinitions/templates/appdefinition.yaml` around lines 61 -
66, The template should explicitly validate that each sidecar image string is
present before calling contains/regexMatch: change the assignment of
$sidecarImage to use the required function (e.g., set $sidecarImage := required
"missing sidecar image for sidecar <name or index>" .image) so a clear failure
occurs if .image is absent; keep the existing image tag logic that checks
contains "@sha256:" and regexMatch and still appends .imageTag | default
$.Values.defaultImageTag | default "latest" when appropriate. Ensure the
required message is descriptive (mention sidecar name or index) and reference
$sidecarImage, .image, and .imageTag in the fix.

port: {{ .port | default 5000 }}
{{- if .languages }}
languages:
{{- range .languages }}
- {{ . }}
{{- end }}
{{- end }}
{{- if .cpuLimit }}
cpuLimit: {{ .cpuLimit }}
{{- end }}
{{- if .memoryLimit }}
memoryLimit: {{ .memoryLimit }}
{{- end }}
{{- if .cpuRequest }}
cpuRequest: {{ .cpuRequest }}
{{- end }}
{{- if .memoryRequest }}
memoryRequest: {{ .memoryRequest }}
{{- end }}
{{- if hasKey . "mountWorkspace" }}
mountWorkspace: {{ .mountWorkspace }}
{{- else }}
mountWorkspace: true
{{- end }}
{{- end }}
{{- end }}
{{- end }}
2 changes: 1 addition & 1 deletion charts/theia-cloud-combined/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ theia-appdefinitions:
theia-workspace-garbage-collector:
replicaCount: 1
image:
repository: ghcr.io/eduide/eduide/garbage-collector
repository: ghcr.io/eduide/garbage-collector
tag: latest
Comment on lines 154 to 157
pullPolicy: Always

Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
# -- The cluster issuer to use for the certificate
clusterIssuer: theia-cloud-selfsigned-issuer

conversion:
image: ghcr.io/eduide/eduide-cloud/conversion-webhook:pr-70
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
# -- The cluster issuer to use for the certificate
clusterIssuer: theia-cloud-selfsigned-issuer

conversion:
image: ghcr.io/eduide/eduide-cloud/conversion-webhook:pr-70
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
# -- The cluster issuer to use for the certificate
clusterIssuer: theia-cloud-selfsigned-issuer

conversion:
image: ghcr.io/eduide/eduide-cloud/conversion-webhook:pr-70
53 changes: 29 additions & 24 deletions deployments/test3.theia-test.artemis.cit.tum.de/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ theia-cloud:
#eagerStart: false
replicas: 1
sessionsPerUser: 10
storageClassName: csi-rbd-sc
storageClassName: longhorn
resources:
requests:
ephemeral-storage: "128Mi"
Expand All @@ -69,8 +69,10 @@ theia-cloud:
- ghcr.io/eduide/eduide/ocaml:latest
- ghcr.io/eduide/eduide/rust:latest
- ghcr.io/eduide/eduide/python:latest
- ghcr.io/eduide/eduide/theia-no-ls:pr-46
- ghcr.io/eduide/eduide/langserver-java:pr-46
- ghcr.io/eduide/eduide/java-17-no-ls:latest
- ghcr.io/eduide/eduide/rust-no-ls:latest
- ghcr.io/eduide/eduide/langserver-java:latest
- ghcr.io/eduide/eduide/langserver-rust:latest

imagePullPolicy: Always

Expand All @@ -90,25 +92,15 @@ theia-cloud:
# 2. (Optional) If you removed the 'hardcoded png' logic in the template,
# you might need this. If you used my simplified template, this is ignored.
logoFileExtension: "png"
appDefinition: "java-17-latest"
appDefinition: "java-17-no-ls"
ephemeralStorage: true
additionalApps:
java-17-latest:
label: Java 17
c-latest:
label: C
javascript-latest:
label: Javascript
ocaml-latest:
label: Ocaml
python-latest:
label: Python
rust-latest:
label: Rust
java-ls-test:
label: Java LS Test
java-17-no-ls:
label: Java 17 No-LS (Sidecar)
rust-no-ls:
label: Rust No-LS (Sidecar)
infoTitle: "🚀 Welcome to Test3 IDE Environment"
infoText: "This is a testing environment for Theia Cloud. Select your programming language and start coding in seconds!"
infoText: "Test environment for Theia with external language server architecture (PR #70). The IDE runs separately from the language server for improved performance and modularity."
Comment on lines 102 to +103
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Drop the internal PR reference from the landing-page copy.

PR #70`` is user-visible here, but it is internal context and will go stale quickly.

Suggested wording
-    infoText: "Test environment for Theia with external language server architecture (PR `#70`). The IDE runs separately from the language server for improved performance and modularity."
+    infoText: "Test environment for Theia with external language server architecture. The IDE runs separately from the language server for improved performance and modularity."
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
infoTitle: "🚀 Welcome to Test3 IDE Environment"
infoText: "This is a testing environment for Theia Cloud. Select your programming language and start coding in seconds!"
infoText: "Test environment for Theia with external language server architecture (PR #70). The IDE runs separately from the language server for improved performance and modularity."
infoTitle: "🚀 Welcome to Test3 IDE Environment"
infoText: "Test environment for Theia with external language server architecture. The IDE runs separately from the language server for improved performance and modularity."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@deployments/test3.theia-test.artemis.cit.tum.de/values.yaml` around lines 102
- 103, Update the landing-page copy by removing the internal PR reference from
the infoText value: edit the infoText string that currently contains "PR `#70`" so
it reads without the PR mention (e.g., "Test environment for Theia with external
language server architecture. The IDE runs separately from the language server
for improved performance and modularity."), leaving infoTitle unchanged.

loadingText: "⚡ Setting up your development workspace..."
footerLinks:
attribution:
Expand Down Expand Up @@ -139,11 +131,24 @@ theia-cloud:

theia-appdefinitions:
apps:
- name: java-ls-test
image: ghcr.io/eduide/eduide/theia-no-ls
imageTag: pr-46
options:
langserver-image: ghcr.io/eduide/eduide/langserver-java:pr-46
- name: java-17-no-ls
image: ghcr.io/eduide/eduide/java-17-no-ls
minInstances: 1
sidecars:
- name: langserver
image: ghcr.io/eduide/eduide/langserver-java
port: 5000
languages: [java]
Comment on lines 132 to +141
mountWorkspace: true
- name: rust-no-ls
image: ghcr.io/eduide/eduide/rust-no-ls
minInstances: 1
sidecars:
- name: langserver
image: ghcr.io/eduide/eduide/langserver-rust
port: 5000
languages: [rust]
mountWorkspace: true

monitoring:
targetNamespaces:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
# -- The cluster issuer to use for the certificate
clusterIssuer: theia-cloud-selfsigned-issuer

conversion:
image: ghcr.io/eduide/eduide-cloud/conversion-webhook:pr-70
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
# -- The cluster issuer to use for the certificate
clusterIssuer: theia-cloud-selfsigned-issuer
clusterIssuer: theia-cloud-selfsigned-issuer

conversion:
image: ghcr.io/eduide/eduide-cloud/conversion-webhook:pr-70
Comment on lines +4 to +5
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify where PR-scoped conversion webhook tags are committed.
# Expected for long-lived envs: no pr-* tags.
rg -nP 'conversion-webhook:pr-\d+' deployments

Repository: EduIDE/EduIDE-deployment

Length of output: 748


Avoid PR-scoped image tags in deployment manifests.

Using :pr-70 makes deployments dependent on a potentially ephemeral CI artifact. This tag pattern appears across multiple environments (production, staging, test). Replace with an immutable release tag or digest for reproducibility and stability.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@deployments/theia.artemis.cit.tum.de/theia-crds-helm-values.yml` around lines
4 - 5, The manifest uses a PR-scoped image tag in the conversion.image field
(ghcr.io/eduide/eduide-cloud/conversion-webhook:pr-70); replace this ephemeral
tag with an immutable release tag or digest (e.g., a semantically versioned tag
or sha256 digest) so deployments are reproducible and stable across
environments, update any other occurrences of :pr-* in your helm values to the
chosen release tag/digest, and ensure the CI/CD pipeline and imagePullSecrets
(if any) are updated accordingly.

Loading