From bff90da69a1e9dc7b74b61623c26846784d650fe Mon Sep 17 00:00:00 2001 From: Anton Kosyakov Date: Thu, 24 Nov 2022 11:40:35 +0000 Subject: [PATCH] fix #13815: jetbrains: launch with interactive login shell in async manner --- .../ide/jetbrains/image/leeway.Dockerfile | 1 - components/ide/jetbrains/image/startup.sh | 21 -- components/ide/jetbrains/image/status/go.mod | 1 + components/ide/jetbrains/image/status/go.sum | 2 + components/ide/jetbrains/image/status/main.go | 327 +++++++++++------- .../image/supervisor-ide-config_clion.json | 2 +- .../image/supervisor-ide-config_goland.json | 2 +- .../image/supervisor-ide-config_intellij.json | 2 +- .../image/supervisor-ide-config_phpstorm.json | 2 +- .../image/supervisor-ide-config_pycharm.json | 2 +- .../image/supervisor-ide-config_rider.json | 2 +- .../image/supervisor-ide-config_rubymine.json | 2 +- .../image/supervisor-ide-config_webstorm.json | 2 +- 13 files changed, 215 insertions(+), 153 deletions(-) delete mode 100755 components/ide/jetbrains/image/startup.sh diff --git a/components/ide/jetbrains/image/leeway.Dockerfile b/components/ide/jetbrains/image/leeway.Dockerfile index c7797ded7baf5c..6b672c7e47e8cb 100644 --- a/components/ide/jetbrains/image/leeway.Dockerfile +++ b/components/ide/jetbrains/image/leeway.Dockerfile @@ -14,7 +14,6 @@ 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-image-status--app/status /ide-desktop diff --git a/components/ide/jetbrains/image/startup.sh b/components/ide/jetbrains/image/startup.sh deleted file mode 100755 index 7323bdfe85d9f1..00000000000000 --- a/components/ide/jetbrains/image/startup.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# 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. - -set -euo pipefail - -# kill background jobs when the script exits -trap "jobs -p | xargs -r kill" SIGINT SIGTERM EXIT - -# instead put them into /ide-desktop/backend/bin/idea64.vmoptions -# otherwise JB will complain to a user on each startup -# by default remote dev already set -Xmx2048m, see /ide-desktop/backend/plugins/remote-dev-server/bin/launcher.sh -unset JAVA_TOOL_OPTIONS - -# enable remote debuggign if debug mode is enabled -if [ "${SUPERVISOR_DEBUG_ENABLE+}" = "true" ]; then - export JAVA_TOOL_OPTIONS "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:0" -fi - -exec /ide-desktop/status "$@" diff --git a/components/ide/jetbrains/image/status/go.mod b/components/ide/jetbrains/image/status/go.mod index f049c2dacd12e1..a4bfb9989c9ae5 100644 --- a/components/ide/jetbrains/image/status/go.mod +++ b/components/ide/jetbrains/image/status/go.mod @@ -24,6 +24,7 @@ require ( github.com/gitpod-io/gitpod/common-go v0.0.0-00010101000000-000000000000 github.com/gitpod-io/gitpod/gitpod-protocol v0.0.0-00010101000000-000000000000 github.com/golang/protobuf v1.5.2 // indirect + github.com/google/uuid v1.3.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 // indirect github.com/hashicorp/go-version v1.4.0 golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e // indirect diff --git a/components/ide/jetbrains/image/status/go.sum b/components/ide/jetbrains/image/status/go.sum index 20501bebff24dc..0f679f8ec2e09c 100644 --- a/components/ide/jetbrains/image/status/go.sum +++ b/components/ide/jetbrains/image/status/go.sum @@ -13,6 +13,8 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= diff --git a/components/ide/jetbrains/image/status/main.go b/components/ide/jetbrains/image/status/main.go index 03159317ce1780..d4da03e8d1df16 100644 --- a/components/ide/jetbrains/image/status/main.go +++ b/components/ide/jetbrains/image/status/main.go @@ -5,6 +5,7 @@ package main import ( + "bytes" "context" "encoding/json" "errors" @@ -24,6 +25,7 @@ import ( "syscall" "time" + "github.com/google/uuid" "github.com/hashicorp/go-version" "golang.org/x/xerrors" "google.golang.org/grpc" @@ -49,59 +51,41 @@ const BackendPath = "/ide-desktop/backend" const ProductInfoPath = BackendPath + "/product-info.json" type LaunchContext struct { - alias string + startTime time.Time + + port string + alias string + label string + + info *ProductInfo + backendVersion *version.Version + wsInfo *supervisor.WorkspaceInfoResponse + + vmOptionsFile string projectDir string configDir string systemDir string projectConfigDir string projectContextDir string riderSolutionFile string - wsInfo *supervisor.WorkspaceInfoResponse -} -// TODO(andreafalzetti): remove dir scanning once this is implemented https://youtrack.jetbrains.com/issue/GTW-2402/Rider-Open-Project-dialog-not-displaying-in-remote-dev -func findRiderSolutionFile(root string) (string, error) { - slnRegEx := regexp.MustCompile(`^.+\.sln$`) - projRegEx := regexp.MustCompile(`^.+\.csproj$`) + env []string +} - var slnFiles []string - var csprojFiles []string +// JB startup entrypoint +func main() { + log.Init(ServiceName, Version, true, false) - err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if len(os.Args) == 3 && os.Args[1] == "env" && os.Args[2] != "" { + var mark = os.Args[2] + content, err := json.Marshal(os.Environ()) if err != nil { - return err - } else if slnRegEx.MatchString(info.Name()) { - slnFiles = append(slnFiles, path) - } else if projRegEx.MatchString(info.Name()) { - csprojFiles = append(csprojFiles, path) + log.WithError(err).Fatal() } - return nil - }) - - if err != nil { - return "", err - } - - if len(slnFiles) > 0 { - return slnFiles[0], nil - } else if len(csprojFiles) > 0 { - return csprojFiles[0], nil - } - - return root, nil -} - -func resolveProjectContextDir(launchCtx *LaunchContext) string { - if launchCtx.alias == "rider" { - return launchCtx.riderSolutionFile + fmt.Printf("%s%s%s", mark, content, mark) + return } - return launchCtx.projectDir -} - -// JB startup entrypoint -func main() { - log.Init(ServiceName, Version, true, false) log.Info(ServiceName + ": " + Version) startTime := time.Now() @@ -133,81 +117,28 @@ func main() { return } - projectDir := wsInfo.GetCheckoutLocation() - gitpodConfig, err := parseGitpodConfig(projectDir) - if err != nil { - log.WithError(err).Error("failed to parse .gitpod.yml") - } - - // configure vmoptions - 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") - } - - qualifier := os.Getenv("JETBRAINS_BACKEND_QUALIFIER") - if qualifier == "stable" { - qualifier = "" - } else { - qualifier = "-" + qualifier - } - - var riderSolutionFile string - if alias == "rider" { - riderSolutionFile, err = findRiderSolutionFile(projectDir) - if err != nil { - log.WithError(err).Error("failed to find a rider solution file") - } - } - - configDir := fmt.Sprintf("/workspace/.config/JetBrains%s", qualifier) launchCtx := &LaunchContext{ - alias: alias, - wsInfo: wsInfo, - projectDir: projectDir, - projectContextDir: projectDir, - configDir: configDir, - systemDir: fmt.Sprintf("/workspace/.cache/JetBrains%s", qualifier), - riderSolutionFile: riderSolutionFile, - } - - launchCtx.projectContextDir = resolveProjectContextDir(launchCtx) - launchCtx.projectConfigDir = fmt.Sprintf("%s/RemoteDev-%s/%s", configDir, info.ProductCode, strings.ReplaceAll(launchCtx.projectContextDir, "/", "_")) - - // sync initial options - err = syncOptions(launchCtx) - if err != nil { - log.WithError(err).Error("failed to sync initial options") - } + startTime: startTime, - // install project plugins - version_2022_1, _ := version.NewVersion("2022.1") - if version_2022_1.LessThanOrEqual(backendVersion) { - err = installPlugins(gitpodConfig, launchCtx) - installPluginsCost := time.Now().Local().Sub(startTime).Milliseconds() - if err != nil { - log.WithError(err).WithField("cost", installPluginsCost).Error("installing repo plugins: done") - } else { - log.WithField("cost", installPluginsCost).Info("installing repo plugins: done") - } - } + port: port, + alias: alias, + label: label, - // install gitpod plugin - err = linkRemotePlugin() - if err != nil { - log.WithError(err).Error("failed to install gitpod-remote plugin") + info: info, + backendVersion: backendVersion, + wsInfo: wsInfo, } - go run(launchCtx) + // we should start serving immediately and postpone launch + // in order to enable a JB Gateway to connect as soon as possible + go launch(launchCtx) + // IMPORTANT: don't put startup logic in serve!!! + serve(launchCtx) +} +func serve(launchCtx *LaunchContext) { 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) + options, err := readVMOptions(launchCtx.vmOptionsFile) if err != nil { log.WithError(err).Error("failed to configure debug agent") http.Error(w, err.Error(), http.StatusInternalServerError) @@ -243,7 +174,7 @@ func main() { options = deduplicateVMOption(options, debugOptions, func(l, r string) bool { return strings.HasPrefix(l, debugAgentPrefix) && strings.HasPrefix(r, debugAgentPrefix) }) - err = writeVMOptions(vmOptionsPath, options) + err = writeVMOptions(launchCtx.vmOptionsFile, options) if err != nil { log.WithError(err).Error("failed to configure debug agent") http.Error(w, err.Error(), http.StatusInternalServerError) @@ -274,7 +205,7 @@ func main() { if backendPort == "" { backendPort = defaultBackendPort } - jsonLink, err := resolveGatewayLink(backendPort, wsInfo) + jsonLink, err := resolveGatewayLink(backendPort, launchCtx.wsInfo) if err != nil { log.WithError(err).Error("cannot resolve gateway link") http.Error(w, err.Error(), http.StatusServiceUnavailable) @@ -287,7 +218,7 @@ func main() { if backendPort == "" { backendPort = defaultBackendPort } - gatewayLink, err := resolveGatewayLink(backendPort, wsInfo) + gatewayLink, err := resolveGatewayLink(backendPort, launchCtx.wsInfo) if err != nil { log.WithError(err).Error("cannot resolve gateway link") http.Error(w, err.Error(), http.StatusServiceUnavailable) @@ -295,15 +226,15 @@ func main() { } response := make(map[string]string) response["link"] = gatewayLink - response["label"] = label + response["label"] = launchCtx.label response["clientID"] = "jetbrains-gateway" - response["kind"] = alias + response["kind"] = launchCtx.alias w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(response) }) - fmt.Printf("Starting status proxy for desktop IDE at port %s\n", port) - if err := http.ListenAndServe(fmt.Sprintf(":%s", port), nil); err != nil { + fmt.Printf("Starting status proxy for desktop IDE at port %s\n", launchCtx.port) + if err := http.ListenAndServe(fmt.Sprintf(":%s", launchCtx.port), nil); err != nil { log.Fatal(err) } } @@ -415,6 +346,76 @@ func resolveWorkspaceInfo(ctx context.Context) (*supervisor.WorkspaceInfoRespons return nil, errors.New("failed with attempt 10 times") } +func launch(launchCtx *LaunchContext) { + projectDir := launchCtx.wsInfo.GetCheckoutLocation() + gitpodConfig, err := parseGitpodConfig(projectDir) + if err != nil { + log.WithError(err).Error("failed to parse .gitpod.yml") + } + + // configure vmoptions + idePrefix := launchCtx.alias + if launchCtx.alias == "intellij" { + idePrefix = "idea" + } + // [idea64|goland64|pycharm64|phpstorm64].vmoptions + launchCtx.vmOptionsFile = fmt.Sprintf("/ide-desktop/backend/bin/%s64.vmoptions", idePrefix) + err = configureVMOptions(gitpodConfig, launchCtx.alias, launchCtx.vmOptionsFile) + if err != nil { + log.WithError(err).Error("failed to configure vmoptions") + } + + qualifier := os.Getenv("JETBRAINS_BACKEND_QUALIFIER") + if qualifier == "stable" { + qualifier = "" + } else { + qualifier = "-" + qualifier + } + + var riderSolutionFile string + if launchCtx.alias == "rider" { + riderSolutionFile, err = findRiderSolutionFile(projectDir) + if err != nil { + log.WithError(err).Error("failed to find a rider solution file") + } + } + + configDir := fmt.Sprintf("/workspace/.config/JetBrains%s", qualifier) + launchCtx.projectDir = projectDir + launchCtx.configDir = configDir + launchCtx.systemDir = fmt.Sprintf("/workspace/.cache/JetBrains%s", qualifier) + launchCtx.riderSolutionFile = riderSolutionFile + launchCtx.projectContextDir = resolveProjectContextDir(launchCtx) + launchCtx.projectConfigDir = fmt.Sprintf("%s/RemoteDev-%s/%s", configDir, launchCtx.info.ProductCode, strings.ReplaceAll(launchCtx.projectContextDir, "/", "_")) + + // sync initial options + err = syncOptions(launchCtx) + if err != nil { + log.WithError(err).Error("failed to sync initial options") + } + + // install project plugins + version_2022_1, _ := version.NewVersion("2022.1") + if version_2022_1.LessThanOrEqual(launchCtx.backendVersion) { + err = installPlugins(gitpodConfig, launchCtx) + installPluginsCost := time.Now().Local().Sub(launchCtx.startTime).Milliseconds() + if err != nil { + log.WithError(err).WithField("cost", installPluginsCost).Error("installing repo plugins: done") + } else { + log.WithField("cost", installPluginsCost).Info("installing repo plugins: done") + } + } + + // install gitpod plugin + err = linkRemotePlugin() + if err != nil { + log.WithError(err).Error("failed to install gitpod-remote plugin") + } + + // run backend + run(launchCtx) +} + func run(launchCtx *LaunchContext) { var args []string args = append(args, "run") @@ -443,16 +444,56 @@ func run(launchCtx *LaunchContext) { os.Exit(cmd.ProcessState.ExitCode()) } -func remoteDevServerCmd(args []string, productContext *LaunchContext) *exec.Cmd { - cmd := exec.Command(BackendPath+"/bin/remote-dev-server.sh", args...) - cmd.Env = os.Environ() +// resolveUserEnvs emulats the interactive login shell to ensure that all user defined shell scripts are loaded +func resolveUserEnvs() (userEnvs []string, err error) { + shell := os.Getenv("SHELL") + if shell == "" { + shell = "/bin/bash" + } + mark, err := uuid.NewRandom() + if err != nil { + return + } + envCmd := exec.Command(shell, []string{"-ilc", "/ide-desktop/status env " + mark.String()}...) + envCmd.Stderr = os.Stderr + output, err := envCmd.Output() + if err != nil { + return + } + markByte := []byte(mark.String()) + start := bytes.Index(output, markByte) + len(markByte) + end := bytes.LastIndex(output, markByte) + err = json.Unmarshal(output[start:end], &userEnvs) + return +} - // Set default config and system directories under /workspace to preserve between restarts - cmd.Env = append(cmd.Env, - fmt.Sprintf("IJ_HOST_CONFIG_BASE_DIR=%s", productContext.configDir), - fmt.Sprintf("IJ_HOST_SYSTEM_BASE_DIR=%s", productContext.systemDir), - ) +func remoteDevServerCmd(args []string, launchCtx *LaunchContext) *exec.Cmd { + if launchCtx.env == nil { + userEnvs, err := resolveUserEnvs() + if err == nil { + launchCtx.env = append(launchCtx.env, userEnvs...) + } else { + log.WithError(err).Error("failed to resolve user env vars") + launchCtx.env = os.Environ() + } + // Set default config and system directories under /workspace to preserve between restarts + launchCtx.env = append(launchCtx.env, + // Set default config and system directories under /workspace to preserve between restarts + fmt.Sprintf("IJ_HOST_CONFIG_BASE_DIR=%s", launchCtx.configDir), + fmt.Sprintf("IJ_HOST_SYSTEM_BASE_DIR=%s", launchCtx.systemDir), + ) + + // instead put them into /ide-desktop/backend/bin/idea64.vmoptions + // otherwise JB will complain to a user on each startup + // by default remote dev already set -Xmx2048m, see /ide-desktop/backend/plugins/remote-dev-server/bin/launcher.sh + launchCtx.env = append(launchCtx.env, "JAVA_TOOL_OPTIONS=") + + log.WithField("env", launchCtx.env).Debug("resolved launch env") + } + + cmd := exec.Command(BackendPath+"/bin/remote-dev-server.sh", args...) + cmd.Env = launchCtx.env cmd.Stderr = os.Stderr cmd.Stdout = os.Stdout return cmd @@ -731,3 +772,43 @@ func linkRemotePlugin() error { } return os.Symlink("/ide-desktop-plugins/gitpod-remote", remotePluginDir) } + +// TODO(andreafalzetti): remove dir scanning once this is implemented https://youtrack.jetbrains.com/issue/GTW-2402/Rider-Open-Project-dialog-not-displaying-in-remote-dev +func findRiderSolutionFile(root string) (string, error) { + slnRegEx := regexp.MustCompile(`^.+\.sln$`) + projRegEx := regexp.MustCompile(`^.+\.csproj$`) + + var slnFiles []string + var csprojFiles []string + + err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } else if slnRegEx.MatchString(info.Name()) { + slnFiles = append(slnFiles, path) + } else if projRegEx.MatchString(info.Name()) { + csprojFiles = append(csprojFiles, path) + } + return nil + }) + + if err != nil { + return "", err + } + + if len(slnFiles) > 0 { + return slnFiles[0], nil + } else if len(csprojFiles) > 0 { + return csprojFiles[0], nil + } + + return root, nil +} + +func resolveProjectContextDir(launchCtx *LaunchContext) string { + if launchCtx.alias == "rider" { + return launchCtx.riderSolutionFile + } + + return launchCtx.projectDir +} diff --git a/components/ide/jetbrains/image/supervisor-ide-config_clion.json b/components/ide/jetbrains/image/supervisor-ide-config_clion.json index e0dd9431645fad..4fd06a40500ab6 100644 --- a/components/ide/jetbrains/image/supervisor-ide-config_clion.json +++ b/components/ide/jetbrains/image/supervisor-ide-config_clion.json @@ -1,5 +1,5 @@ { - "entrypoint": "/ide-desktop/startup.sh", + "entrypoint": "/ide-desktop/status", "entrypointArgs": [ "{DESKTOPIDEPORT}", "clion", "Open in CLion" ], "readinessProbe": { "type": "http", diff --git a/components/ide/jetbrains/image/supervisor-ide-config_goland.json b/components/ide/jetbrains/image/supervisor-ide-config_goland.json index 4b6afef6f219af..9806595ac568d6 100644 --- a/components/ide/jetbrains/image/supervisor-ide-config_goland.json +++ b/components/ide/jetbrains/image/supervisor-ide-config_goland.json @@ -1,5 +1,5 @@ { - "entrypoint": "/ide-desktop/startup.sh", + "entrypoint": "/ide-desktop/status", "entrypointArgs": [ "{DESKTOPIDEPORT}", "goland", "Open in GoLand" ], "readinessProbe": { "type": "http", diff --git a/components/ide/jetbrains/image/supervisor-ide-config_intellij.json b/components/ide/jetbrains/image/supervisor-ide-config_intellij.json index 2aaac5ea008ca7..2f29262586acdd 100644 --- a/components/ide/jetbrains/image/supervisor-ide-config_intellij.json +++ b/components/ide/jetbrains/image/supervisor-ide-config_intellij.json @@ -1,5 +1,5 @@ { - "entrypoint": "/ide-desktop/startup.sh", + "entrypoint": "/ide-desktop/status", "entrypointArgs": [ "{DESKTOPIDEPORT}", "intellij", "Open in IntelliJ IDEA" ], "readinessProbe": { "type": "http", diff --git a/components/ide/jetbrains/image/supervisor-ide-config_phpstorm.json b/components/ide/jetbrains/image/supervisor-ide-config_phpstorm.json index a0d7ce238a00fb..4ca6a9e9bed845 100644 --- a/components/ide/jetbrains/image/supervisor-ide-config_phpstorm.json +++ b/components/ide/jetbrains/image/supervisor-ide-config_phpstorm.json @@ -1,5 +1,5 @@ { - "entrypoint": "/ide-desktop/startup.sh", + "entrypoint": "/ide-desktop/status", "entrypointArgs": [ "{DESKTOPIDEPORT}", "phpstorm", "Open in PhpStorm" ], "readinessProbe": { "type": "http", diff --git a/components/ide/jetbrains/image/supervisor-ide-config_pycharm.json b/components/ide/jetbrains/image/supervisor-ide-config_pycharm.json index fd08b2ce2bb540..242cd3de192e65 100644 --- a/components/ide/jetbrains/image/supervisor-ide-config_pycharm.json +++ b/components/ide/jetbrains/image/supervisor-ide-config_pycharm.json @@ -1,5 +1,5 @@ { - "entrypoint": "/ide-desktop/startup.sh", + "entrypoint": "/ide-desktop/status", "entrypointArgs": [ "{DESKTOPIDEPORT}", "pycharm", "Open in PyCharm" ], "readinessProbe": { "type": "http", diff --git a/components/ide/jetbrains/image/supervisor-ide-config_rider.json b/components/ide/jetbrains/image/supervisor-ide-config_rider.json index 265fe1cb0336be..94159b57d81064 100644 --- a/components/ide/jetbrains/image/supervisor-ide-config_rider.json +++ b/components/ide/jetbrains/image/supervisor-ide-config_rider.json @@ -1,5 +1,5 @@ { - "entrypoint": "/ide-desktop/startup.sh", + "entrypoint": "/ide-desktop/status", "entrypointArgs": [ "{DESKTOPIDEPORT}", "rider", "Open in Rider" ], "readinessProbe": { "type": "http", diff --git a/components/ide/jetbrains/image/supervisor-ide-config_rubymine.json b/components/ide/jetbrains/image/supervisor-ide-config_rubymine.json index 5ca525777b27fd..0da7037ea32e80 100644 --- a/components/ide/jetbrains/image/supervisor-ide-config_rubymine.json +++ b/components/ide/jetbrains/image/supervisor-ide-config_rubymine.json @@ -1,5 +1,5 @@ { - "entrypoint": "/ide-desktop/startup.sh", + "entrypoint": "/ide-desktop/status", "entrypointArgs": [ "{DESKTOPIDEPORT}", "rubymine", "Open in RubyMine" ], "readinessProbe": { "type": "http", diff --git a/components/ide/jetbrains/image/supervisor-ide-config_webstorm.json b/components/ide/jetbrains/image/supervisor-ide-config_webstorm.json index aab618118909cc..89665958046115 100644 --- a/components/ide/jetbrains/image/supervisor-ide-config_webstorm.json +++ b/components/ide/jetbrains/image/supervisor-ide-config_webstorm.json @@ -1,5 +1,5 @@ { - "entrypoint": "/ide-desktop/startup.sh", + "entrypoint": "/ide-desktop/status", "entrypointArgs": [ "{DESKTOPIDEPORT}", "webstorm", "Open in WebStorm" ], "readinessProbe": { "type": "http",