@@ -6,6 +6,10 @@ terraform {
6
6
source = " coder/coder"
7
7
version = " >= 0.17"
8
8
}
9
+ http = {
10
+ source = " hashicorp/http"
11
+ version = " >= 3.0"
12
+ }
9
13
}
10
14
}
11
15
@@ -46,6 +50,22 @@ variable "coder_parameter_order" {
46
50
default = null
47
51
}
48
52
53
+ variable "latest" {
54
+ type = bool
55
+ description = " Whether to fetch the latest version of the IDE."
56
+ default = false
57
+ }
58
+
59
+ variable "channel" {
60
+ type = string
61
+ description = " JetBrains IDE release channel. Valid values are release and eap."
62
+ default = " release"
63
+ validation {
64
+ condition = can (regex (" ^(release|eap)$" , var. channel ))
65
+ error_message = " The channel must be either release or eap."
66
+ }
67
+ }
68
+
49
69
variable "jetbrains_ide_versions" {
50
70
type = map (object ({
51
71
build_number = string
@@ -120,6 +140,11 @@ variable "jetbrains_ides" {
120
140
}
121
141
}
122
142
143
+ data "http" "jetbrains_ide_versions" {
144
+ for_each = var. latest ? toset (var. jetbrains_ides ) : toset ([])
145
+ url = " https://data.services.jetbrains.com/products/releases?code=${ each . key } &latest=true&type=${ var . channel } "
146
+ }
147
+
123
148
locals {
124
149
jetbrains_ides = {
125
150
" GO" = {
@@ -128,57 +153,74 @@ locals {
128
153
identifier = " GO" ,
129
154
build_number = var.jetbrains_ide_versions[" GO" ].build_number,
130
155
download_link = " https://download.jetbrains.com/go/goland-${ var . jetbrains_ide_versions [" GO" ]. version } .tar.gz"
156
+ version = var.jetbrains_ide_versions[" GO" ].version
131
157
},
132
158
" WS" = {
133
159
icon = " /icon/webstorm.svg" ,
134
160
name = " WebStorm" ,
135
161
identifier = " WS" ,
136
162
build_number = var.jetbrains_ide_versions[" WS" ].build_number,
137
163
download_link = " https://download.jetbrains.com/webstorm/WebStorm-${ var . jetbrains_ide_versions [" WS" ]. version } .tar.gz"
164
+ version = var.jetbrains_ide_versions[" WS" ].version
138
165
},
139
166
" IU" = {
140
167
icon = " /icon/intellij.svg" ,
141
168
name = " IntelliJ IDEA Ultimate" ,
142
169
identifier = " IU" ,
143
170
build_number = var.jetbrains_ide_versions[" IU" ].build_number,
144
171
download_link = " https://download.jetbrains.com/idea/ideaIU-${ var . jetbrains_ide_versions [" IU" ]. version } .tar.gz"
172
+ version = var.jetbrains_ide_versions[" IU" ].version
145
173
},
146
174
" PY" = {
147
175
icon = " /icon/pycharm.svg" ,
148
176
name = " PyCharm Professional" ,
149
177
identifier = " PY" ,
150
178
build_number = var.jetbrains_ide_versions[" PY" ].build_number,
151
179
download_link = " https://download.jetbrains.com/python/pycharm-professional-${ var . jetbrains_ide_versions [" PY" ]. version } .tar.gz"
180
+ version = var.jetbrains_ide_versions[" PY" ].version
152
181
},
153
182
" CL" = {
154
183
icon = " /icon/clion.svg" ,
155
184
name = " CLion" ,
156
185
identifier = " CL" ,
157
186
build_number = var.jetbrains_ide_versions[" CL" ].build_number,
158
187
download_link = " https://download.jetbrains.com/cpp/CLion-${ var . jetbrains_ide_versions [" CL" ]. version } .tar.gz"
188
+ version = var.jetbrains_ide_versions[" CL" ].version
159
189
},
160
190
" PS" = {
161
191
icon = " /icon/phpstorm.svg" ,
162
192
name = " PhpStorm" ,
163
193
identifier = " PS" ,
164
194
build_number = var.jetbrains_ide_versions[" PS" ].build_number,
165
195
download_link = " https://download.jetbrains.com/webide/PhpStorm-${ var . jetbrains_ide_versions [" PS" ]. version } .tar.gz"
196
+ version = var.jetbrains_ide_versions[" PS" ].version
166
197
},
167
198
" RM" = {
168
199
icon = " /icon/rubymine.svg" ,
169
200
name = " RubyMine" ,
170
201
identifier = " RM" ,
171
202
build_number = var.jetbrains_ide_versions[" RM" ].build_number,
172
203
download_link = " https://download.jetbrains.com/ruby/RubyMine-${ var . jetbrains_ide_versions [" RM" ]. version } .tar.gz"
204
+ version = var.jetbrains_ide_versions[" RM" ].version
173
205
}
174
206
" RD" = {
175
207
icon = " /icon/rider.svg" ,
176
208
name = " Rider" ,
177
209
identifier = " RD" ,
178
210
build_number = var.jetbrains_ide_versions[" RD" ].build_number,
179
211
download_link = " https://download.jetbrains.com/rider/JetBrains.Rider-${ var . jetbrains_ide_versions [" RD" ]. version } .tar.gz"
212
+ version = var.jetbrains_ide_versions[" RD" ].version
180
213
}
181
214
}
215
+
216
+ icon = try (lookup (local. jetbrains_ides , data. coder_parameter . jetbrains_ide . value ). icon , " /icon/gateway.svg" )
217
+ json_data = var. latest ? jsondecode (data. http . jetbrains_ide_versions [data . coder_parameter . jetbrains_ide . value ]. response_body ) : {}
218
+ key = var. latest ? keys (local. json_data )[0 ] : " "
219
+ display_name = local. jetbrains_ides [data . coder_parameter . jetbrains_ide . value ]. name
220
+ identifier = data. coder_parameter . jetbrains_ide . value
221
+ download_link = var. latest ? local. json_data [local . key ][0 ]. downloads . linux . link : local. jetbrains_ides [data . coder_parameter . jetbrains_ide . value ]. download_link
222
+ build_number = var. latest ? local. json_data [local . key ][0 ]. build : local. jetbrains_ides [data . coder_parameter . jetbrains_ide . value ]. build_number
223
+ version = var. latest ? local. json_data [local . key ][0 ]. version : var. jetbrains_ide_versions [data . coder_parameter . jetbrains_ide . value ]. version
182
224
}
183
225
184
226
data "coder_parameter" "jetbrains_ide" {
@@ -193,9 +235,9 @@ data "coder_parameter" "jetbrains_ide" {
193
235
dynamic "option" {
194
236
for_each = var. jetbrains_ides
195
237
content {
196
- icon = lookup ( local. jetbrains_ides , option. value ) . icon
197
- name = lookup ( local. jetbrains_ides , option. value ) . name
198
- value = lookup (local . jetbrains_ides , option. value ) . identifier
238
+ icon = local. jetbrains_ides [ option . value ] . icon
239
+ name = local. jetbrains_ides [ option . value ] . name
240
+ value = option. value
199
241
}
200
242
}
201
243
}
@@ -205,8 +247,8 @@ data "coder_workspace" "me" {}
205
247
resource "coder_app" "gateway" {
206
248
agent_id = var. agent_id
207
249
slug = " gateway"
208
- display_name = try (lookup (local . jetbrains_ides , data. coder_parameter . jetbrains_ide . value ). name , " JetBrains IDE" )
209
- icon = try (lookup (local . jetbrains_ides , data. coder_parameter . jetbrains_ide . value ). icon , " /icon/gateway.svg" )
250
+ display_name = try (lookup (data . coder_parameter . jetbrains_ide . option , data. coder_parameter . jetbrains_ide . value ). name , " JetBrains IDE" )
251
+ icon = try (lookup (data . coder_parameter . jetbrains_ide . option , data. coder_parameter . jetbrains_ide . value ). icon , " /icon/gateway.svg" )
210
252
external = true
211
253
order = var. order
212
254
url = join (" " , [
@@ -221,36 +263,36 @@ resource "coder_app" "gateway" {
221
263
" &token=" ,
222
264
" $SESSION_TOKEN" ,
223
265
" &ide_product_code=" ,
224
- local . jetbrains_ides [ data . coder_parameter . jetbrains_ide . value ] . identifier ,
266
+ data . coder_parameter . jetbrains_ide . value ,
225
267
" &ide_build_number=" ,
226
- local . jetbrains_ides [ data . coder_parameter . jetbrains_ide . value ] . build_number ,
268
+ local . build_number ,
227
269
" &ide_download_link=" ,
228
- local . jetbrains_ides [ data . coder_parameter . jetbrains_ide . value ] . download_link
270
+ local . download_link ,
229
271
])
230
272
}
231
273
232
274
output "identifier" {
233
- value = data . coder_parameter . jetbrains_ide . value
275
+ value = local . identifier
234
276
}
235
277
236
- output "name " {
237
- value = coder_app . gateway . display_name
278
+ output "display_name " {
279
+ value = local . display_name
238
280
}
239
281
240
282
output "icon" {
241
- value = coder_app . gateway . icon
283
+ value = local . icon
242
284
}
243
285
244
286
output "download_link" {
245
- value = lookup ( local. jetbrains_ides , data . coder_parameter . jetbrains_ide . value ) . download_link
287
+ value = local. download_link
246
288
}
247
289
248
290
output "build_number" {
249
- value = lookup ( local. jetbrains_ides , data . coder_parameter . jetbrains_ide . value ) . build_number
291
+ value = local. build_number
250
292
}
251
293
252
294
output "version" {
253
- value = var . jetbrains_ide_versions [ data . coder_parameter . jetbrains_ide . value ] . version
295
+ value = local . version
254
296
}
255
297
256
298
output "url" {
0 commit comments