diff --git a/.gitpod.yml b/.gitpod.yml
index 14e29d0366d523..ca29baff5ce643 100644
--- a/.gitpod.yml
+++ b/.gitpod.yml
@@ -51,8 +51,8 @@ tasks:
if [ -z "$RUN_GRADLE_TASK" ]; then
read -r -p "Press enter to continue Java gradle task"
fi
- leeway exec --package components/supervisor-api/java:lib --package components/gitpod-protocol/java:lib -- ./gradlew --build-cache build
- leeway exec --package components/ide/jetbrains/backend-plugin:plugin-latest --package components/ide/jetbrains/gateway-plugin:publish --parallel -- ./gradlew --build-cache buildPlugin
+ leeway exec --package components/supervisor-api/java:lib --package components/gitpod-protocol/java:lib -- ./gradlew build
+ leeway exec --package components/ide/jetbrains/backend-plugin:plugin-latest --package components/ide/jetbrains/gateway-plugin:publish --parallel -- ./gradlew buildPlugin
- name: TypeScript
before: scripts/branch-namespace.sh
init: yarn --network-timeout 100000 && yarn build
diff --git a/WORKSPACE.yaml b/WORKSPACE.yaml
index 597a7ad3ab7bae..f73c0216dd1149 100644
--- a/WORKSPACE.yaml
+++ b/WORKSPACE.yaml
@@ -9,6 +9,7 @@ defaultArgs:
localAppVersion: unknown
codeCommit: ca48b16256fad72bc239a27bde3dc78a369aafa6
codeQuality: stable
+ noVerifyJBPlugin: false
intellijDownloadUrl: "https://download.jetbrains.com/idea/ideaIU-2022.2.1.tar.gz"
golandDownloadUrl: "https://download.jetbrains.com/go/goland-2022.2.2.tar.gz"
pycharmDownloadUrl: "https://download.jetbrains.com/python/pycharm-professional-2022.2.1.tar.gz"
diff --git a/components/BUILD.yaml b/components/BUILD.yaml
index 7b411dce8034f6..4c13418334fe50 100644
--- a/components/BUILD.yaml
+++ b/components/BUILD.yaml
@@ -41,6 +41,8 @@ packages:
- components/ide/code-desktop:docker
- components/ide/code-desktop:docker-insiders
- components/ide/code:docker
+ - components/ide/jetbrains/backend-plugin:stable
+ - components/ide/jetbrains/backend-plugin:latest
- components/ide/jetbrains/image:goland
- components/ide/jetbrains/image:goland-latest
- components/ide/jetbrains/image:intellij
diff --git a/components/gitpod-protocol/java/gradle.properties b/components/gitpod-protocol/java/gradle.properties
index 44a0d9b99d77f7..c27a34d8703ceb 100644
--- a/components/gitpod-protocol/java/gradle.properties
+++ b/components/gitpod-protocol/java/gradle.properties
@@ -1,3 +1,5 @@
# See https://stackoverflow.com/a/47607857/961588
systemProp.org.gradle.internal.http.socketTimeout=100000
-systemProp.org.gradle.internal.http.connectionTimeout=100000
\ No newline at end of file
+systemProp.org.gradle.internal.http.connectionTimeout=100000
+# See https://docs.gradle.org/current/userguide/build_cache.html#sec:build_cache_enable
+org.gradle.caching=true
diff --git a/components/ide/jetbrains/backend-plugin/BUILD.yaml b/components/ide/jetbrains/backend-plugin/BUILD.yaml
index c9fc136a08eccb..3f886363123513 100644
--- a/components/ide/jetbrains/backend-plugin/BUILD.yaml
+++ b/components/ide/jetbrains/backend-plugin/BUILD.yaml
@@ -1,6 +1,46 @@
packages:
+ - name: docker
+ type: generic
+ argdeps:
+ - version
+ deps:
+ - :stable
+ - :latest
+ - name: stable
+ type: docker
+ deps:
+ - :plugin-stable
+ argdeps:
+ - imageRepoBase
+ - version
+ config:
+ dockerfile: leeway.Dockerfile
+ metadata:
+ helm-component: workspace.desktopIdeImages.jbBackendPlugin
+ buildArgs:
+ JETBRAINS_BACKEND_QUALIFIER: stable
+ image:
+ - ${imageRepoBase}/ide/jb-backend-plugin:commit-${__git_commit}
+ - name: latest
+ type: docker
+ deps:
+ - :plugin-latest
+ argdeps:
+ - imageRepoBase
+ - version
+ config:
+ dockerfile: leeway.Dockerfile
+ metadata:
+ helm-component: workspace.desktopIdeImages.jbBackendPluginLatest
+ buildArgs:
+ JETBRAINS_BACKEND_QUALIFIER: latest
+ image:
+ - ${imageRepoBase}/ide/jb-backend-plugin:${version}
+ - ${imageRepoBase}/ide/jb-backend-plugin:commit-${__git_commit}-latest
- name: plugin-stable
type: generic
+ argdeps:
+ - noVerifyJBPlugin
deps:
- components/supervisor-api/java:lib
- components/gitpod-protocol/java:lib
@@ -14,13 +54,17 @@ packages:
- "settings.gradle.kts"
- "src/main/resources/*"
- "src/main/resources-stable/*"
+ - "build.sh"
+ env:
+ - JB_QUALIFIER=stable
+ - NO_VERIFY_JB_PLUGIN=${noVerifyJBPlugin}
config:
commands:
- - ["./gradlew", "-PsupervisorApiProjectPath=components-supervisor-api-java--lib/", "-PgitpodProtocolProjectPath=components-gitpod-protocol-java--lib/", "-PenvironmentName=stable", "runPluginVerifier"]
- - ["./gradlew", "-PsupervisorApiProjectPath=components-supervisor-api-java--lib/", "-PgitpodProtocolProjectPath=components-gitpod-protocol-java--lib/", "-PenvironmentName=stable", "buildPlugin"]
- - ["unzip", "./build/distributions/gitpod-remote-0.0.1.zip", "-d", "./build"]
+ - ["./build.sh"]
- name: plugin-latest
type: generic
+ argdeps:
+ - noVerifyJBPlugin
deps:
- components/supervisor-api/java:lib
- components/gitpod-protocol/java:lib
@@ -34,8 +78,10 @@ packages:
- "settings.gradle.kts"
- "src/main/resources/*"
- "src/main/resources-latest/*"
+ - "build.sh"
+ env:
+ - JB_QUALIFIER=latest
+ - NO_VERIFY_JB_PLUGIN=${noVerifyJBPlugin}
config:
commands:
- - ["./gradlew", "-PsupervisorApiProjectPath=components-supervisor-api-java--lib/", "-PgitpodProtocolProjectPath=components-gitpod-protocol-java--lib/", "-PenvironmentName=latest", "runPluginVerifier"]
- - ["./gradlew", "-PsupervisorApiProjectPath=components-supervisor-api-java--lib/", "-PgitpodProtocolProjectPath=components-gitpod-protocol-java--lib/", "-PenvironmentName=latest", "buildPlugin"]
- - ["unzip", "./build/distributions/gitpod-remote-0.0.1.zip", "-d", "./build"]
+ - ["./build.sh"]
diff --git a/components/ide/jetbrains/backend-plugin/README.md b/components/ide/jetbrains/backend-plugin/README.md
index dc6ed902a7eabe..cda12c894be97a 100644
--- a/components/ide/jetbrains/backend-plugin/README.md
+++ b/components/ide/jetbrains/backend-plugin/README.md
@@ -8,13 +8,15 @@ Provides integrations within a Gitpod workspace.
## Development
Please make sure to enable IntelliJ in gitpod.io preferences: https://gitpod.io/preferences
-IntelliJ delivers better experience for development of JetBrains plugins. We should as well use it for dogfooding. If
-you experience any issues with JetBrains remote dev make sure to report
+IntelliJ delivers better experience for development of JetBrains plugins. We should as well use it for dogfooding. If you experience any issues with JetBrains remote dev make sure to report
issues [here](https://youtrack.jetbrains.com/issues?q=project:%20CWM)
under remote development subsystem.
-Usually you will need to create a preview environments to try your changes, but if your changes don't touch any other
-components beside the backend plugin then you can test against the running workspace:
+
+
+### Local
+
+Usually you will need to create a preview environments to try your changes, but if your changes don't touch any other components beside the backend plugin then you can test against the running workspace:
- Launch `./launch-dev-server.sh` from `components/ide/jetbrains/backend-plugin`. It builds the backend plugin, and
start another JB backend in the remote debug mode with it against sprint-petclinic project and services of a running
@@ -43,3 +45,25 @@ Listening for transport dt_socket at address: 54963
for now each thin client is accompanied by another window (main) which directly renders UI from backend. Sometimes
there are bugs when a file will be opened in this window instead of the thin client. It also can be that
the main window is not visible then try to find it in the left top corner and resize. It looks almost like a line.
+
+### Hot deployment
+
+Run `./hot-deploy.sh (latest|stable)` to build and publish the backend plugin image from your dev workspace and
+update the IDE config map in a preview environment. After that start a new workspace in preview environment
+with corresponding version to try your changes.
+
+### Hot swapping
+
+Run `./hot-swap.sh ` to build a new backend plugin version corresponding to a workspace running in preview environment,
+install a new version in such workspace and restart the JB backend. Reconnect to the restarted JB backend to try new changes.
+
+If you need to change the startup endpoint then run to hot swap it too:
+```bash
+leeway build components/ide/jetbrains/image/status:hot-swap -DworkspaceUrl=
+```
+
+### Remote debugging
+
+Run `./remote-debug.sh ()?` to configure remote debugging in a workpace running in preview environment.
+It will configure remote debug port, restart the backend and start port forwarding in your dev workspace.
+Create a new `Remote JVM Debug` launch configuration with the forwarded port and launch it.
diff --git a/components/ide/jetbrains/backend-plugin/build.gradle.kts b/components/ide/jetbrains/backend-plugin/build.gradle.kts
index bc1866b9c828ce..050cd2af3a3028 100644
--- a/components/ide/jetbrains/backend-plugin/build.gradle.kts
+++ b/components/ide/jetbrains/backend-plugin/build.gradle.kts
@@ -23,9 +23,12 @@ plugins {
}
group = properties("pluginGroup")
-version = properties("version")
+var pluginVersion = properties("pluginVersion")
val environmentName = properties("environmentName")
+if (!environmentName.isNullOrBlank()) {
+ pluginVersion += "-" + environmentName
+}
project(":") {
kotlin {
@@ -117,4 +120,8 @@ tasks {
runPluginVerifier {
ideVersions.set(properties("pluginVerifierIdeVersions").split(',').map(String::trim).filter(String::isNotEmpty))
}
+
+ patchPluginXml {
+ version.set(pluginVersion)
+ }
}
diff --git a/components/ide/jetbrains/backend-plugin/build.sh b/components/ide/jetbrains/backend-plugin/build.sh
new file mode 100755
index 00000000000000..4429c3013b1a50
--- /dev/null
+++ b/components/ide/jetbrains/backend-plugin/build.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+# Copyright (c) 2022 Gitpod GmbH. All rights reserved.
+# Licensed under the GNU Affero General Public License (AGPL).
+# See License-AGPL.txt in the project root for license information.
+
+if [ "${NO_VERIFY_JB_PLUGIN}" == "true" ]; then
+ echo "build.sh: skip verify plugin step"
+else
+ ./gradlew -PsupervisorApiProjectPath=components-supervisor-api-java--lib/ -PgitpodProtocolProjectPath=components-gitpod-protocol-java--lib/ -PenvironmentName="$JB_QUALIFIER" runPluginVerifier
+fi
+./gradlew -PsupervisorApiProjectPath=components-supervisor-api-java--lib/ -PgitpodProtocolProjectPath=components-gitpod-protocol-java--lib/ -PenvironmentName="$JB_QUALIFIER" buildPlugin
+unzip ./build/distributions/gitpod-remote.zip -d ./build
diff --git a/components/ide/jetbrains/backend-plugin/gradle.properties b/components/ide/jetbrains/backend-plugin/gradle.properties
index 2cbce2c7b77a77..42f3ce9adef124 100644
--- a/components/ide/jetbrains/backend-plugin/gradle.properties
+++ b/components/ide/jetbrains/backend-plugin/gradle.properties
@@ -1,4 +1,4 @@
-version=0.0.1
+pluginVersion=0.0.1
# Supported environments: stable, latest (via https://github.com/stevesaliman/gradle-properties-plugin)
environmentName=latest
# IntelliJ Platform Artifacts Repositories
@@ -19,3 +19,5 @@ gitpodProtocolProjectPath=../../../gitpod-protocol/java
# See https://stackoverflow.com/a/47607857/961588
systemProp.org.gradle.internal.http.socketTimeout=100000
systemProp.org.gradle.internal.http.connectionTimeout=100000
+# See https://docs.gradle.org/current/userguide/build_cache.html#sec:build_cache_enable
+org.gradle.caching=true
diff --git a/components/ide/jetbrains/backend-plugin/hot-deploy.sh b/components/ide/jetbrains/backend-plugin/hot-deploy.sh
new file mode 100755
index 00000000000000..d3c3cc6b2875a2
--- /dev/null
+++ b/components/ide/jetbrains/backend-plugin/hot-deploy.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+# Copyright (c) 2022 Gitpod GmbH. All rights reserved.
+# Licensed under the GNU Affero General Public License (AGPL).
+# See License-AGPL.txt in the project root for license information.
+
+set -Eeuo pipefail
+
+# This script builds the backend plugin and updates the IDE config map.
+
+qualifier=${1:-latest}
+echo "Plugin Qualifier: $qualifier"
+
+# TODO(AK) optimize to produce a new version only if plugin was rebuilt
+version="dev-jb-backend-plugin-$(date +%F_T"%H-%M-%S")"
+echo "Image Version: $version"
+
+bldfn="/tmp/build-$version.tar.gz"
+
+docker ps &> /dev/null || (echo "You need a working Docker daemon. Maybe set DOCKER_HOST?"; exit 1)
+leeway build -DnoVerifyJBPlugin=true -Dversion="$version" -DimageRepoBase=eu.gcr.io/gitpod-core-dev/build .:"$qualifier" --save "$bldfn"
+dev_image="$(tar xfO "$bldfn" ./imgnames.txt | head -n1)"
+echo "Dev Image: $dev_image"
+
+if [ "$qualifier" == "stable" ]; then
+ prop="pluginImage"
+else
+ prop="pluginLatestImage"
+fi
+
+cf_patch=$(kubectl get cm server-ide-config -o=json | jq '.data."config.json"' |jq -r)
+cf_patch=$(echo "$cf_patch" |jq ".ideOptions.options.intellij.$prop = \"$dev_image\"")
+cf_patch=$(echo "$cf_patch" |jq ".ideOptions.options.goland.$prop = \"$dev_image\"")
+cf_patch=$(echo "$cf_patch" |jq ".ideOptions.options.pycharm.$prop = \"$dev_image\"")
+cf_patch=$(echo "$cf_patch" |jq ".ideOptions.options.phpstorm.$prop = \"$dev_image\"")
+cf_patch=$(echo "$cf_patch" |jq tostring)
+cf_patch="{\"data\": {\"config.json\": $cf_patch}}"
+
+kubectl patch cm server-ide-config --type=merge -p "$cf_patch"
diff --git a/components/ide/jetbrains/backend-plugin/hot-swap.sh b/components/ide/jetbrains/backend-plugin/hot-swap.sh
new file mode 100755
index 00000000000000..f1499def05a02c
--- /dev/null
+++ b/components/ide/jetbrains/backend-plugin/hot-swap.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+# Copyright (c) 2022 Gitpod GmbH. All rights reserved.
+# Licensed under the GNU Affero General Public License (AGPL).
+# See License-AGPL.txt in the project root for license information.
+
+set -Eeuo pipefail
+
+# This script builds the backend plugin, replaces the backend plugin on a running workspace and restarts the JB backend.
+
+workspaceUrl=${1-}
+[ -z "$workspaceUrl" ] && echo "Please provide a workspace URL as first argument." && exit 1
+workspaceUrl=$(echo "$workspaceUrl" |sed -e "s/\/$//")
+echo "URL: $workspaceUrl"
+
+workspaceDesc=$(gpctl workspaces describe "$workspaceUrl" -o=json)
+
+podName=$(echo "$workspaceDesc" | jq .runtime.pod_name -r)
+echo "Pod: $podName"
+
+workspaceId=$(echo "$workspaceDesc" | jq .metadata.meta_id -r)
+echo "ID: $workspaceId"
+
+clusterHost=$(kubectl exec -it "$podName" -- printenv GITPOD_WORKSPACE_CLUSTER_HOST |sed -e "s/\s//g")
+echo "Cluster Host: $clusterHost"
+
+qualifier=$(kubectl exec -it "$podName" -- printenv JETBRAINS_BACKEND_QUALIFIER |sed -e "s/\s//g")
+echo "Version Qualifier: $qualifier"
+
+# prepare build
+component="gitpod-remote-$qualifier-$(date +%F_T"%H-%M-%S")"
+tarDir="/tmp/hot-swap/$component"
+mkdir -p "$tarDir"
+echo "Build Dir: $tarDir"
+
+# prepare ssh
+ownerToken=$(kubectl get pod "$podName" -o=json | jq ".metadata.annotations.\"gitpod\/ownerToken\"" -r)
+sshConfig="$tarDir/ssh-config"
+echo "Host $workspaceId" > "$sshConfig"
+echo " Hostname \"$workspaceId.ssh.$clusterHost\"" >> "$sshConfig"
+echo " User \"$workspaceId#$ownerToken\"" >> "$sshConfig"
+
+# build
+tarFile="$tarDir/build.tar.gz"
+leeway build -DnoVerifyJBPlugin=true .:"plugin-$qualifier" --save "$tarFile"
+tar -xf "$tarFile" -C "$tarDir"
+
+# upload
+uploadDest="/ide-desktop-plugins/$component"
+echo "Upload Dest: $uploadDest"
+scp -F "$sshConfig" -r "$tarDir/build/gitpod-remote" "$workspaceId":"$uploadDest"
+
+# link
+link="/ide-desktop/backend/plugins/gitpod-remote"
+ssh -F "$sshConfig" "$workspaceId" ln -sfn "$uploadDest" "$link"
+echo "Link: $link -> $uploadDest"
+
+# restart
+ssh -F "$sshConfig" "$workspaceId" curl http://localhost:24000/restart
+echo "Restarted: please reconenct to JB backend to try new changes."
+
+# clean up
+rm -rf "$tarDir"
diff --git a/components/ide/jetbrains/backend-plugin/leeway.Dockerfile b/components/ide/jetbrains/backend-plugin/leeway.Dockerfile
new file mode 100644
index 00000000000000..753c893f1fb83f
--- /dev/null
+++ b/components/ide/jetbrains/backend-plugin/leeway.Dockerfile
@@ -0,0 +1,14 @@
+# Copyright (c) 2021 Gitpod GmbH. All rights reserved.
+# Licensed under the GNU Affero General Public License (AGPL).
+# See License-AGPL.txt in the project root for license information.
+
+FROM alpine:3.16 as base_builder
+RUN mkdir /ide-desktop-plugins
+
+# for debugging
+# FROM alpine:3.16
+FROM scratch
+ARG JETBRAINS_BACKEND_QUALIFIER
+# ensures right permissions for /ide-desktop-plugins
+COPY --from=base_builder --chown=33333:33333 /ide-desktop-plugins/ /ide-desktop-plugins/
+COPY --chown=33333:33333 components-ide-jetbrains-backend-plugin--plugin-${JETBRAINS_BACKEND_QUALIFIER}/build/gitpod-remote /ide-desktop-plugins/gitpod-remote/
diff --git a/components/ide/jetbrains/backend-plugin/remote-debug.sh b/components/ide/jetbrains/backend-plugin/remote-debug.sh
new file mode 100755
index 00000000000000..36a81c899906dd
--- /dev/null
+++ b/components/ide/jetbrains/backend-plugin/remote-debug.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+# Copyright (c) 2022 Gitpod GmbH. All rights reserved.
+# Licensed under the GNU Affero General Public License (AGPL).
+# See License-AGPL.txt in the project root for license information.
+
+# This script configure remote debugging in a workspace running in a preview environment.
+# It updates VM options with remote debug agent, restart the JB backend to apply them,
+# and start port forwarding of the remote debug port. You can configure `Remote JVM Debug`
+# run configuration using the forwarded port.
+#
+# ./remote-debug.sh ()?
+
+workspaceUrl=${1-}
+[ -z "$workspaceUrl" ] && echo "Please provide a workspace URL as first argument." && exit 1
+workspaceUrl=$(echo "$workspaceUrl" |sed -e "s/\/$//")
+echo "URL: $workspaceUrl"
+
+workspaceDesc=$(gpctl workspaces describe "$workspaceUrl" -o=json)
+
+podName=$(echo "$workspaceDesc" | jq .runtime.pod_name -r)
+echo "Pod: $podName"
+
+workspaceId=$(echo "$workspaceDesc" | jq .metadata.meta_id -r)
+echo "ID: $workspaceId"
+
+clusterHost=$(kubectl exec -it "$podName" -- printenv GITPOD_WORKSPACE_CLUSTER_HOST |sed -e "s/\s//g")
+echo "Cluster Host: $clusterHost"
+
+# prepare ssh
+ownerToken=$(kubectl get pod "$podName" -o=json | jq ".metadata.annotations.\"gitpod\/ownerToken\"" -r)
+sshConfig="/tmp/$workspaceId-ssh-config"
+echo "Host $workspaceId" > "$sshConfig"
+echo " Hostname \"$workspaceId.ssh.$clusterHost\"" >> "$sshConfig"
+echo " User \"$workspaceId#$ownerToken\"" >> "$sshConfig"
+
+while true
+do
+ # configure remote debugging
+ remotePort=$(ssh -F "$sshConfig" "$workspaceId" curl http://localhost:24000/debug)
+ if [ -n "$remotePort" ]; then
+ localPort=${2-$remotePort}
+ # forward
+ echo "Forwarding Debug Port: $localPort -> $remotePort"
+ ssh -F "$sshConfig" -L "$remotePort:localhost:$localPort" "$workspaceId" -N
+ fi
+
+ sleep 1
+done
diff --git a/components/ide/jetbrains/image/BUILD.yaml b/components/ide/jetbrains/image/BUILD.yaml
index cc21682b5d03d3..1ac8e7e8fc196c 100644
--- a/components/ide/jetbrains/image/BUILD.yaml
+++ b/components/ide/jetbrains/image/BUILD.yaml
@@ -18,7 +18,6 @@ packages:
- "startup.sh"
- "supervisor-ide-config_intellij.json"
deps:
- - components/ide/jetbrains/backend-plugin:plugin-stable
- components/ide/jetbrains/image/status:app
- components/ide/jetbrains/image/download:intellij
- components/ide/jetbrains/cli:app
@@ -40,7 +39,6 @@ packages:
- "startup.sh"
- "supervisor-ide-config_intellij.json"
deps:
- - components/ide/jetbrains/backend-plugin:plugin-latest
- components/ide/jetbrains/image/status:app
- components/ide/jetbrains/image/download:intellij-latest
- components/ide/jetbrains/cli:app
@@ -63,7 +61,6 @@ packages:
- "startup.sh"
- "supervisor-ide-config_goland.json"
deps:
- - components/ide/jetbrains/backend-plugin:plugin-stable
- components/ide/jetbrains/image/status:app
- components/ide/jetbrains/image/download:goland
- components/ide/jetbrains/cli:app
@@ -85,7 +82,6 @@ packages:
- "startup.sh"
- "supervisor-ide-config_goland.json"
deps:
- - components/ide/jetbrains/backend-plugin:plugin-latest
- components/ide/jetbrains/image/status:app
- components/ide/jetbrains/image/download:goland-latest
- components/ide/jetbrains/cli:app
@@ -108,7 +104,6 @@ packages:
- "startup.sh"
- "supervisor-ide-config_pycharm.json"
deps:
- - components/ide/jetbrains/backend-plugin:plugin-stable
- components/ide/jetbrains/image/status:app
- components/ide/jetbrains/image/download:pycharm
- components/ide/jetbrains/cli:app
@@ -130,7 +125,6 @@ packages:
- "startup.sh"
- "supervisor-ide-config_pycharm.json"
deps:
- - components/ide/jetbrains/backend-plugin:plugin-latest
- components/ide/jetbrains/image/status:app
- components/ide/jetbrains/image/download:pycharm-latest
- components/ide/jetbrains/cli:app
@@ -153,7 +147,6 @@ packages:
- "startup.sh"
- "supervisor-ide-config_phpstorm.json"
deps:
- - components/ide/jetbrains/backend-plugin:plugin-stable
- components/ide/jetbrains/image/status:app
- components/ide/jetbrains/image/download:phpstorm
- components/ide/jetbrains/cli:app
@@ -175,7 +168,6 @@ packages:
- "startup.sh"
- "supervisor-ide-config_phpstorm.json"
deps:
- - components/ide/jetbrains/backend-plugin:plugin-latest
- components/ide/jetbrains/image/status:app
- components/ide/jetbrains/image/download:phpstorm-latest
- components/ide/jetbrains/cli:app
diff --git a/components/ide/jetbrains/image/leeway.Dockerfile b/components/ide/jetbrains/image/leeway.Dockerfile
index b4886003d45f5f..2721f50574687c 100644
--- a/components/ide/jetbrains/image/leeway.Dockerfile
+++ b/components/ide/jetbrains/image/leeway.Dockerfile
@@ -2,16 +2,20 @@
# Licensed under the GNU Affero General Public License (AGPL).
# See License-AGPL.txt in the project root for license information.
+FROM alpine:3.16 as base_builder
+RUN mkdir /ide-desktop
+
# for debugging
# FROM alpine:3.16
FROM scratch
ARG JETBRAINS_DOWNLOAD_QUALIFIER
ARG JETBRAINS_BACKEND_QUALIFIER
ARG SUPERVISOR_IDE_CONFIG
+# ensures right permissions for /ide-desktop
+COPY --from=base_builder --chown=33333:33333 /ide-desktop/ /ide-desktop/
COPY --chown=33333:33333 ${SUPERVISOR_IDE_CONFIG} /ide-desktop/supervisor-ide-config.json
COPY --chown=33333:33333 startup.sh /ide-desktop/
COPY --chown=33333:33333 components-ide-jetbrains-image-download--${JETBRAINS_DOWNLOAD_QUALIFIER}/backend /ide-desktop/backend
-COPY --chown=33333:33333 components-ide-jetbrains-backend-plugin--plugin-${JETBRAINS_BACKEND_QUALIFIER}/build/gitpod-remote /ide-desktop/backend/plugins/gitpod-remote
COPY --chown=33333:33333 components-ide-jetbrains-image-status--app/status /ide-desktop
ARG JETBRAINS_BACKEND_QUALIFIER
diff --git a/components/ide/jetbrains/image/status/BUILD.yaml b/components/ide/jetbrains/image/status/BUILD.yaml
index 7eb5275fad8b51..dd5b36b4c200c0 100644
--- a/components/ide/jetbrains/image/status/BUILD.yaml
+++ b/components/ide/jetbrains/image/status/BUILD.yaml
@@ -16,3 +16,14 @@ packages:
config:
packaging: app
buildCommand: ["go", "build", "-trimpath", "-ldflags", "-buildid= -w -s -X 'github.com/gitpod-io/gitpod/jetbrains/status.Version=commit-${__git_commit}'"]
+ - name: hot-swap
+ type: generic
+ deps:
+ - :app
+ argdeps:
+ - workspaceUrl
+ srcs:
+ - "hot-swap.sh"
+ config:
+ commands:
+ - ["./hot-swap.sh", "${workspaceUrl}"]
diff --git a/components/ide/jetbrains/image/status/hot-swap.sh b/components/ide/jetbrains/image/status/hot-swap.sh
new file mode 100755
index 00000000000000..5dcb25ca718a9e
--- /dev/null
+++ b/components/ide/jetbrains/image/status/hot-swap.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+# Copyright (c) 2022 Gitpod GmbH. All rights reserved.
+# Licensed under the GNU Affero General Public License (AGPL).
+# See License-AGPL.txt in the project root for license information.
+
+set -Eeuo pipefail
+
+# This script swaps the backend startup endpoint with a built one
+# in a workspace and restarts the JB backend.
+
+component=${PWD##*/}
+workspaceUrl=$(echo "${1}" |sed -e "s/\/$//")
+echo "URL: $workspaceUrl"
+
+workspaceDesc=$(gpctl workspaces describe "$workspaceUrl" -o=json)
+
+podName=$(echo "$workspaceDesc" | jq .runtime.pod_name -r)
+echo "Pod: $podName"
+
+workspaceId=$(echo "$workspaceDesc" | jq .metadata.meta_id -r)
+echo "ID: $workspaceId"
+
+clusterHost=$(kubectl exec -it "$podName" -- printenv GITPOD_WORKSPACE_CLUSTER_HOST |sed -e "s/\s//g")
+echo "Cluster Host: $clusterHost"
+
+# prepare ssh
+ownerToken=$(kubectl get pod "$podName" -o=json | jq ".metadata.annotations.\"gitpod\/ownerToken\"" -r)
+sshConfig="./ssh-config"
+echo "Host $workspaceId" > "$sshConfig"
+echo " Hostname \"$workspaceId.ssh.$clusterHost\"" >> "$sshConfig"
+echo " User \"$workspaceId#$ownerToken\"" >> "$sshConfig"
+
+# upload
+uploadDest="/ide-desktop/$component"
+echo "Upload Dest: $uploadDest"
+scp -F "$sshConfig" -r "./components-ide-jetbrains-image-status--app/status" "$workspaceId":"$uploadDest"
+
+#link
+link="/ide-desktop/status"
+ssh -F "$sshConfig" "$workspaceId" ln -sf "$uploadDest" "$link"
+echo "Link: $link -> $uploadDest"
+
+# restart
+ssh -F "$sshConfig" "$workspaceId" curl http://localhost:24000/restart && true
+echo "Restarted: please reconenct to JB backend to try new changes."
diff --git a/components/ide/jetbrains/image/status/main.go b/components/ide/jetbrains/image/status/main.go
index c3e6eeac532c7b..d134a31a464096 100644
--- a/components/ide/jetbrains/image/status/main.go
+++ b/components/ide/jetbrains/image/status/main.go
@@ -12,6 +12,7 @@ import (
"fmt"
"io"
"io/ioutil"
+ "net"
"net/http"
"net/url"
"os"
@@ -20,6 +21,7 @@ import (
"path/filepath"
"reflect"
"regexp"
+ "strconv"
"strings"
"syscall"
"time"
@@ -91,12 +93,74 @@ func main() {
}
}
- err = configureVMOptions(gitpodConfig, alias)
+ idePrefix := alias
+ if alias == "intellij" {
+ idePrefix = "idea"
+ }
+ // [idea64|goland64|pycharm64|phpstorm64].vmoptions
+ vmOptionsPath := fmt.Sprintf("/ide-desktop/backend/bin/%s64.vmoptions", idePrefix)
+
+ err = configureVMOptions(gitpodConfig, alias, vmOptionsPath)
if err != nil {
log.WithError(err).Error("failed to configure vmoptions")
}
+ err = linkRemotePlugin()
+ if err != nil {
+ log.WithError(err).Error("failed to install gitpod-remote plugin")
+ }
go run(wsInfo, alias)
+ debugAgentPrefix := "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:"
+ http.HandleFunc("/debug", func(w http.ResponseWriter, r *http.Request) {
+ options, err := readVMOptions(vmOptionsPath)
+ if err != nil {
+ log.WithError(err).Error("failed to configure debug agent")
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ debugPort := ""
+ i := len(options) - 1
+ for i >= 0 && debugPort == "" {
+ option := options[i]
+ if strings.HasPrefix(option, debugAgentPrefix) {
+ debugPort = option[len(debugAgentPrefix):]
+ if debugPort == "0" {
+ debugPort = ""
+ }
+ }
+ i--
+ }
+
+ if debugPort != "" {
+ fmt.Fprint(w, debugPort)
+ return
+ }
+ netListener, err := net.Listen("tcp", "localhost:0")
+ if err != nil {
+ log.WithError(err).Error("failed to configure debug agent")
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ debugPort = strconv.Itoa(netListener.(*net.TCPListener).Addr().(*net.TCPAddr).Port)
+ _ = netListener.Close()
+
+ debugOptions := []string{debugAgentPrefix + debugPort}
+ options = deduplicateVMOption(options, debugOptions, func(l, r string) bool {
+ return strings.HasPrefix(l, debugAgentPrefix) && strings.HasPrefix(r, debugAgentPrefix)
+ })
+ err = writeVMOptions(vmOptionsPath, options)
+ if err != nil {
+ log.WithError(err).Error("failed to configure debug agent")
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ fmt.Fprint(w, debugPort)
+ restart(r)
+ })
+ http.HandleFunc("/restart", func(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprint(w, "terminated")
+ restart(r)
+ })
http.HandleFunc("/joinLink", func(w http.ResponseWriter, r *http.Request) {
backendPort := r.URL.Query().Get("backendPort")
if backendPort == "" {
@@ -149,6 +213,19 @@ func main() {
}
}
+func restart(r *http.Request) {
+ backendPort := r.URL.Query().Get("backendPort")
+ if backendPort == "" {
+ backendPort = defaultBackendPort
+ }
+ err := terminateIDE(backendPort)
+ if err != nil {
+ log.WithError(err).Error("failed to terminate IDE gracefully")
+ os.Exit(1)
+ }
+ os.Exit(0)
+}
+
type Projects struct {
JoinLink string `json:"joinLink"`
}
@@ -303,19 +380,27 @@ func handleSignal(projectPath string) {
log.Info("asked IDE to terminate")
}
-func configureVMOptions(config *gitpod.GitpodConfig, alias string) error {
- idePrefix := alias
- if alias == "intellij" {
- idePrefix = "idea"
- }
- // [idea64|goland64|pycharm64|phpstorm64].vmoptions
- path := fmt.Sprintf("/ide-desktop/backend/bin/%s64.vmoptions", idePrefix)
- content, err := ioutil.ReadFile(path)
+func configureVMOptions(config *gitpod.GitpodConfig, alias string, vmOptionsPath string) error {
+ options, err := readVMOptions(vmOptionsPath)
if err != nil {
return err
}
- newContent := updateVMOptions(config, alias, string(content))
- return ioutil.WriteFile(path, []byte(newContent), 0)
+ newOptions := updateVMOptions(config, alias, options)
+ return writeVMOptions(vmOptionsPath, newOptions)
+}
+
+func readVMOptions(vmOptionsPath string) ([]string, error) {
+ content, err := ioutil.ReadFile(vmOptionsPath)
+ if err != nil {
+ return nil, err
+ }
+ return strings.Fields(string(content)), nil
+}
+
+func writeVMOptions(vmOptionsPath string, vmoptions []string) error {
+ // vmoptions file should end with a newline
+ content := strings.Join(vmoptions, "\n") + "\n"
+ return ioutil.WriteFile(vmOptionsPath, []byte(content), 0)
}
// deduplicateVMOption append new VMOptions onto old VMOptions and remove any duplicated leftmost options
@@ -336,7 +421,11 @@ func deduplicateVMOption(oldLines []string, newLines []string, predicate func(l,
return result
}
-func updateVMOptions(config *gitpod.GitpodConfig, alias string, content string) string {
+func updateVMOptions(
+ config *gitpod.GitpodConfig,
+ alias string,
+ // original vmoptions (inherited from $JETBRAINS_IDE_HOME/bin/idea64.vmoptions)
+ ideaVMOptionsLines []string) []string {
// inspired by how intellij platform merge the VMOptions
// https://github.com/JetBrains/intellij-community/blob/master/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java#L1115
filterFunc := func(l, r string) bool {
@@ -348,8 +437,6 @@ func updateVMOptions(config *gitpod.GitpodConfig, alias string, content string)
strings.Split(l, "=")[0] == strings.Split(r, "=")[0]
return isEqual || isXmx || isXms || isXss || isXXOptions
}
- // original vmoptions (inherited from $JETBRAINS_IDE_HOME/bin/idea64.vmoptions)
- ideaVMOptionsLines := strings.Fields(content)
// Gitpod's default customization
gitpodVMOptions := []string{"-Dgtw.disable.exit.dialog=true"}
vmoptions := deduplicateVMOption(ideaVMOptionsLines, gitpodVMOptions, filterFunc)
@@ -372,8 +459,7 @@ func updateVMOptions(config *gitpod.GitpodConfig, alias string, content string)
}
}
- // vmoptions file should end with a newline
- return strings.Join(vmoptions, "\n") + "\n"
+ return vmoptions
}
/*
@@ -517,3 +603,12 @@ func getProductConfig(config *gitpod.GitpodConfig, alias string) *gitpod.Jetbrai
}
return productConfig
}
+
+func linkRemotePlugin() error {
+ remotePluginDir := BackendPath + "/plugins/gitpod-remote"
+ _, err := os.Stat(remotePluginDir)
+ if err == nil || !errors.Is(err, os.ErrNotExist) {
+ return nil
+ }
+ return os.Symlink("/ide-desktop-plugins/gitpod-remote", remotePluginDir)
+}
diff --git a/components/ide/jetbrains/image/status/main_test.go b/components/ide/jetbrains/image/status/main_test.go
index f12f8d57216ec5..7b090beeea0618 100644
--- a/components/ide/jetbrains/image/status/main_test.go
+++ b/components/ide/jetbrains/image/status/main_test.go
@@ -58,17 +58,17 @@ func TestUpdateVMOptions(t *testing.T) {
lessFunc := func(a, b string) bool { return a < b }
t.Run(test.Desc, func(t *testing.T) {
- actual := updateVMOptions(nil, test.Alias, test.Src)
- if diff := cmp.Diff(strings.Fields(test.Expectation), strings.Fields(actual), cmpopts.SortSlices(lessFunc)); diff != "" {
+ actual := updateVMOptions(nil, test.Alias, strings.Fields(test.Src))
+ if diff := cmp.Diff(strings.Fields(test.Expectation), actual, cmpopts.SortSlices(lessFunc)); diff != "" {
t.Errorf("unexpected output (-want +got):\n%s", diff)
}
})
t.Run("updateVMOptions multiple time should be stable", func(t *testing.T) {
- actual := test.Src
+ actual := strings.Fields(test.Src)
for i := 0; i < 5; i++ {
actual = updateVMOptions(nil, test.Alias, actual)
- if diff := cmp.Diff(strings.Fields(test.Expectation), strings.Fields(actual), cmpopts.SortSlices(lessFunc)); diff != "" {
+ if diff := cmp.Diff(strings.Fields(test.Expectation), actual, cmpopts.SortSlices(lessFunc)); diff != "" {
t.Errorf("unexpected output (-want +got):\n%s", diff)
}
}
diff --git a/components/supervisor-api/java/gradle.properties b/components/supervisor-api/java/gradle.properties
index 1b700dfd5bad22..d7a245bcb4e5a8 100644
--- a/components/supervisor-api/java/gradle.properties
+++ b/components/supervisor-api/java/gradle.properties
@@ -2,3 +2,5 @@ version=1.0-SNAPSHOT
# See https://stackoverflow.com/a/47607857/961588
systemProp.org.gradle.internal.http.socketTimeout=100000
systemProp.org.gradle.internal.http.connectionTimeout=100000
+# See https://docs.gradle.org/current/userguide/build_cache.html#sec:build_cache_enable
+org.gradle.caching=true
diff --git a/install/installer/cmd/testdata/render/aws-setup/output.golden b/install/installer/cmd/testdata/render/aws-setup/output.golden
index 02622944420554..af055bc2262e9b 100644
--- a/install/installer/cmd/testdata/render/aws-setup/output.golden
+++ b/install/installer/cmd/testdata/render/aws-setup/output.golden
@@ -1463,6 +1463,12 @@ data:
},
"phpstormLatest": {
"version": "test"
+ },
+ "jbBackendPlugin": {
+ "version": "test"
+ },
+ "jbBackendPluginLatest": {
+ "version": "test"
}
}
},
@@ -4193,7 +4199,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/golandLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/goland:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"intellij": {
"orderKey": "04",
@@ -4201,7 +4209,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/intellijIdeaLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"phpstorm": {
"orderKey": "07",
@@ -4209,7 +4219,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/phpstormLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"pycharm": {
"orderKey": "06",
@@ -4217,7 +4229,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/pycharmLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
}
},
"defaultIde": "code",
diff --git a/install/installer/cmd/testdata/render/azure-setup/output.golden b/install/installer/cmd/testdata/render/azure-setup/output.golden
index d15056ec746556..56bb116285e016 100644
--- a/install/installer/cmd/testdata/render/azure-setup/output.golden
+++ b/install/installer/cmd/testdata/render/azure-setup/output.golden
@@ -1421,6 +1421,12 @@ data:
},
"phpstormLatest": {
"version": "test"
+ },
+ "jbBackendPlugin": {
+ "version": "test"
+ },
+ "jbBackendPluginLatest": {
+ "version": "test"
}
}
},
@@ -4057,7 +4063,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/golandLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/goland:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"intellij": {
"orderKey": "04",
@@ -4065,7 +4073,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/intellijIdeaLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"phpstorm": {
"orderKey": "07",
@@ -4073,7 +4083,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/phpstormLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"pycharm": {
"orderKey": "06",
@@ -4081,7 +4093,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/pycharmLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
}
},
"defaultIde": "code",
diff --git a/install/installer/cmd/testdata/render/customization/output.golden b/install/installer/cmd/testdata/render/customization/output.golden
index 6cb425c1faccfa..9461a6ef4f91d8 100644
--- a/install/installer/cmd/testdata/render/customization/output.golden
+++ b/install/installer/cmd/testdata/render/customization/output.golden
@@ -1673,6 +1673,12 @@ data:
},
"phpstormLatest": {
"version": "test"
+ },
+ "jbBackendPlugin": {
+ "version": "test"
+ },
+ "jbBackendPluginLatest": {
+ "version": "test"
}
}
},
@@ -4969,7 +4975,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/golandLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/goland:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"intellij": {
"orderKey": "04",
@@ -4977,7 +4985,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/intellijIdeaLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"phpstorm": {
"orderKey": "07",
@@ -4985,7 +4995,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/phpstormLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"pycharm": {
"orderKey": "06",
@@ -4993,7 +5005,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/pycharmLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
}
},
"defaultIde": "code",
diff --git a/install/installer/cmd/testdata/render/external-registry/output.golden b/install/installer/cmd/testdata/render/external-registry/output.golden
index db00fe16d0c54c..66a5e9d9e12507 100644
--- a/install/installer/cmd/testdata/render/external-registry/output.golden
+++ b/install/installer/cmd/testdata/render/external-registry/output.golden
@@ -1468,6 +1468,12 @@ data:
},
"phpstormLatest": {
"version": "test"
+ },
+ "jbBackendPlugin": {
+ "version": "test"
+ },
+ "jbBackendPluginLatest": {
+ "version": "test"
}
}
},
@@ -4244,7 +4250,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/golandLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/goland:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"intellij": {
"orderKey": "04",
@@ -4252,7 +4260,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/intellijIdeaLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"phpstorm": {
"orderKey": "07",
@@ -4260,7 +4270,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/phpstormLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"pycharm": {
"orderKey": "06",
@@ -4268,7 +4280,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/pycharmLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
}
},
"defaultIde": "code",
diff --git a/install/installer/cmd/testdata/render/gcp-setup/output.golden b/install/installer/cmd/testdata/render/gcp-setup/output.golden
index 4bc57e55cb2db3..9b364cd6c3cac9 100644
--- a/install/installer/cmd/testdata/render/gcp-setup/output.golden
+++ b/install/installer/cmd/testdata/render/gcp-setup/output.golden
@@ -1399,6 +1399,12 @@ data:
},
"phpstormLatest": {
"version": "test"
+ },
+ "jbBackendPlugin": {
+ "version": "test"
+ },
+ "jbBackendPluginLatest": {
+ "version": "test"
}
}
},
@@ -4018,7 +4024,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/golandLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/goland:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"intellij": {
"orderKey": "04",
@@ -4026,7 +4034,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/intellijIdeaLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"phpstorm": {
"orderKey": "07",
@@ -4034,7 +4044,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/phpstormLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"pycharm": {
"orderKey": "06",
@@ -4042,7 +4054,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/pycharmLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
}
},
"defaultIde": "code",
diff --git a/install/installer/cmd/testdata/render/minimal/output.golden b/install/installer/cmd/testdata/render/minimal/output.golden
index 3197356d000f90..4dedee49f46939 100644
--- a/install/installer/cmd/testdata/render/minimal/output.golden
+++ b/install/installer/cmd/testdata/render/minimal/output.golden
@@ -1534,6 +1534,12 @@ data:
},
"phpstormLatest": {
"version": "test"
+ },
+ "jbBackendPlugin": {
+ "version": "test"
+ },
+ "jbBackendPluginLatest": {
+ "version": "test"
}
}
},
@@ -4464,7 +4470,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/golandLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/goland:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"intellij": {
"orderKey": "04",
@@ -4472,7 +4480,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/intellijIdeaLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"phpstorm": {
"orderKey": "07",
@@ -4480,7 +4490,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/phpstormLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"pycharm": {
"orderKey": "06",
@@ -4488,7 +4500,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/pycharmLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
}
},
"defaultIde": "code",
diff --git a/install/installer/cmd/testdata/render/statefulset-customization/output.golden b/install/installer/cmd/testdata/render/statefulset-customization/output.golden
index 9bb2a89421737c..668127d414a6f2 100644
--- a/install/installer/cmd/testdata/render/statefulset-customization/output.golden
+++ b/install/installer/cmd/testdata/render/statefulset-customization/output.golden
@@ -1546,6 +1546,12 @@ data:
},
"phpstormLatest": {
"version": "test"
+ },
+ "jbBackendPlugin": {
+ "version": "test"
+ },
+ "jbBackendPluginLatest": {
+ "version": "test"
}
}
},
@@ -4476,7 +4482,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/golandLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/goland:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"intellij": {
"orderKey": "04",
@@ -4484,7 +4492,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/intellijIdeaLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"phpstorm": {
"orderKey": "07",
@@ -4492,7 +4502,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/phpstormLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"pycharm": {
"orderKey": "06",
@@ -4500,7 +4512,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/pycharmLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
}
},
"defaultIde": "code",
diff --git a/install/installer/cmd/testdata/render/use-pod-security-policies/output.golden b/install/installer/cmd/testdata/render/use-pod-security-policies/output.golden
index 0bad2323bee78a..627f2c9a22272c 100644
--- a/install/installer/cmd/testdata/render/use-pod-security-policies/output.golden
+++ b/install/installer/cmd/testdata/render/use-pod-security-policies/output.golden
@@ -1756,6 +1756,12 @@ data:
},
"phpstormLatest": {
"version": "test"
+ },
+ "jbBackendPlugin": {
+ "version": "test"
+ },
+ "jbBackendPluginLatest": {
+ "version": "test"
}
}
},
@@ -4797,7 +4803,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/golandLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/goland:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"intellij": {
"orderKey": "04",
@@ -4805,7 +4813,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/intellijIdeaLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"phpstorm": {
"orderKey": "07",
@@ -4813,7 +4823,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/phpstormLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"pycharm": {
"orderKey": "06",
@@ -4821,7 +4833,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/pycharmLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
}
},
"defaultIde": "code",
diff --git a/install/installer/cmd/testdata/render/versions.yaml b/install/installer/cmd/testdata/render/versions.yaml
index e7ebaea852a2dc..daf7e1fa23385d 100644
--- a/install/installer/cmd/testdata/render/versions.yaml
+++ b/install/installer/cmd/testdata/render/versions.yaml
@@ -78,6 +78,10 @@ components:
version: test
pycharmLatest:
version: test
+ jbBackendPlugin:
+ version: test
+ jbBackendPluginLatest:
+ version: test
version: test
dockerUp:
version: test
diff --git a/install/installer/cmd/testdata/render/workspace-requests-limits/output.golden b/install/installer/cmd/testdata/render/workspace-requests-limits/output.golden
index 21e030538c7778..f211c6418d907c 100644
--- a/install/installer/cmd/testdata/render/workspace-requests-limits/output.golden
+++ b/install/installer/cmd/testdata/render/workspace-requests-limits/output.golden
@@ -1537,6 +1537,12 @@ data:
},
"phpstormLatest": {
"version": "test"
+ },
+ "jbBackendPlugin": {
+ "version": "test"
+ },
+ "jbBackendPluginLatest": {
+ "version": "test"
}
}
},
@@ -4467,7 +4473,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/golandLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/goland:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"intellij": {
"orderKey": "04",
@@ -4475,7 +4483,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/intellijIdeaLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"phpstorm": {
"orderKey": "07",
@@ -4483,7 +4493,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/phpstormLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
},
"pycharm": {
"orderKey": "06",
@@ -4491,7 +4503,9 @@ data:
"type": "desktop",
"logo": "https://ide.gitpod.example.com/image/ide-logo/pycharmLogo.svg",
"image": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:test",
- "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest"
+ "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest",
+ "pluginImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:test",
+ "pluginLatestImage": "eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:latest"
}
},
"defaultIde": "code",
diff --git a/install/installer/pkg/components/server/ide/configmap.go b/install/installer/pkg/components/server/ide/configmap.go
index 3d89ba58911ef5..8317d271f63005 100644
--- a/install/installer/pkg/components/server/ide/configmap.go
+++ b/install/installer/pkg/components/server/ide/configmap.go
@@ -47,6 +47,8 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
return ctx.ImageName(ctx.Config.Repository, name, bundledLatest.Version)
}
+ jbPluginImage := ctx.ImageName(ctx.Config.Repository, ide.JetBrainsBackendPluginImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.JetBrainsBackendPluginImage.Version)
+ jbPluginLatestImage := resolveLatestImage(ide.JetBrainsBackendPluginImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.JetBrainsBackendPluginLatestImage)
idecfg := IDEConfig{
SupervisorImage: ctx.ImageName(ctx.Config.Repository, workspace.SupervisorImage, ctx.VersionManifest.Components.Workspace.Supervisor.Version),
IDEOptions: IDEOptions{
@@ -92,36 +94,44 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
LatestImage: ctx.ImageName(ctx.Config.Repository, ide.CodeDesktopInsidersIDEImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.CodeDesktopImageInsiders.Version),
},
intellij: {
- OrderKey: pointer.String("04"),
- Title: "IntelliJ IDEA",
- Type: typeDesktop,
- Logo: getIdeLogoPath("intellijIdeaLogo"),
- Image: ctx.ImageName(ctx.Config.Repository, ide.IntelliJDesktopIDEImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.IntelliJImage.Version),
- LatestImage: resolveLatestImage(ide.IntelliJDesktopIDEImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.IntelliJLatestImage),
+ OrderKey: pointer.String("04"),
+ Title: "IntelliJ IDEA",
+ Type: typeDesktop,
+ Logo: getIdeLogoPath("intellijIdeaLogo"),
+ Image: ctx.ImageName(ctx.Config.Repository, ide.IntelliJDesktopIDEImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.IntelliJImage.Version),
+ LatestImage: resolveLatestImage(ide.IntelliJDesktopIDEImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.IntelliJLatestImage),
+ PluginImage: jbPluginImage,
+ PluginLatestImage: jbPluginLatestImage,
},
goland: {
- OrderKey: pointer.String("05"),
- Title: "GoLand",
- Type: typeDesktop,
- Logo: getIdeLogoPath("golandLogo"),
- Image: ctx.ImageName(ctx.Config.Repository, ide.GoLandDesktopIdeImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.GoLandImage.Version),
- LatestImage: resolveLatestImage(ide.GoLandDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.GoLandLatestImage),
+ OrderKey: pointer.String("05"),
+ Title: "GoLand",
+ Type: typeDesktop,
+ Logo: getIdeLogoPath("golandLogo"),
+ Image: ctx.ImageName(ctx.Config.Repository, ide.GoLandDesktopIdeImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.GoLandImage.Version),
+ LatestImage: resolveLatestImage(ide.GoLandDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.GoLandLatestImage),
+ PluginImage: jbPluginImage,
+ PluginLatestImage: jbPluginLatestImage,
},
pycharm: {
- OrderKey: pointer.String("06"),
- Title: "PyCharm",
- Type: typeDesktop,
- Logo: getIdeLogoPath("pycharmLogo"),
- Image: ctx.ImageName(ctx.Config.Repository, ide.PyCharmDesktopIdeImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.PyCharmImage.Version),
- LatestImage: resolveLatestImage(ide.PyCharmDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.PyCharmLatestImage),
+ OrderKey: pointer.String("06"),
+ Title: "PyCharm",
+ Type: typeDesktop,
+ Logo: getIdeLogoPath("pycharmLogo"),
+ Image: ctx.ImageName(ctx.Config.Repository, ide.PyCharmDesktopIdeImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.PyCharmImage.Version),
+ LatestImage: resolveLatestImage(ide.PyCharmDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.PyCharmLatestImage),
+ PluginImage: jbPluginImage,
+ PluginLatestImage: jbPluginLatestImage,
},
phpstorm: {
- OrderKey: pointer.String("07"),
- Title: "PhpStorm",
- Type: typeDesktop,
- Logo: getIdeLogoPath("phpstormLogo"),
- Image: ctx.ImageName(ctx.Config.Repository, ide.PhpStormDesktopIdeImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.PhpStormImage.Version),
- LatestImage: resolveLatestImage(ide.PhpStormDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.PhpStormLatestImage),
+ OrderKey: pointer.String("07"),
+ Title: "PhpStorm",
+ Type: typeDesktop,
+ Logo: getIdeLogoPath("phpstormLogo"),
+ Image: ctx.ImageName(ctx.Config.Repository, ide.PhpStormDesktopIdeImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.PhpStormImage.Version),
+ LatestImage: resolveLatestImage(ide.PhpStormDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.PhpStormLatestImage),
+ PluginImage: jbPluginImage,
+ PluginLatestImage: jbPluginLatestImage,
},
},
DefaultIDE: "code",
diff --git a/install/installer/pkg/components/server/ide/types.go b/install/installer/pkg/components/server/ide/types.go
index d0e2d11be76ea4..1090fde598d11f 100644
--- a/install/installer/pkg/components/server/ide/types.go
+++ b/install/installer/pkg/components/server/ide/types.go
@@ -33,6 +33,8 @@ type IDEOption struct {
Image string `json:"image"`
LatestImage string `json:"latestImage,omitempty"`
ResolveImageDigest *bool `json:"resolveImageDigest,omitempty"`
+ PluginImage string `json:"pluginImage,omitempty"`
+ PluginLatestImage string `json:"pluginLatestImage,omitempty"`
}
// IDEClient interface from components/gitpod-protocol/src/ide-protocol.ts
diff --git a/install/installer/pkg/components/workspace/ide/constants.go b/install/installer/pkg/components/workspace/ide/constants.go
index ec67b0f251d141..6f83cf2839c9ea 100644
--- a/install/installer/pkg/components/workspace/ide/constants.go
+++ b/install/installer/pkg/components/workspace/ide/constants.go
@@ -13,4 +13,5 @@ const (
GoLandDesktopIdeImage = "ide/goland"
PyCharmDesktopIdeImage = "ide/pycharm"
PhpStormDesktopIdeImage = "ide/phpstorm"
+ JetBrainsBackendPluginImage = "ide/jb-backend-plugin"
)
diff --git a/install/installer/pkg/config/versions/versions.go b/install/installer/pkg/config/versions/versions.go
index c9de5790cee2ac..ed674debabcafe 100644
--- a/install/installer/pkg/config/versions/versions.go
+++ b/install/installer/pkg/config/versions/versions.go
@@ -44,16 +44,18 @@ type Components struct {
Supervisor Versioned `json:"supervisor"`
Workspacekit Versioned `json:"workspacekit"`
DesktopIdeImages struct {
- CodeDesktopImage Versioned `json:"codeDesktop"`
- CodeDesktopImageInsiders Versioned `json:"codeDesktopInsiders"`
- IntelliJImage Versioned `json:"intellij"`
- IntelliJLatestImage Versioned `json:"intellijLatest"`
- GoLandImage Versioned `json:"goland"`
- GoLandLatestImage Versioned `json:"golandLatest"`
- PyCharmImage Versioned `json:"pycharm"`
- PyCharmLatestImage Versioned `json:"pycharmLatest"`
- PhpStormImage Versioned `json:"phpstorm"`
- PhpStormLatestImage Versioned `json:"phpstormLatest"`
+ CodeDesktopImage Versioned `json:"codeDesktop"`
+ CodeDesktopImageInsiders Versioned `json:"codeDesktopInsiders"`
+ IntelliJImage Versioned `json:"intellij"`
+ IntelliJLatestImage Versioned `json:"intellijLatest"`
+ GoLandImage Versioned `json:"goland"`
+ GoLandLatestImage Versioned `json:"golandLatest"`
+ PyCharmImage Versioned `json:"pycharm"`
+ PyCharmLatestImage Versioned `json:"pycharmLatest"`
+ PhpStormImage Versioned `json:"phpstorm"`
+ PhpStormLatestImage Versioned `json:"phpstormLatest"`
+ JetBrainsBackendPluginImage Versioned `json:"jbBackendPlugin"`
+ JetBrainsBackendPluginLatestImage Versioned `json:"jbBackendPluginLatest"`
} `json:"desktopIdeImages"`
} `json:"workspace"`
WSDaemon struct {