diff --git a/agent/agent.go b/agent/agent.go index f538ef93b4af8..5c171d7d513c7 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -1407,5 +1407,14 @@ func expandDirectory(dir string) (string, error) { } dir = filepath.Join(home, dir[1:]) } - return os.ExpandEnv(dir), nil + dir = os.ExpandEnv(dir) + + if !filepath.IsAbs(dir) { + home, err := userHomeDir() + if err != nil { + return "", err + } + dir = filepath.Join(home, dir) + } + return dir, nil } diff --git a/agent/agent_test.go b/agent/agent_test.go index aa58f22ace474..effaa091b982d 100644 --- a/agent/agent_test.go +++ b/agent/agent_test.go @@ -1391,6 +1391,22 @@ func TestAgent_Startup(t *testing.T) { require.Equal(t, homeDir, client.getStartup().ExpandedDirectory) }) + t.Run("NotAbsoluteDirectory", func(t *testing.T) { + t.Parallel() + + _, client, _, _, _ := setupAgent(t, agentsdk.Manifest{ + StartupScript: "true", + StartupScriptTimeout: 30 * time.Second, + Directory: "coder/coder", + }, 0) + assert.Eventually(t, func() bool { + return client.getStartup().Version != "" + }, testutil.WaitShort, testutil.IntervalFast) + homeDir, err := os.UserHomeDir() + require.NoError(t, err) + require.Equal(t, filepath.Join(homeDir, "coder/coder"), client.getStartup().ExpandedDirectory) + }) + t.Run("HomeEnvironmentVariable", func(t *testing.T) { t.Parallel() diff --git a/docs/templates/open-in-coder.md b/docs/templates/open-in-coder.md index de25e655f0ec4..aa8a0e978c858 100644 --- a/docs/templates/open-in-coder.md +++ b/docs/templates/open-in-coder.md @@ -38,6 +38,12 @@ To support any infrastructure and software stack, Coder provides a generic appro } ``` + > Note: The `dir` attribute can be set in multiple ways, for example: + > + > - `~/coder` + > - `/home/coder/coder` + > - `coder` (relative to the home directory) + - If you want the template to support any repository via [parameters](./parameters.md) ```hcl