GenerateDevcontainer generates devcontainer.json and Dockerfile for vscode run-in-container and GitHub Codespaces
(ctx context.Context, generateOpts devopt.GenerateOpts)
| 462 | // GenerateDevcontainer generates devcontainer.json and Dockerfile for vscode run-in-container |
| 463 | // and GitHub Codespaces |
| 464 | func (d *Devbox) GenerateDevcontainer(ctx context.Context, generateOpts devopt.GenerateOpts) error { |
| 465 | ctx, task := trace.NewTask(ctx, "devboxGenerateDevcontainer") |
| 466 | defer task.End() |
| 467 | |
| 468 | // construct path to devcontainer directory |
| 469 | devContainerPath := filepath.Join(d.projectDir, ".devcontainer/") |
| 470 | devContainerJSONPath := filepath.Join(devContainerPath, "devcontainer.json") |
| 471 | dockerfilePath := filepath.Join(devContainerPath, "Dockerfile") |
| 472 | |
| 473 | // check if devcontainer.json or Dockerfile exist |
| 474 | filesExist := fileutil.Exists(devContainerJSONPath) || fileutil.Exists(dockerfilePath) |
| 475 | if !generateOpts.Force && filesExist { |
| 476 | return usererr.New( |
| 477 | "Files devcontainer.json or Dockerfile are already present in .devcontainer/. " + |
| 478 | "Remove the files or use --force to overwrite them.", |
| 479 | ) |
| 480 | } |
| 481 | |
| 482 | // create directory |
| 483 | err := os.MkdirAll(devContainerPath, os.ModePerm) |
| 484 | if err != nil { |
| 485 | return redact.Errorf("error creating dev container directory in <project>/%s: %w", |
| 486 | redact.Safe(filepath.Base(devContainerPath)), err) |
| 487 | } |
| 488 | |
| 489 | // Setup generate parameters |
| 490 | gen := &generate.Options{ |
| 491 | Path: devContainerPath, |
| 492 | RootUser: generateOpts.RootUser, |
| 493 | IsDevcontainer: true, |
| 494 | Pkgs: d.AllPackageNamesIncludingRemovedTriggerPackages(), |
| 495 | LocalFlakeDirs: d.getLocalFlakesDirs(), |
| 496 | } |
| 497 | |
| 498 | // generate dockerfile |
| 499 | err = gen.CreateDockerfile(ctx, generate.CreateDockerfileOptions{}) |
| 500 | if err != nil { |
| 501 | return redact.Errorf("error generating dev container Dockerfile in <project>/%s: %w", |
| 502 | redact.Safe(filepath.Base(devContainerPath)), err) |
| 503 | } |
| 504 | // generate devcontainer.json |
| 505 | err = gen.CreateDevcontainer(ctx) |
| 506 | if err != nil { |
| 507 | return redact.Errorf("error generating devcontainer.json in <project>/%s: %w", |
| 508 | redact.Safe(filepath.Base(devContainerPath)), err) |
| 509 | } |
| 510 | return nil |
| 511 | } |
| 512 | |
| 513 | // GenerateDockerfile generates a Dockerfile that replicates the devbox shell |
| 514 | func (d *Devbox) GenerateDockerfile(ctx context.Context, generateOpts devopt.GenerateOpts) error { |
no test coverage detected