diff --git a/task_test.go b/task_test.go index 662f0b67..207b08b6 100644 --- a/task_test.go +++ b/task_test.go @@ -1200,8 +1200,10 @@ func TestIncludesInterpolation(t *testing.T) { expectedOutput string }{ {"include", "include", false, "include\n"}, + {"include_with_env_variable", "include-with-env-variable", false, "include_with_env_variable\n"}, {"include_with_dir", "include-with-dir", false, "included\n"}, } + t.Setenv("MODULE", "included") for _, test := range tests { t.Run(test.name, func(t *testing.T) { diff --git a/taskfile/reader.go b/taskfile/reader.go index e67bb11f..1c22dc71 100644 --- a/taskfile/reader.go +++ b/taskfile/reader.go @@ -11,6 +11,7 @@ import ( "gopkg.in/yaml.v3" "github.com/go-task/task/v3/errors" + "github.com/go-task/task/v3/internal/compiler" "github.com/go-task/task/v3/internal/filepathext" "github.com/go-task/task/v3/internal/logger" "github.com/go-task/task/v3/internal/templater" @@ -97,9 +98,11 @@ func (r *Reader) include(node Node) error { // Loop over each included taskfile _ = vertex.Taskfile.Includes.Range(func(namespace string, include *ast.Include) error { + vars := compiler.GetEnviron() + vars.Merge(vertex.Taskfile.Vars, nil) // Start a goroutine to process each included Taskfile g.Go(func() error { - cache := &templater.Cache{Vars: vertex.Taskfile.Vars} + cache := &templater.Cache{Vars: vars} include = &ast.Include{ Namespace: include.Namespace, Taskfile: templater.Replace(include.Taskfile, cache), diff --git a/testdata/includes_interpolation/include_with_env_variable/Taskfile.yml b/testdata/includes_interpolation/include_with_env_variable/Taskfile.yml new file mode 100644 index 00000000..e9a8dea0 --- /dev/null +++ b/testdata/includes_interpolation/include_with_env_variable/Taskfile.yml @@ -0,0 +1,4 @@ +version: "3" + +includes: + include-with-env-variable: '../{{.MODULE}}/Taskfile.yml' diff --git a/website/docs/experiments/remote_taskfiles.mdx b/website/docs/experiments/remote_taskfiles.mdx index 9c83ab1c..ba2e825b 100644 --- a/website/docs/experiments/remote_taskfiles.mdx +++ b/website/docs/experiments/remote_taskfiles.mdx @@ -48,6 +48,17 @@ tasks: and you run `task my-remote-namespace:hello`, it will print the text: "Hello from the remote Taskfile!" to your console. +URL is processed by the templating system, so you can reference environment variable in your URL to have authentication, for example : + +```yaml +version: '3' + +includes: + my-remote-namespace: https://{{.TOKEN}}@raw.githubusercontent.com/my-org/my-repo/main/Taskfile.yml +``` + +`TOKEN=my-token task my-remote-namespace:hello` will be resolved by Task to `https://my-token@raw.githubusercontent.com/my-org/my-repo/main/Taskfile.yml` + ## Security Running commands from sources that you do not control is always a potential