@@ -188,20 +188,6 @@ type WorkspaceContext struct {
188
188
ReferrerIde string `json:"referrerIde,omitempty"`
189
189
}
190
190
191
- var JetbrainsCode map [string ]string
192
-
193
- func init () {
194
- JetbrainsCode = make (map [string ]string )
195
- JetbrainsCode ["intellij" ] = "IIU"
196
- JetbrainsCode ["goland" ] = "GO"
197
- JetbrainsCode ["pycharm" ] = "PCP"
198
- JetbrainsCode ["phpstorm" ] = "PS"
199
- JetbrainsCode ["rubymine" ] = "RM"
200
- JetbrainsCode ["webstorm" ] = "WS"
201
- JetbrainsCode ["rider" ] = "RD"
202
- JetbrainsCode ["clion" ] = "CL"
203
- }
204
-
205
191
func (s * IDEServiceServer ) resolveReferrerIDE (ideConfig * config.IDEConfig , wsCtx * WorkspaceContext , chosenIDEName string ) (ideName string , ideOption * config.IDEOption ) {
206
192
if wsCtx == nil || wsCtx .Referrer == "" {
207
193
return
@@ -264,166 +250,149 @@ func (s *IDEServiceServer) ResolveWorkspaceConfig(ctx context.Context, req *api.
264
250
WebImage : defaultIde .Image ,
265
251
}
266
252
267
- // TODO: reconsider this
268
- // if req.Type != api.WorkspaceType_REGULAR {
269
- // return resp, nil
270
- // }
271
-
272
253
var wsConfig * gitpodapi.GitpodConfig
273
- var wsContext * WorkspaceContext
274
- var ideSettings * IDESettings
275
254
276
- if req .IdeSettings != "" {
277
- if err := json .Unmarshal ([]byte (req .IdeSettings ), & ideSettings ); err != nil {
278
- log .WithError (err ).WithField ("ideSetting" , req .IdeSettings ).Error ("failed to parse ide settings" )
279
- }
280
- }
281
255
if req .WorkspaceConfig != "" {
282
256
if err := json .Unmarshal ([]byte (req .WorkspaceConfig ), & wsConfig ); err != nil {
283
257
log .WithError (err ).WithField ("workspaceConfig" , req .WorkspaceConfig ).Error ("failed to parse workspace config" )
284
258
}
285
259
}
286
- if req .Context != "" {
287
- if err := json .Unmarshal ([]byte (req .Context ), & wsContext ); err != nil {
288
- log .WithError (err ).WithField ("context" , req .Context ).Error ("failed to parse context" )
289
- }
290
- }
291
260
292
- userIdeName := ""
293
- useLatest := false
261
+ if req .Type == api .WorkspaceType_REGULAR {
262
+ var ideSettings * IDESettings
263
+ var wsContext * WorkspaceContext
294
264
295
- if ideSettings != nil {
296
- userIdeName = ideSettings .DefaultIde
297
- useLatest = ideSettings .UseLatestVersion
298
- }
265
+ if req .IdeSettings != "" {
266
+ if err := json .Unmarshal ([]byte (req .IdeSettings ), & ideSettings ); err != nil {
267
+ log .WithError (err ).WithField ("ideSetting" , req .IdeSettings ).Error ("failed to parse ide settings" )
268
+ }
269
+ }
299
270
300
- chosenIDE := defaultIde
271
+ if req .Context != "" {
272
+ if err := json .Unmarshal ([]byte (req .Context ), & wsContext ); err != nil {
273
+ log .WithError (err ).WithField ("context" , req .Context ).Error ("failed to parse context" )
274
+ }
275
+ }
301
276
302
- getUserIDEImage := func (ideOption * config.IDEOption ) string {
303
- if useLatest && ideOption .LatestImage != "" {
304
- return ideOption .LatestImage
277
+ userIdeName := ""
278
+ useLatest := false
279
+
280
+ if ideSettings != nil {
281
+ userIdeName = ideSettings .DefaultIde
282
+ useLatest = ideSettings .UseLatestVersion
305
283
}
306
284
307
- return ideOption .Image
308
- }
285
+ chosenIDE := defaultIde
309
286
310
- getUserPluginImage := func (ideOption * config.IDEOption ) string {
311
- if useLatest && ideOption .PluginLatestImage != "" {
312
- return ideOption .PluginLatestImage
287
+ getUserIDEImage := func (ideOption * config.IDEOption ) string {
288
+ if useLatest && ideOption .LatestImage != "" {
289
+ return ideOption .LatestImage
290
+ }
291
+
292
+ return ideOption .Image
313
293
}
314
294
315
- return ideOption .PluginImage
316
- }
295
+ getUserImageLayers := func (ideOption * config.IDEOption ) []string {
296
+ if useLatest {
297
+ return ideOption .LatestImageLayers
298
+ }
317
299
318
- if userIdeName != "" {
319
- if ide , ok := ideConfig .IdeOptions .Options [userIdeName ]; ok {
320
- chosenIDE = & ide
300
+ return ideOption .ImageLayers
301
+ }
321
302
322
- // TODO: Currently this variable reflects the IDE selected in
323
- // user's settings for backward compatibility but in the future
324
- // we want to make it represent the actual IDE.
325
- ideAlias := api.EnvironmentVariable {
326
- Name : "GITPOD_IDE_ALIAS" ,
327
- Value : userIdeName ,
303
+ if userIdeName != "" {
304
+ if ide , ok := ideConfig .IdeOptions .Options [userIdeName ]; ok {
305
+ chosenIDE = & ide
306
+
307
+ // TODO: Currently this variable reflects the IDE selected in
308
+ // user's settings for backward compatibility but in the future
309
+ // we want to make it represent the actual IDE.
310
+ ideAlias := api.EnvironmentVariable {
311
+ Name : "GITPOD_IDE_ALIAS" ,
312
+ Value : userIdeName ,
313
+ }
314
+ resp .Envvars = append (resp .Envvars , & ideAlias )
328
315
}
329
- resp .Envvars = append (resp .Envvars , & ideAlias )
330
316
}
331
- }
332
317
333
- // we always need WebImage for when the user chooses a desktop ide
334
- resp .WebImage = getUserIDEImage (defaultIde )
318
+ // we always need WebImage for when the user chooses a desktop ide
319
+ resp .WebImage = getUserIDEImage (defaultIde )
335
320
336
- var desktopImageLayer string
337
- var desktopPluginImageLayer string
338
- if chosenIDE .Type == config .IDETypeDesktop {
339
- desktopImageLayer = getUserIDEImage (chosenIDE )
340
- desktopPluginImageLayer = getUserPluginImage (chosenIDE )
341
- } else {
342
- resp .WebImage = getUserIDEImage (chosenIDE )
343
- }
321
+ var desktopImageLayer string
322
+ var userImageLayers [] string
323
+ if chosenIDE .Type == config .IDETypeDesktop {
324
+ desktopImageLayer = getUserIDEImage (chosenIDE )
325
+ userImageLayers = getUserImageLayers (chosenIDE )
326
+ } else {
327
+ resp .WebImage = getUserIDEImage (chosenIDE )
328
+ }
344
329
345
- ideName , referrer := s .resolveReferrerIDE (ideConfig , wsContext , userIdeName )
346
- if ideName != "" {
347
- resp .RefererIde = ideName
348
- desktopImageLayer = getUserIDEImage (referrer )
349
- desktopPluginImageLayer = getUserPluginImage (referrer )
350
- }
330
+ ideName , referrer := s .resolveReferrerIDE (ideConfig , wsContext , userIdeName )
331
+ if ideName != "" {
332
+ resp .RefererIde = ideName
333
+ desktopImageLayer = getUserIDEImage (referrer )
334
+ userImageLayers = getUserImageLayers (referrer )
335
+ }
351
336
352
- if desktopImageLayer != "" {
353
- resp .IdeImageLayers = append (resp .IdeImageLayers , desktopImageLayer )
354
- if desktopPluginImageLayer != "" {
355
- resp .IdeImageLayers = append (resp .IdeImageLayers , desktopPluginImageLayer )
337
+ if desktopImageLayer != "" {
338
+ resp .IdeImageLayers = append (resp .IdeImageLayers , desktopImageLayer )
339
+ resp .IdeImageLayers = append (resp .IdeImageLayers , userImageLayers ... )
356
340
}
357
341
}
358
342
359
343
jbGW , ok := ideConfig .IdeOptions .Clients ["jetbrains-gateway" ]
360
344
if req .Type == api .WorkspaceType_PREBUILD && ok {
361
345
warmUpTask := ""
346
+ imageLayers := make (map [string ]struct {})
362
347
for _ , alias := range jbGW .DesktopIDEs {
363
348
prebuilds := getPrebuilds (wsConfig , alias )
364
349
if prebuilds != nil {
365
350
if prebuilds .Version != "latest" {
366
- template := `
351
+ if ide , ok := ideConfig .IdeOptions .Options [alias ]; ok {
352
+ for _ , ideImageLayer := range ide .ImageLayers {
353
+ if _ , ok := imageLayers [ideImageLayer ]; ! ok {
354
+ imageLayers [ideImageLayer ] = struct {}{}
355
+ resp .IdeImageLayers = append (resp .IdeImageLayers , ideImageLayer )
356
+ }
357
+ }
358
+ resp .IdeImageLayers = append (resp .IdeImageLayers , ide .Image )
359
+ template := `
367
360
echo 'warming up stable release of ${key}...'
368
- echo 'downloading stable ${key} backend...'
369
- mkdir /tmp/backend
370
- curl -sSLo /tmp/backend/backend.tar.gz "https://download.jetbrains.com/product?type=release&distribution=linux&code=${productCode}"
371
- tar -xf /tmp/backend/backend.tar.gz --strip-components=1 --directory /tmp/backend
372
-
373
- echo 'configuring JB system config and caches aligned with runtime...'
374
- printf '\nshared.indexes.download.auto.consent=true' >> "/tmp/backend/bin/idea.properties"
375
- unset JAVA_TOOL_OPTIONS
376
- export IJ_HOST_CONFIG_BASE_DIR=/workspace/.config/JetBrains
377
- export IJ_HOST_SYSTEM_BASE_DIR=/workspace/.cache/JetBrains
378
-
379
- echo 'running stable ${key} backend in warmup mode...'
380
- /tmp/backend/bin/remote-dev-server.sh warmup "$GITPOD_REPO_ROOT"
381
-
382
- echo 'removing stable ${key} backend...'
383
- rm -rf /tmp/backend
361
+ JETBRAINS_BACKEND_QUALIFIER=stable /ide-desktop/jb-launcher warmup ${key}
384
362
`
385
- if code , ok := JetbrainsCode [alias ]; ok {
386
363
template = strings .ReplaceAll (template , "${key}" , alias )
387
- template = strings .ReplaceAll (template , "${productCode}" , code )
388
364
warmUpTask += template
389
365
}
390
366
}
391
367
392
368
if prebuilds .Version != "stable" {
393
- template := `
369
+ if ide , ok := ideConfig .IdeOptions .Options [alias ]; ok {
370
+ for _ , latestIdeImageLayer := range ide .LatestImageLayers {
371
+ if _ , ok := imageLayers [latestIdeImageLayer ]; ! ok {
372
+ imageLayers [latestIdeImageLayer ] = struct {}{}
373
+ resp .IdeImageLayers = append (resp .IdeImageLayers , latestIdeImageLayer )
374
+ }
375
+ }
376
+ resp .IdeImageLayers = append (resp .IdeImageLayers , ide .LatestImage )
377
+ template := `
394
378
echo 'warming up latest release of ${key}...'
395
- echo 'downloading latest ${key} backend...'
396
- mkdir /tmp/backend-latest
397
- curl -sSLo /tmp/backend-latest/backend-latest.tar.gz "https://download.jetbrains.com/product?type=release,eap,rc&distribution=linux&code=${productCode}"
398
- tar -xf /tmp/backend-latest/backend-latest.tar.gz --strip-components=1 --directory /tmp/backend-latest
399
-
400
- echo 'configuring JB system config and caches aligned with runtime...'
401
- printf '\nshared.indexes.download.auto.consent=true' >> "/tmp/backend-latest/bin/idea.properties"
402
- unset JAVA_TOOL_OPTIONS
403
- export IJ_HOST_CONFIG_BASE_DIR=/workspace/.config/JetBrains-latest
404
- export IJ_HOST_SYSTEM_BASE_DIR=/workspace/.cache/JetBrains-latest
405
-
406
- echo 'running ${key} backend in warmup mode...'
407
- /tmp/backend-latest/bin/remote-dev-server.sh warmup "$GITPOD_REPO_ROOT"
408
-
409
- echo 'removing latest ${key} backend...'
410
- rm -rf /tmp/backend-latest
379
+ JETBRAINS_BACKEND_QUALIFIER=latest /ide-desktop/jb-launcher warmup ${key}
411
380
`
412
- if code , ok := JetbrainsCode [alias ]; ok {
413
381
template = strings .ReplaceAll (template , "${key}" , alias )
414
- template = strings .ReplaceAll (template , "${productCode}" , code )
415
382
warmUpTask += template
416
383
}
417
384
}
418
385
}
419
386
}
387
+
420
388
if warmUpTask != "" {
421
389
warmUpEncoded := new (bytes.Buffer )
422
390
enc := json .NewEncoder (warmUpEncoded )
423
391
enc .SetEscapeHTML (false )
424
392
425
393
err := enc .Encode (& []gitpodapi.TaskConfig {{
426
394
Init : strings .TrimSpace (warmUpTask ),
395
+ Name : "GITPOD_JB_WARMUP_TASK" ,
427
396
}})
428
397
if err != nil {
429
398
log .WithError (err ).Error ("cannot marshal warm up task" )
@@ -432,6 +401,7 @@ rm -rf /tmp/backend-latest
432
401
resp .Tasks = warmUpEncoded .String ()
433
402
}
434
403
}
404
+
435
405
return
436
406
}
437
407
0 commit comments