Skip to content

Commit

Permalink
jetbrains: run warmup as last task
Browse files Browse the repository at this point in the history
Co-authored-by: Anton Kosyakov <[email protected]>
Co-authored-by: Victor Nogueira <[email protected]>
  • Loading branch information
3 people committed Dec 13, 2022
1 parent cd289d4 commit 377ca81
Show file tree
Hide file tree
Showing 10 changed files with 174 additions and 153 deletions.
205 changes: 88 additions & 117 deletions components/ide-service/pkg/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -188,20 +188,6 @@ type WorkspaceContext struct {
ReferrerIde string `json:"referrerIde,omitempty"`
}

var JetbrainsCode map[string]string

func init() {
JetbrainsCode = make(map[string]string)
JetbrainsCode["intellij"] = "IIU"
JetbrainsCode["goland"] = "GO"
JetbrainsCode["pycharm"] = "PCP"
JetbrainsCode["phpstorm"] = "PS"
JetbrainsCode["rubymine"] = "RM"
JetbrainsCode["webstorm"] = "WS"
JetbrainsCode["rider"] = "RD"
JetbrainsCode["clion"] = "CL"
}

func (s *IDEServiceServer) resolveReferrerIDE(ideConfig *config.IDEConfig, wsCtx *WorkspaceContext, chosenIDEName string) (ideName string, ideOption *config.IDEOption) {
if wsCtx == nil || wsCtx.Referrer == "" {
return
Expand Down Expand Up @@ -264,166 +250,150 @@ func (s *IDEServiceServer) ResolveWorkspaceConfig(ctx context.Context, req *api.
WebImage: defaultIde.Image,
}

// TODO: reconsider this
// if req.Type != api.WorkspaceType_REGULAR {
// return resp, nil
// }

var wsConfig *gitpodapi.GitpodConfig
var wsContext *WorkspaceContext
var ideSettings *IDESettings

if req.IdeSettings != "" {
if err := json.Unmarshal([]byte(req.IdeSettings), &ideSettings); err != nil {
log.WithError(err).WithField("ideSetting", req.IdeSettings).Error("failed to parse ide settings")
}
}
if req.WorkspaceConfig != "" {
if err := json.Unmarshal([]byte(req.WorkspaceConfig), &wsConfig); err != nil {
log.WithError(err).WithField("workspaceConfig", req.WorkspaceConfig).Error("failed to parse workspace config")
}
}
if req.Context != "" {
if err := json.Unmarshal([]byte(req.Context), &wsContext); err != nil {
log.WithError(err).WithField("context", req.Context).Error("failed to parse context")
}
}

userIdeName := ""
useLatest := false
if req.Type == api.WorkspaceType_REGULAR {
var ideSettings *IDESettings
var wsContext *WorkspaceContext

if ideSettings != nil {
userIdeName = ideSettings.DefaultIde
useLatest = ideSettings.UseLatestVersion
}
if req.IdeSettings != "" {
if err := json.Unmarshal([]byte(req.IdeSettings), &ideSettings); err != nil {
log.WithError(err).WithField("ideSetting", req.IdeSettings).Error("failed to parse ide settings")
}
}

if req.Context != "" {
if err := json.Unmarshal([]byte(req.Context), &wsContext); err != nil {
log.WithError(err).WithField("context", req.Context).Error("failed to parse context")
}
}

chosenIDE := defaultIde
userIdeName := ""
useLatest := false

getUserIDEImage := func(ideOption *config.IDEOption) string {
if useLatest && ideOption.LatestImage != "" {
return ideOption.LatestImage
if ideSettings != nil {
userIdeName = ideSettings.DefaultIde
useLatest = ideSettings.UseLatestVersion
}

return ideOption.Image
}
chosenIDE := defaultIde

getUserIDEImage := func(ideOption *config.IDEOption) string {
if useLatest && ideOption.LatestImage != "" {
return ideOption.LatestImage
}

getUserPluginImage := func(ideOption *config.IDEOption) string {
if useLatest && ideOption.PluginLatestImage != "" {
return ideOption.PluginLatestImage
return ideOption.Image
}

return ideOption.PluginImage
}
getUserPluginImage := func(ideOption *config.IDEOption) string {
if useLatest && ideOption.PluginLatestImage != "" {
return ideOption.PluginLatestImage
}

return ideOption.PluginImage
}

if userIdeName != "" {
if ide, ok := ideConfig.IdeOptions.Options[userIdeName]; ok {
chosenIDE = &ide
if userIdeName != "" {
if ide, ok := ideConfig.IdeOptions.Options[userIdeName]; ok {
chosenIDE = &ide

// TODO: Currently this variable reflects the IDE selected in
// user's settings for backward compatibility but in the future
// we want to make it represent the actual IDE.
ideAlias := api.EnvironmentVariable{
Name: "GITPOD_IDE_ALIAS",
Value: userIdeName,
// TODO: Currently this variable reflects the IDE selected in
// user's settings for backward compatibility but in the future
// we want to make it represent the actual IDE.
ideAlias := api.EnvironmentVariable{
Name: "GITPOD_IDE_ALIAS",
Value: userIdeName,
}
resp.Envvars = append(resp.Envvars, &ideAlias)
}
resp.Envvars = append(resp.Envvars, &ideAlias)
}
}

// we always need WebImage for when the user chooses a desktop ide
resp.WebImage = getUserIDEImage(defaultIde)
// we always need WebImage for when the user chooses a desktop ide
resp.WebImage = getUserIDEImage(defaultIde)

var desktopImageLayer string
var desktopPluginImageLayer string
if chosenIDE.Type == config.IDETypeDesktop {
desktopImageLayer = getUserIDEImage(chosenIDE)
desktopPluginImageLayer = getUserPluginImage(chosenIDE)
} else {
resp.WebImage = getUserIDEImage(chosenIDE)
}
var desktopImageLayer string
var desktopPluginImageLayer string
if chosenIDE.Type == config.IDETypeDesktop {
desktopImageLayer = getUserIDEImage(chosenIDE)
desktopPluginImageLayer = getUserPluginImage(chosenIDE)
} else {
resp.WebImage = getUserIDEImage(chosenIDE)
}

ideName, referrer := s.resolveReferrerIDE(ideConfig, wsContext, userIdeName)
if ideName != "" {
resp.RefererIde = ideName
desktopImageLayer = getUserIDEImage(referrer)
desktopPluginImageLayer = getUserPluginImage(referrer)
}
ideName, referrer := s.resolveReferrerIDE(ideConfig, wsContext, userIdeName)
if ideName != "" {
resp.RefererIde = ideName
desktopImageLayer = getUserIDEImage(referrer)
desktopPluginImageLayer = getUserPluginImage(referrer)
}

if desktopImageLayer != "" {
resp.IdeImageLayers = append(resp.IdeImageLayers, desktopImageLayer)
if desktopPluginImageLayer != "" {
resp.IdeImageLayers = append(resp.IdeImageLayers, desktopPluginImageLayer)
if desktopImageLayer != "" {
resp.IdeImageLayers = append(resp.IdeImageLayers, desktopImageLayer)
if desktopPluginImageLayer != "" {
resp.IdeImageLayers = append(resp.IdeImageLayers, desktopPluginImageLayer)
}
}
}

jbGW, ok := ideConfig.IdeOptions.Clients["jetbrains-gateway"]
if req.Type == api.WorkspaceType_PREBUILD && ok {
warmUpTask := ""
var pluginStableImage string
var pluginLatestImage string
for _, alias := range jbGW.DesktopIDEs {
prebuilds := getPrebuilds(wsConfig, alias)
if prebuilds != nil {
if prebuilds.Version != "latest" {
template := `
if ide, ok := ideConfig.IdeOptions.Options[alias]; ok {
pluginStableImage = ide.PluginImage
resp.IdeImageLayers = append(resp.IdeImageLayers, ide.Image)
template := `
echo 'warming up stable release of ${key}...'
echo 'downloading stable ${key} backend...'
mkdir /tmp/backend
curl -sSLo /tmp/backend/backend.tar.gz "https://download.jetbrains.com/product?type=release&distribution=linux&code=${productCode}"
tar -xf /tmp/backend/backend.tar.gz --strip-components=1 --directory /tmp/backend
echo 'configuring JB system config and caches aligned with runtime...'
printf '\nshared.indexes.download.auto.consent=true' >> "/tmp/backend/bin/idea.properties"
unset JAVA_TOOL_OPTIONS
export IJ_HOST_CONFIG_BASE_DIR=/workspace/.config/JetBrains
export IJ_HOST_SYSTEM_BASE_DIR=/workspace/.cache/JetBrains
echo 'running stable ${key} backend in warmup mode...'
/tmp/backend/bin/remote-dev-server.sh warmup "$GITPOD_REPO_ROOT"
echo 'removing stable ${key} backend...'
rm -rf /tmp/backend
JETBRAINS_BACKEND_QUALIFIER=stable /ide-desktop/${key}/status warmup ${key}
`
if code, ok := JetbrainsCode[alias]; ok {
template = strings.ReplaceAll(template, "${key}", alias)
template = strings.ReplaceAll(template, "${productCode}", code)
warmUpTask += template
}
}

if prebuilds.Version != "stable" {
template := `
if ide, ok := ideConfig.IdeOptions.Options[alias]; ok {
pluginLatestImage = ide.PluginLatestImage
resp.IdeImageLayers = append(resp.IdeImageLayers, ide.LatestImage)
template := `
echo 'warming up latest release of ${key}...'
echo 'downloading latest ${key} backend...'
mkdir /tmp/backend-latest
curl -sSLo /tmp/backend-latest/backend-latest.tar.gz "https://download.jetbrains.com/product?type=release,eap,rc&distribution=linux&code=${productCode}"
tar -xf /tmp/backend-latest/backend-latest.tar.gz --strip-components=1 --directory /tmp/backend-latest
echo 'configuring JB system config and caches aligned with runtime...'
printf '\nshared.indexes.download.auto.consent=true' >> "/tmp/backend-latest/bin/idea.properties"
unset JAVA_TOOL_OPTIONS
export IJ_HOST_CONFIG_BASE_DIR=/workspace/.config/JetBrains-latest
export IJ_HOST_SYSTEM_BASE_DIR=/workspace/.cache/JetBrains-latest
echo 'running ${key} backend in warmup mode...'
/tmp/backend-latest/bin/remote-dev-server.sh warmup "$GITPOD_REPO_ROOT"
echo 'removing latest ${key} backend...'
rm -rf /tmp/backend-latest
JETBRAINS_BACKEND_QUALIFIER=latest /ide-desktop/${key}-latest/status warmup ${key}
`
if code, ok := JetbrainsCode[alias]; ok {
template = strings.ReplaceAll(template, "${key}", alias)
template = strings.ReplaceAll(template, "${productCode}", code)
warmUpTask += template
}
}
}
}

if pluginStableImage != "" {
resp.IdeImageLayers = append(resp.IdeImageLayers, pluginStableImage)
}

if pluginLatestImage != "" {
resp.IdeImageLayers = append(resp.IdeImageLayers, pluginLatestImage)
}

if warmUpTask != "" {
warmUpEncoded := new(bytes.Buffer)
enc := json.NewEncoder(warmUpEncoded)
enc.SetEscapeHTML(false)

err := enc.Encode(&[]gitpodapi.TaskConfig{{
Init: strings.TrimSpace(warmUpTask),
Name: "GITPOD_JB_WARMUP_TASK",
}})
if err != nil {
log.WithError(err).Error("cannot marshal warm up task")
Expand All @@ -432,6 +402,7 @@ rm -rf /tmp/backend-latest
resp.Tasks = warmUpEncoded.String()
}
}

return
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
{
"Resp": {
"envvars": [
{
"name": "GITPOD_IDE_ALIAS",
"value": "code"
}
],
"supervisor_image": "eu.gcr.io/gitpod-core-dev/build/supervisor:commit-ff38b98b7dde4929159bcaeec68d178898dc2139",
"web_image": "eu.gcr.io/gitpod-core-dev/build/ide/code:commit-d6329814c2aa34c414574fd0d1301447d6fe82c9"
},
"Err": ""
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"Resp": {
"supervisor_image": "eu.gcr.io/gitpod-core-dev/build/supervisor:commit-ff38b98b7dde4929159bcaeec68d178898dc2139",
"web_image": "eu.gcr.io/gitpod-core-dev/build/ide/code:commit-d6329814c2aa34c414574fd0d1301447d6fe82c9",
"ide_image_layers": [
"eu.gcr.io/gitpod-core-dev/build/ide/intellij:commit-9a6c79a91b2b1f583d5bcb7f9f1ef54ee977e0df",
"eu.gcr.io/gitpod-core-dev/build/ide/goland:commit-9a6c79a91b2b1f583d5bcb7f9f1ef54ee977e0df",
"eu.gcr.io/gitpod-core-dev/build/ide/goland:latest@sha256:e07524e52089829dc8d3b38f7d18fb51b24f07aed7d8e4e6e447899687978d43",
"eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest@sha256:e07524e52089829dc8d3b38f7d18fb51b24f07aed7d8e4e6e447899687978d43",
"eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:commit-b38092639d1783a1957894ddd4f492b3cdc9794a",
"eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:commit-b38092639d1783a1957894ddd4f492b3cdc9794a-latest"
],
"tasks": "[{\"init\":\"echo 'warming up stable release of intellij...'\\nJETBRAINS_BACKEND_QUALIFIER=stable /ide-desktop/intellij/status warmup intellij\\n\\necho 'warming up stable release of goland...'\\nJETBRAINS_BACKEND_QUALIFIER=stable /ide-desktop/goland/status warmup goland\\n\\necho 'warming up latest release of goland...'\\nJETBRAINS_BACKEND_QUALIFIER=latest /ide-desktop/goland-latest/status warmup goland\\n\\necho 'warming up latest release of phpstorm...'\\nJETBRAINS_BACKEND_QUALIFIER=latest /ide-desktop/phpstorm-latest/status warmup phpstorm\",\"name\":\"GITPOD_JB_WARMUP_TASK\"}]\n"
},
"Err": ""
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"type": 1,
"context": "{\"isFile\":false,\"path\":\"\",\"title\":\"gitpod-io/empty \",\"revision\":\"\",\"repository\":{\"cloneUrl\":\"https://github.com/gitpod-io/empty.git\",\"host\":\"github.com\",\"name\":\"empty\",\"owner\":\"gitpod-io\",\"private\":false},\"normalizedContextURL\":\"https://github.com/gitpod-io/empty\",\"checkoutLocation\":\"empty\"}",
"ide_settings": "{\"settingVersion\":\"2.0\",\"defaultIde\":\"code-desktop\",\"useLatestVersion\":false}",
"workspace_config": "{\"tasks\":[{\"init\":\"echo 'init script'\",\"command\":\"echo 'start script'\"}],\"jetbrains\":{\"intellij\":{\"prebuilds\":{\"version\":\"stable\"}},\"phpstorm\":{\"prebuilds\":{\"version\":\"latest\"}},\"goland\":{\"prebuilds\":{\"version\":\"both\"}}},\"_origin\":\"repo\",\"image\":\"docker.io/gitpod/workspace-full:latest\",\"vscode\":{\"extensions\":[]}}"
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
{
"Resp": {
"envvars": [
{
"name": "GITPOD_IDE_ALIAS",
"value": "code"
}
],
"supervisor_image": "eu.gcr.io/gitpod-core-dev/build/supervisor:commit-ff38b98b7dde4929159bcaeec68d178898dc2139",
"web_image": "eu.gcr.io/gitpod-core-dev/build/ide/code:commit-d6329814c2aa34c414574fd0d1301447d6fe82c9"
},
"Err": ""
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"type": 1,
"context": "{\"isFile\":false,\"path\":\"\",\"title\":\"gitpod-io/empty \",\"revision\":\"\",\"repository\":{\"cloneUrl\":\"https://github.com/gitpod-io/empty.git\",\"host\":\"github.com\",\"name\":\"empty\",\"owner\":\"gitpod-io\",\"private\":false},\"normalizedContextURL\":\"https://github.com/gitpod-io/empty\",\"checkoutLocation\":\"empty\"}",
"ide_settings": "{\"settingVersion\":\"2.0\",\"defaultIde\":\"intellj\",\"useLatestVersion\":false}",
"workspace_config": "{\"tasks\":[{\"init\":\"echo 'init script'\",\"command\":\"echo 'start script'\"}],\"_origin\":\"repo\",\"image\":\"docker.io/gitpod/workspace-full:latest\",\"vscode\":{\"extensions\":[]}}"
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
{
"Resp": {
"envvars": [
{
"name": "GITPOD_IDE_ALIAS",
"value": "intellij"
}
],
"supervisor_image": "eu.gcr.io/gitpod-core-dev/build/supervisor:commit-ff38b98b7dde4929159bcaeec68d178898dc2139",
"web_image": "eu.gcr.io/gitpod-core-dev/build/ide/code:commit-d6329814c2aa34c414574fd0d1301447d6fe82c9",
"ide_image_layers": [
"eu.gcr.io/gitpod-core-dev/build/ide/intellij:commit-9a6c79a91b2b1f583d5bcb7f9f1ef54ee977e0df",
"eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:commit-b38092639d1783a1957894ddd4f492b3cdc9794a"
"eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest@sha256:e07524e52089829dc8d3b38f7d18fb51b24f07aed7d8e4e6e447899687978d43",
"eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:commit-b38092639d1783a1957894ddd4f492b3cdc9794a",
"eu.gcr.io/gitpod-core-dev/build/ide/jb-backend-plugin:commit-b38092639d1783a1957894ddd4f492b3cdc9794a-latest"
],
"tasks": "[{\"init\":\"echo 'warming up stable release of intellij...'\\necho 'downloading stable intellij backend...'\\nmkdir /tmp/backend\\ncurl -sSLo /tmp/backend/backend.tar.gz \\\"https://download.jetbrains.com/product?type=release\u0026distribution=linux\u0026code=IIU\\\"\\ntar -xf /tmp/backend/backend.tar.gz --strip-components=1 --directory /tmp/backend\\n\\necho 'configuring JB system config and caches aligned with runtime...'\\nprintf '\\\\nshared.indexes.download.auto.consent=true' \u003e\u003e \\\"/tmp/backend/bin/idea.properties\\\"\\nunset JAVA_TOOL_OPTIONS\\nexport IJ_HOST_CONFIG_BASE_DIR=/workspace/.config/JetBrains\\nexport IJ_HOST_SYSTEM_BASE_DIR=/workspace/.cache/JetBrains\\n\\necho 'running stable intellij backend in warmup mode...'\\n/tmp/backend/bin/remote-dev-server.sh warmup \\\"$GITPOD_REPO_ROOT\\\"\\n\\necho 'removing stable intellij backend...'\\nrm -rf /tmp/backend\\n\\necho 'warming up latest release of intellij...'\\necho 'downloading latest intellij backend...'\\nmkdir /tmp/backend-latest\\ncurl -sSLo /tmp/backend-latest/backend-latest.tar.gz \\\"https://download.jetbrains.com/product?type=release,eap,rc\u0026distribution=linux\u0026code=IIU\\\"\\ntar -xf /tmp/backend-latest/backend-latest.tar.gz --strip-components=1 --directory /tmp/backend-latest\\n\\necho 'configuring JB system config and caches aligned with runtime...'\\nprintf '\\\\nshared.indexes.download.auto.consent=true' \u003e\u003e \\\"/tmp/backend-latest/bin/idea.properties\\\"\\nunset JAVA_TOOL_OPTIONS\\nexport IJ_HOST_CONFIG_BASE_DIR=/workspace/.config/JetBrains-latest\\nexport IJ_HOST_SYSTEM_BASE_DIR=/workspace/.cache/JetBrains-latest\\n\\necho 'running intellij backend in warmup mode...'\\n/tmp/backend-latest/bin/remote-dev-server.sh warmup \\\"$GITPOD_REPO_ROOT\\\"\\n\\necho 'removing latest intellij backend...'\\nrm -rf /tmp/backend-latest\"}]\n"
"tasks": "[{\"init\":\"echo 'warming up stable release of intellij...'\\nJETBRAINS_BACKEND_QUALIFIER=stable /ide-desktop/intellij/status warmup intellij\\n\\necho 'warming up latest release of intellij...'\\nJETBRAINS_BACKEND_QUALIFIER=latest /ide-desktop/intellij-latest/status warmup intellij\",\"name\":\"GITPOD_JB_WARMUP_TASK\"}]\n"
},
"Err": ""
}
Loading

0 comments on commit 377ca81

Please sign in to comment.