1
0
mirror of https://github.com/go-task/task.git synced 2025-02-13 13:59:32 +02:00

feat(remote): replace env variable in include remote URL (#1610)

* feat(remote): replace env variable in include remote URL

* use templating system instead of os.ExpandEnv

* lint
This commit is contained in:
Valentin Maerten 2024-04-29 23:27:30 +02:00 committed by GitHub
parent e23ef818ea
commit c81dbda157
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 21 additions and 1 deletions

View File

@ -1200,8 +1200,10 @@ func TestIncludesInterpolation(t *testing.T) {
expectedOutput string expectedOutput string
}{ }{
{"include", "include", false, "include\n"}, {"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"}, {"include_with_dir", "include-with-dir", false, "included\n"},
} }
t.Setenv("MODULE", "included")
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {

View File

@ -11,6 +11,7 @@ import (
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
"github.com/go-task/task/v3/errors" "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/filepathext"
"github.com/go-task/task/v3/internal/logger" "github.com/go-task/task/v3/internal/logger"
"github.com/go-task/task/v3/internal/templater" "github.com/go-task/task/v3/internal/templater"
@ -97,9 +98,11 @@ func (r *Reader) include(node Node) error {
// Loop over each included taskfile // Loop over each included taskfile
_ = vertex.Taskfile.Includes.Range(func(namespace string, include *ast.Include) error { _ = 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 // Start a goroutine to process each included Taskfile
g.Go(func() error { g.Go(func() error {
cache := &templater.Cache{Vars: vertex.Taskfile.Vars} cache := &templater.Cache{Vars: vars}
include = &ast.Include{ include = &ast.Include{
Namespace: include.Namespace, Namespace: include.Namespace,
Taskfile: templater.Replace(include.Taskfile, cache), Taskfile: templater.Replace(include.Taskfile, cache),

View File

@ -0,0 +1,4 @@
version: "3"
includes:
include-with-env-variable: '../{{.MODULE}}/Taskfile.yml'

View File

@ -48,6 +48,17 @@ tasks:
and you run `task my-remote-namespace:hello`, it will print the text: "Hello and you run `task my-remote-namespace:hello`, it will print the text: "Hello
from the remote Taskfile!" to your console. 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 ## Security
Running commands from sources that you do not control is always a potential Running commands from sources that you do not control is always a potential