Using developer environments¶
Developer environments are preconfigured workspaces that provide everything required for contributing to the Agent code base, testing changes and building release artifacts. Usually, these are images that run using a container orchestrator like Docker or Podman.
This tutorial will walk through how to use such environments with the dda env dev
command group.
Note
This tutorial assumes you have already set up the development requirements.
Overview¶
A developer environment may be used either as an ephemeral or persistent workspace. Multiple environments can be used concurrently, with each using a different checkout of the Agent repository.
To get an idea of upcoming interactions, run dda env dev
and you should see the following output.
$ dda env dev
Usage: dda env dev [OPTIONS] COMMAND [ARGS]...
╭─ Options ────────────────────────────────────────────────────────────╮
│ --help -h Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────╮
│ cache Manage the cache │
│ code Open a code editor for the developer environment │
│ gui Access a developer environment through a graphical interface │
│ remove Remove a developer environment │
│ run Run a command within a developer environment │
│ shell Spawn a shell within a developer environment │
│ show Show the available developer environments │
│ start Start a developer environment │
│ status Check the status of a developer environment │
│ stop Stop a developer environment │
╰──────────────────────────────────────────────────────────────────────╯
Environment selection¶
When an environment is started, there are two options that permanently influence the environment until it is removed.
- The
--id
option sets the identifier that subsequent commands use to target the environment. All commands use the worddefault
if no ID is provided. Environments of different types can have the same ID. -
The
-t
/--type
option selects the type of developer environment. The following types are available:linux-container
- This runs the Linux developer environment and is the default type on non-Windows systems.
More types will be added in the future. All non-macOS cloud environments will simply use the developer environment containers.
Note
The default type on Windows is windows-container
but that is not yet implemented. As a temporary workaround, use the linux-container
type with the -t
/--type
start command option or configure dda
to use it as the default type for developer environments with the following command.
Starting environments¶
You can start an environment with the dda env dev start
command. All developer environment types support the following options.
Repository location¶
You may select where the code resides when starting an environment.
Local checkout¶
The default behavior assumes a local checkout of the Agent repository. Clone the repo if you haven't already.
Then enter the cloned directory and run the following command to start an environment.
Warning
There are two downsides to this approach.
- It's not possible to have multiple environments using a separate checkout of the Agent repository i.e. you inherit the limitations of a usual Git checkout.
- Bind mounts may experience performance issues, particularly for Git operations.
Remote clone¶
You can start an environment with a fresh clone of the Agent repository by passing the --clone
flag.
You can also configure dda
to always clone repositories for developer environments with the following command.
This will perform a shallow clone of the default branch, main
.
Repository selection¶
Note
This functionality has no effect when using a local checkout.
The -r
/--repo
option selects the Datadog repositories to clone and may be supplied multiple times. By default, only the datadog-agent
repository is chosen.
The first selected repository becomes the default location for the environment such as when running commands or entering a shell.
Type-specific options¶
Each developer environment type has additional options that are only available when using that type. For example, the linux-container
type supports a --no-pull
flag to disable the automatic pull of the latest image.
The help text displays options for the default type. In order to see options for a specific type, use the -t
/--type
option before the help flag like in the following example.
Environment status¶
You can check the status of an environment by running the following command.
This shows the environment's state and any extra information that may be useful for debugging.
Environments have the following possible states.
started
- The environment is running.stopped
- The environment is stopped.starting
- The environment is starting.stopping
- The environment is stopping.error
- The environment is in an error state.nonexistent
- The environment does not exist.unknown
- The environment is in an unknown state.
Entering a shell¶
You can spawn a shell within an environment by running the following command.
This opens a shell within the first defined repository.
Preparing for development¶
Run the following command in the environment's shell to install some remaining dependencies.
If you're using a remote clone, some builds may fail due to the shallow cloning. To acquire all Git history, run the following command.
Testing¶
Verify your setup by running some unit tests with the following command.
Editing code¶
Exit the environment's shell or open a new session and run the following command locally.
This opens one of the supported editors for the repository selected with the -r
/--repo
option, defaulting to the first defined repository. The editor may take a few moments to start up the first time it opens in an environment.
The editor may be selected with the -e
/--editor
option or by configuring dda
to use a specific editor for developer environments by default with the following command.
To test functionality, create a file test.txt
at the root of the repository and save it.
Running commands¶
You can run commands within an environment without entering a shell by passing arbitrary arguments to the dda env dev run
command locally. Confirm the file test.txt
was created by running the following command.
The repository in which to run the command is determined by the -r
/--repo
option, defaulting to the first defined repository.
Building¶
Let's build the default Agent by running the following command locally.
Confirm that the binary was successfully built by running the following command.
If you're using a local checkout you should also see that binary on your local machine. This strategy extends to other build artifacts so you could, for example, build the Debian package and install it on an arbitrary machine running Ubuntu.
Caveat
Environments using a remote clone have no easier way to share build artifacts with your local machine than to use the docker cp
command. This is a temporary limitation.
Stopping environments¶
You can stop an environment by running the following command.
This stops the environment but does not remove it. Environments can be started again at any time from a stopped state. When this happens, the start command only accepts options for environment selection.
Removing environments¶
Environments can be removed by running the following command.
This removes the environment and all associated data.