@@ -7,6 +7,9 @@ terraform {
77 source= " kreuzwerker/docker"
88 version= " ~> 3.0.0"
99 }
10+ envbuilder = {
11+ source= " coder/envbuilder"
12+ }
1013 }
1114}
1215
@@ -336,33 +339,49 @@ resource "docker_image" "envbuilder" {
336339keep_locally = true
337340}
338341
342+ locals {
343+ cache_repo = " us-central1-docker.pkg.dev/coder-dogfood-v2/envbuilder-cache/coder-dogfood"
344+ envbuilder_env = {
345+ " CODER_AGENT_TOKEN" : coder_agent.dev.token,
346+ " CODER_AGENT_URL" : data.coder_workspace.me.access_url,
347+ " ENVBUILDER_GIT_USERNAME" : data.coder_external_auth.github.access_token,
348+ # "ENVBUILDER_GIT_URL" : data.coder_parameter.devcontainer_repo.value, # The provider sets this via the `git_url` property.
349+ " ENVBUILDER_DEVCONTAINER_DIR" : data.coder_parameter.devcontainer_dir.value,
350+ " ENVBUILDER_INIT_SCRIPT" : coder_agent.dev.init_script,
351+ " ENVBUILDER_FALLBACK_IMAGE" : " codercom/oss-dogfood:latest" ,# This image runs if builds fail
352+ " ENVBUILDER_PUSH_IMAGE" : " true" ,# Push the image to the remote cache
353+ # "ENVBUILDER_CACHE_REPO" : local.cache_repo, # The provider sets this via the `cache_repo` property.
354+ " ENVBUILDER_DOCKER_CONFIG_BASE64" : data.local_sensitive_file.envbuilder_cache_dockerconfigjson.content_base64,
355+ " USE_CAP_NET_ADMIN" : " true" ,
356+ # Set git commit details correctly
357+ " GIT_AUTHOR_NAME" : coalesce (data. coder_workspace_owner . me . full_name , data. coder_workspace_owner . me . name ),
358+ " GIT_AUTHOR_EMAIL" : data.coder_workspace_owner.me.email,
359+ " GIT_COMMITTER_NAME" : coalesce (data. coder_workspace_owner . me . full_name , data. coder_workspace_owner . me . name ),
360+ " GIT_COMMITTER_EMAIL" : data.coder_workspace_owner.me.email,
361+ }
362+ }
363+
364+ # Check for the presence of a prebuilt image in the cache repo
365+ # that we can use instead.
366+ resource "envbuilder_cached_image" "cached" {
367+ count = data. coder_workspace . me . start_count
368+ builder_image = docker_image. envbuilder . name
369+ git_url = data. coder_parameter . devcontainer_repo . value
370+ cache_repo = local. cache_repo
371+ extra_env = local. envbuilder_env
372+ }
373+
339374resource "docker_container" "workspace" {
340375count = data. coder_workspace . me . start_count
341- image = docker_image . envbuilder . name
376+ image = envbuilder_cached_image . cached . 0 . image
342377name = local. container_name
343378# Hostname makes the shell more user friendly: coder@my-workspace:~$
344379hostname = data. coder_workspace . me . name
345380# CPU limits are unnecessary since Docker will load balance automatically
346381memory = 32768
347382runtime = " sysbox-runc"
348- env = [
349- " CODER_AGENT_TOKEN=${ coder_agent . dev . token } " ,
350- " CODER_AGENT_URL=${ data . coder_workspace . me . access_url } " ,
351- " ENVBUILDER_GIT_USERNAME=${ data . coder_external_auth . github . access_token } " ,
352- " ENVBUILDER_GIT_URL=${ data . coder_parameter . devcontainer_repo . value } " ,
353- " ENVBUILDER_DEVCONTAINER_DIR=${ data . coder_parameter . devcontainer_dir . value } " ,
354- " ENVBUILDER_INIT_SCRIPT=${ coder_agent . dev . init_script } " ,
355- " ENVBUILDER_FALLBACK_IMAGE=codercom/oss-dogfood:latest" ,# This image runs if builds fail
356- # "ENVBUILDER_PUSH_IMAGE=1", # Push the image to the remote cache
357- " ENVBUILDER_CACHE_REPO=us-central1-docker.pkg.dev/coder-dogfood-v2/envbuilder-cache/coder-dogfood" ,
358- " ENVBUILDER_DOCKER_CONFIG_BASE64=${ data . local_sensitive_file . envbuilder_cache_dockerconfigjson . content_base64 } " ,
359- " USE_CAP_NET_ADMIN=true" ,
360- # Set git commit details correctly
361- " GIT_AUTHOR_NAME=${ coalesce (data. coder_workspace_owner . me . full_name , data. coder_workspace_owner . me . name )} " ,
362- " GIT_AUTHOR_EMAIL=${ data . coder_workspace_owner . me . email } " ,
363- " GIT_COMMITTER_NAME=${ coalesce (data. coder_workspace_owner . me . full_name , data. coder_workspace_owner . me . name )} " ,
364- " GIT_COMMITTER_EMAIL=${ data . coder_workspace_owner . me . email } " ,
365- ]
383+ # Use environment computed from the provider
384+ env = envbuilder_cached_image. cached . 0 . env
366385host {
367386host = " host.docker.internal"
368387ip = " host-gateway"
@@ -401,7 +420,7 @@ resource "docker_container" "workspace" {
401420
402421resource "coder_metadata" "container_info" {
403422count = data. coder_workspace . me . start_count
404- resource_id = docker_container . workspace [ 0 ] . id
423+ resource_id = coder_agent . dev . id
405424item {
406425key = " memory"
407426value = docker_container. workspace [0 ]. memory