Инструменты разработки можно устанавливать скриптами шаблона на постоянный том рабочего пространства. Агент и IDE используют этот том совместно. Установка в /workspace/state сохраняется после остановки и запуска, а файлы проекта остаются в /workspace/code.

Штатные контейнеры работают с UID/GID 10000 и корневой файловой системой только для чтения. Выбирайте дистрибутив инструмента, который можно распаковать в пользовательскую директорию без sudo, apt или apk.

Установка Go

Пример устанавливает Go 1.27.3 на Linux amd64 или arm64. Версия и SHA-256 архивов зафиксированы в скрипте; они опубликованы на странице загрузок Go.

Скрипт установки

Добавьте в черновик шаблона файл scripts/start.sh со следующим содержимым. Если файл уже содержит команды настройки, объедините их с примером:

#!/usr/bin/env bash
set -euo pipefail

: "${DDP_STATE_DIR:?}"
go_version="1.27.3"

case "$(uname -m)" in
  x86_64)
    go_arch="amd64"
    go_checksum="65efbc80fdc1fa2cd2631cad5b481777a68e8725f34e89f50fc6ac714e379b40"
    ;;
  aarch64|arm64)
    go_arch="arm64"
    go_checksum="a06e99309dbcbdca1a8ccd2282c3ee146e55930886e26b4f1193269587165f49"
    ;;
  *)
    printf 'Unsupported architecture: %s\n' "$(uname -m)" >&2
    exit 1
    ;;
esac

toolchains_dir="${DDP_STATE_DIR}/toolchains"
go_directory="${toolchains_dir}/go${go_version}-linux-${go_arch}"
mkdir -p "$toolchains_dir" "${DDP_STATE_DIR}/tools" "${DDP_STATE_DIR}/tmp/go"

if [ ! -d "$go_directory" ]; then
  staging_dir="$(mktemp -d "${toolchains_dir}/.go-install.XXXXXX")"
  trap 'rm -rf "$staging_dir"' EXIT

  curl -fsSL --retry 3 --connect-timeout 15 --max-time 300 "https://go.dev/dl/go${go_version}.linux-${go_arch}.tar.gz" -o "${staging_dir}/go.tar.gz"
  printf '%s  go.tar.gz\n' "$go_checksum" > "${staging_dir}/go.sha256"
  (cd "$staging_dir" && sha256sum -c go.sha256)
  tar -xzf "${staging_dir}/go.tar.gz" -C "$staging_dir"
  mv "${staging_dir}/go" "$go_directory"

  rm -rf "$staging_dir"
  trap - EXIT
fi

ln -sfn "$go_directory" "${DDP_STATE_DIR}/tools/go"
"${DDP_STATE_DIR}/tools/go/bin/go" version

Скрипт скачивает и проверяет архив только при отсутствии выбранной версии на томе. Распаковка выполняется во временной директории на том же томе; готовая установка переносится в директорию версии. При повторном запуске используется сохранённая копия.

Ссылка /workspace/state/tools/go указывает на выбранную версию. Благодаря этому при обновлении версии путь в PATH остаётся прежним.

Используйте start.sh, чтобы пример применялся и к новым, и к уже созданным пространствам после обновления шаблона. create.sh пропускается, если первоначальная настройка тома уже успешно выполнялась.

Окружение агента и IDE

В main.tf добавьте следующие поля в существующий блок local.environment, сохранив остальные поля:

PATH        = "${local.state_directory}/tools/go/bin:${local.state_directory}/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
GOPATH      = "${local.state_directory}/go"
GOCACHE     = "${local.state_directory}/cache/go-build"
GOTMPDIR    = "${local.state_directory}/tmp/go"
CGO_ENABLED = "0"

Штатный шаблон передаёт local.environment контейнеру первоначальной настройки, агенту и IDE. Go и команды, установленные через go install, будут доступны во всех этих контейнерах. Кеш сборки и GOPATH, включая кеш модулей, располагаются на постоянном томе. GOTMPDIR переносит временные файлы компиляции на тот же том, чтобы сборка не занимала ограниченный /tmp контейнера.

Изменение PATH через export внутри start.sh действует только на сам скрипт и его дочерние процессы. Поэтому задавайте переменные в main.tf.

В примере CGO_ENABLED = "0" отключает использование C-компилятора. Он подходит для проектов на Go без зависимостей от C; для проектов с CGo также требуются соответствующий компилятор и системные библиотеки.

Публикация и проверка

Для запуска примера поду нужен HTTPS-доступ к go.dev и адресу загрузки после перенаправления, обычно dl.google.com. Для зависимостей проекта также нужен доступ к выбранному прокси Go-модулей или репозиториям. Если прямой доступ закрыт, разместите тот же архив во внутреннем хранилище и измените URL в скрипте, сохранив проверку SHA-256.

Чтобы применить пример:

  1. Сохраните scripts/start.sh и main.tf, опубликуйте версию и активируйте её.

  2. Создайте новое рабочее пространство либо остановите существующее, обновите его версию шаблона и снова запустите.

  3. В логе контейнера bootstrap на вкладке «Диагностика» проверьте успешную проверку архива и строку go version.

  4. Откройте терминал IDE и проверьте установку:

    go version
    go env GOPATH GOCACHE GOTMPDIR CGO_ENABLED
    command -v go
  5. Попросите агента в чате выполнить go version. Он должен увидеть ту же версию, что и терминал IDE.

  6. Остановите и запустите пространство ещё раз. Go должен остаться доступным; повторное скачивание той же версии не требуется.

Проверка сборки

Для проверки компилятора создайте и запустите программу вне директории проекта. Пример не меняет go.mod и исходные файлы проекта:

mkdir -p /workspace/state/checks/go
cat > /workspace/state/checks/go/hello.go <<'EOF'
package main

import "fmt"

func main() {
    fmt.Println("Go is ready")
}
EOF
go run /workspace/state/checks/go/hello.go

Ожидаемый вывод — Go is ready. Затем выполните проверки самого проекта, например go test ./... из его корневой директории.

Обновление версии инструмента

Для обновления Go измените go_version и обе контрольные суммы архивов в scripts/start.sh. Возьмите значения со страницы загрузок Go, сохраните и опубликуйте новую версию шаблона.

Остановите пространство, обновите шаблон и снова запустите. Скрипт установит новую версию в отдельную директорию и переключит ссылку tools/go. Прежняя версия останется на томе; её директорию можно удалить из терминала после проверки новой версии.

Установка других инструментов

Для других инструментов используйте ту же последовательность: выберите архив под архитектуру и системные библиотеки контейнера, проверьте его контрольную сумму, распакуйте на постоянный том и добавьте исполняемые файлы в окружение шаблона.

Совместимость проверяйте отдельно в агенте и IDE. Штатный агент использует Alpine Linux с musl; для него подходят совместимые с musl или статически скомпонованные бинарные файлы. Совпадения архитектуры процессора недостаточно, если инструмент зависит от системных библиотек.