mirror of https://github.com/databricks/cli.git
Support relative paths in artifact files source section and always upload all artifact files (#1247)
Support relative paths in artifact files source section and always upload all artifact files Fixes #1156 ## Tests Added unit tests
This commit is contained in:
parent
09d1846e13
commit
ecf9c52f61
|
@ -121,13 +121,6 @@ func uploadArtifact(ctx context.Context, b *bundle.Bundle, a *config.Artifact, u
|
||||||
for i := range a.Files {
|
for i := range a.Files {
|
||||||
f := &a.Files[i]
|
f := &a.Files[i]
|
||||||
|
|
||||||
// Lookup all tasks that reference this file.
|
|
||||||
libs, ok := filesToLibraries[f.Source]
|
|
||||||
if !ok {
|
|
||||||
log.Debugf(ctx, "No tasks reference %s. Skipping upload.", f.Source)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
filename := filepath.Base(f.Source)
|
filename := filepath.Base(f.Source)
|
||||||
cmdio.LogString(ctx, fmt.Sprintf("Uploading %s...", filename))
|
cmdio.LogString(ctx, fmt.Sprintf("Uploading %s...", filename))
|
||||||
|
|
||||||
|
@ -139,6 +132,13 @@ func uploadArtifact(ctx context.Context, b *bundle.Bundle, a *config.Artifact, u
|
||||||
log.Infof(ctx, "Upload succeeded")
|
log.Infof(ctx, "Upload succeeded")
|
||||||
f.RemotePath = path.Join(uploadPath, filepath.Base(f.Source))
|
f.RemotePath = path.Join(uploadPath, filepath.Base(f.Source))
|
||||||
|
|
||||||
|
// Lookup all tasks that reference this file.
|
||||||
|
libs, ok := filesToLibraries[f.Source]
|
||||||
|
if !ok {
|
||||||
|
log.Debugf(ctx, "No tasks reference %s", f.Source)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// Update all tasks that reference this file.
|
// Update all tasks that reference this file.
|
||||||
for _, lib := range libs {
|
for _, lib := range libs {
|
||||||
wsfsBase := "/Workspace"
|
wsfsBase := "/Workspace"
|
||||||
|
|
|
@ -49,7 +49,8 @@ func (m *build) Apply(ctx context.Context, b *bundle.Bundle) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !filepath.IsAbs(artifact.Path) {
|
if !filepath.IsAbs(artifact.Path) {
|
||||||
artifact.Path = filepath.Join(b.Config.Path, artifact.Path)
|
dirPath := filepath.Dir(artifact.ConfigFilePath)
|
||||||
|
artifact.Path = filepath.Join(dirPath, artifact.Path)
|
||||||
}
|
}
|
||||||
|
|
||||||
return bundle.Apply(ctx, b, getBuildMutator(artifact.Type, m.name))
|
return bundle.Apply(ctx, b, getBuildMutator(artifact.Type, m.name))
|
||||||
|
|
|
@ -3,8 +3,10 @@ package artifacts
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/databricks/cli/bundle"
|
"github.com/databricks/cli/bundle"
|
||||||
|
"github.com/databricks/cli/bundle/config"
|
||||||
"github.com/databricks/databricks-sdk-go/service/workspace"
|
"github.com/databricks/databricks-sdk-go/service/workspace"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -41,6 +43,35 @@ func (m *upload) Apply(ctx context.Context, b *bundle.Bundle) error {
|
||||||
return fmt.Errorf("artifact source is not configured: %s", m.name)
|
return fmt.Errorf("artifact source is not configured: %s", m.name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if source paths are absolute, if not, make them absolute
|
||||||
|
for k := range artifact.Files {
|
||||||
|
f := &artifact.Files[k]
|
||||||
|
if !filepath.IsAbs(f.Source) {
|
||||||
|
dirPath := filepath.Dir(artifact.ConfigFilePath)
|
||||||
|
f.Source = filepath.Join(dirPath, f.Source)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expand any glob reference in files source path
|
||||||
|
files := make([]config.ArtifactFile, 0, len(artifact.Files))
|
||||||
|
for _, f := range artifact.Files {
|
||||||
|
matches, err := filepath.Glob(f.Source)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to find files for %s: %w", f.Source, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(matches) == 0 {
|
||||||
|
return fmt.Errorf("no files found for %s", f.Source)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, match := range matches {
|
||||||
|
files = append(files, config.ArtifactFile{
|
||||||
|
Source: match,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
artifact.Files = files
|
||||||
return bundle.Apply(ctx, b, getUploadMutator(artifact.Type, m.name))
|
return bundle.Apply(ctx, b, getUploadMutator(artifact.Type, m.name))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
package artifacts
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/databricks/cli/bundle"
|
||||||
|
"github.com/databricks/cli/bundle/config"
|
||||||
|
"github.com/databricks/cli/bundle/internal/bundletest"
|
||||||
|
"github.com/databricks/cli/libs/testfile"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
type noop struct{}
|
||||||
|
|
||||||
|
func (n *noop) Apply(context.Context, *bundle.Bundle) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *noop) Name() string {
|
||||||
|
return "noop"
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestExpandGlobFilesSource(t *testing.T) {
|
||||||
|
rootPath := t.TempDir()
|
||||||
|
err := os.Mkdir(filepath.Join(rootPath, "test"), 0755)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
t1 := testfile.CreateFile(t, filepath.Join(rootPath, "test", "myjar1.jar"))
|
||||||
|
t1.Close(t)
|
||||||
|
|
||||||
|
t2 := testfile.CreateFile(t, filepath.Join(rootPath, "test", "myjar2.jar"))
|
||||||
|
t2.Close(t)
|
||||||
|
|
||||||
|
b := &bundle.Bundle{
|
||||||
|
Config: config.Root{
|
||||||
|
Path: rootPath,
|
||||||
|
Artifacts: map[string]*config.Artifact{
|
||||||
|
"test": {
|
||||||
|
Type: "custom",
|
||||||
|
Files: []config.ArtifactFile{
|
||||||
|
{
|
||||||
|
Source: filepath.Join("..", "test", "*.jar"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
bundletest.SetLocation(b, ".", filepath.Join(rootPath, "resources", "artifacts.yml"))
|
||||||
|
|
||||||
|
u := &upload{"test"}
|
||||||
|
uploadMutators[config.ArtifactType("custom")] = func(name string) bundle.Mutator {
|
||||||
|
return &noop{}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = bundle.Apply(context.Background(), b, u)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
require.Equal(t, 2, len(b.Config.Artifacts["test"].Files))
|
||||||
|
require.Equal(t, filepath.Join(rootPath, "test", "myjar1.jar"), b.Config.Artifacts["test"].Files[0].Source)
|
||||||
|
require.Equal(t, filepath.Join(rootPath, "test", "myjar2.jar"), b.Config.Artifacts["test"].Files[1].Source)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestExpandGlobFilesSourceWithNoMatches(t *testing.T) {
|
||||||
|
rootPath := t.TempDir()
|
||||||
|
err := os.Mkdir(filepath.Join(rootPath, "test"), 0755)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
b := &bundle.Bundle{
|
||||||
|
Config: config.Root{
|
||||||
|
Path: rootPath,
|
||||||
|
Artifacts: map[string]*config.Artifact{
|
||||||
|
"test": {
|
||||||
|
Type: "custom",
|
||||||
|
Files: []config.ArtifactFile{
|
||||||
|
{
|
||||||
|
Source: filepath.Join("..", "test", "myjar.jar"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
bundletest.SetLocation(b, ".", filepath.Join(rootPath, "resources", "artifacts.yml"))
|
||||||
|
|
||||||
|
u := &upload{"test"}
|
||||||
|
uploadMutators[config.ArtifactType("custom")] = func(name string) bundle.Mutator {
|
||||||
|
return &noop{}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = bundle.Apply(context.Background(), b, u)
|
||||||
|
require.ErrorContains(t, err, "no files found for")
|
||||||
|
}
|
Loading…
Reference in New Issue