Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
769a49a
Add VSC tests for containers commands
attiasas Jun 18, 2026
dc7ad95
Merge remote-tracking branch 'upstream/master' into e2e_tests_rt_vsc_…
attiasas Jun 18, 2026
a307c50
Merge remote-tracking branch 'upstream/master' into e2e_tests_rt_vsc_…
attiasas Jun 18, 2026
bc646e1
Merge remote-tracking branch 'upstream/master' into e2e_tests_rt_vsc_…
attiasas Jun 23, 2026
d615185
Merge remote-tracking branch 'upstream/master' into e2e_tests_rt_vsc_…
attiasas Jun 23, 2026
9aad8fc
add more cases if path is empty
attiasas Jun 23, 2026
622af4f
Merge remote-tracking branch 'upstream/master' into e2e_tests_rt_vsc_…
attiasas Jun 23, 2026
2068ec9
update deps
attiasas Jun 23, 2026
b3fa6d9
Merge remote-tracking branch 'upstream/master' into e2e_tests_rt_vsc_…
attiasas Jun 28, 2026
aa73dc4
Merge remote-tracking branch 'upstream/master' into e2e_tests_rt_vsc_…
attiasas Jul 1, 2026
3bf3ce6
Merge remote-tracking branch 'upstream/master' into e2e_tests_rt_vsc_…
attiasas Jul 2, 2026
42a1b94
update deps
attiasas Jul 2, 2026
a86a177
fix tests
attiasas Jul 2, 2026
f216019
Merge remote-tracking branch 'upstream/master' into e2e_tests_rt_vsc_…
attiasas Jul 5, 2026
39709c3
Merge remote-tracking branch 'upstream/master' into e2e_tests_rt_vsc_…
attiasas Jul 7, 2026
2b3ac81
update deps
attiasas Jul 7, 2026
7092386
update deps
attiasas Jul 7, 2026
f71d7ff
Merge remote-tracking branch 'upstream/master' into e2e_tests_rt_vsc_…
attiasas Jul 8, 2026
45e99e8
Merge branch 'master' into e2e_tests_rt_vsc_containers
attiasas Jul 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions artifactory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6922,6 +6922,51 @@ func terraformPublishModulesAndBuildInfo(t *testing.T, trPublishArgs []string) {
assert.Len(t, buildInfo.Modules[0].Artifacts, 3)
}

func TestTerraformPublishWithLocalGitVcsProps(t *testing.T) {
initArtifactoryTest(t, terraformMinArtifactoryVersion)
defer cleanArtifactoryTest()
createJfrogHomeConfig(t, true)

buildNumber := "local-git-1"
buildName := tests.RtBuildName1 + "-local-git"

cleanupEnv := tests.SetupLocalGitVcsEnv(t)
defer cleanupEnv()

inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, buildName, artHttpDetails)
defer inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, buildName, artHttpDetails)

projectPath := prepareTerraformProject("terraformproject", t, true)
tests.CopyGitFixtureIntoProject(t, projectPath)

wd, err := os.Getwd()
require.NoError(t, err)
awsDir := filepath.Join(projectPath, "aws")
chdirCallback := clientTestUtils.ChangeDirWithCallback(t, wd, awsDir)
defer chdirCallback()

trPublishArgs := []string{
"terraform", "publish",
"--namespace=namespace", "--provider=provider", "--tag=tag",
"--exclusions=*test*",
"--build-name=" + buildName, "--build-number=" + buildNumber,
"--module=my-tr-module-local-git",
}
require.NoError(t, platformCli.WithoutCredentials().Exec(trPublishArgs...))
require.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber))

publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber)
require.NoError(t, err)
require.True(t, found)

serviceManager, err := utils.CreateServiceManager(serverDetails, 3, 1000, false)
require.NoError(t, err)

count := tests.ValidateLocalGitVcsPropsOnBuildInfoArtifacts(t, serviceManager, publishedBuildInfo, tests.TerraformRepo,
tests.VcsFixtureMainURL, tests.VcsFixtureMainRevision, tests.VcsFixtureMainBranch)
assert.Greater(t, count, 0)
}

func prepareTerraformProject(projectName string, t *testing.T, copyDirs bool) string {
projectPath := filepath.Join(tests.GetTestResourcesPath(), "terraform", projectName)
testdataTarget := filepath.Join(tests.Out, "terraformProject")
Expand Down
49 changes: 49 additions & 0 deletions docker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1574,6 +1574,55 @@ CMD ["echo", "Hello from CI VCS test"]`, baseImage)
assert.Greater(t, artifactCount, 0, "No artifacts in build info")
}

// TestDockerPushWithLocalGitVcsProps verifies local git VCS props on Docker artifacts
// when running build-publish with VCS collection enabled and no CI env.
func TestDockerPushWithLocalGitVcsProps(t *testing.T) {
cleanup := initDockerBuildTest(t)
defer cleanup()

buildName := "docker-local-git-test"
buildNumber := "1"

cleanupEnv := tests.SetupLocalGitVcsEnv(t)
defer cleanupEnv()

inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, buildName, artHttpDetails)
defer inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, buildName, artHttpDetails)

registryHost := *tests.ContainerRegistry
if parsedURL, err := url.Parse(registryHost); err == nil && parsedURL.Host != "" {
registryHost = parsedURL.Host
}
imageName := path.Join(registryHost, tests.OciLocalRepo, "test-local-git-docker")
imageTag := imageName + ":v1"

workspace, err := filepath.Abs(tests.Out)
require.NoError(t, err)
require.NoError(t, fileutils.CreateDirIfNotExist(workspace))
tests.CopyGitFixtureIntoProject(t, workspace)

baseImage := path.Join(registryHost, tests.OciRemoteRepo, "alpine:latest")
dockerfileContent := fmt.Sprintf("FROM %s\nCMD [\"echo\", \"local git vcs test\"]", baseImage)
dockerfilePath := filepath.Join(workspace, "Dockerfile")
require.NoError(t, os.WriteFile(dockerfilePath, []byte(dockerfileContent), 0o644)) //#nosec G703 -- test code, path built from test workspace

runJfrogCli(t, "rt", "bc", buildName, buildNumber)
runJfrogCli(t, "docker", "build", "-t", imageTag, "--push", "-f", dockerfilePath,
"--build-name="+buildName, "--build-number="+buildNumber, workspace)
runRt(t, "build-publish", buildName, buildNumber, "--dot-git-path", workspace)

publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber)
require.NoError(t, err)
require.True(t, found)

serviceManager, err := utils.CreateServiceManager(serverDetails, 3, 1000, false)
require.NoError(t, err)

count := tests.ValidateLocalGitVcsPropsOnBuildInfoArtifacts(t, serviceManager, publishedBuildInfo, tests.OciLocalRepo,
tests.VcsFixtureMainURL, tests.VcsFixtureMainRevision, tests.VcsFixtureMainBranch)
assert.Greater(t, count, 0)
}

// TestSetupDockerCommand verifies `jf setup docker --url ...` end-to-end.
//
// Guards RTECO-1352: configureContainer (in jfrog-cli-artifactory) used to read
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ require (
github.com/jfrog/build-info-go v1.13.1-0.20260615080618-42488b58c305
github.com/jfrog/gofrog v1.7.6
github.com/jfrog/jfrog-cli-application v1.0.2-0.20260621072921-cadb78770a3e
github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260702071632-62c27c48b207
github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260707101914-5f6d052c3b99
github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260624085155-5ba797de2616
github.com/jfrog/jfrog-cli-evidence v0.9.5-0.20260618135203-4d2bdd4ee35f
github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20260618062042-6053ab368cab
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,6 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/attiasas/jfrog-cli-artifactory v0.0.0-20260701102442-59ed24167b6c h1:oyOqDGLhx7Mqf3zr0K/TkCyAM/kBtMvW/yjdoujTWGs=
github.com/attiasas/jfrog-cli-artifactory v0.0.0-20260701102442-59ed24167b6c/go.mod h1:VqV0Bed11HoBlugAEGa3RumbwnDVslEf0gKocTzLs9s=
github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6tLY8=
github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc=
github.com/aws/aws-sdk-go-v2/config v1.32.17 h1:FpL4/758/diKwqbytU0prpuiu60fgXKUWCpDJtApclU=
Expand Down Expand Up @@ -410,6 +408,8 @@ github.com/jfrog/jfrog-cli-application v1.0.2-0.20260621072921-cadb78770a3e h1:j
github.com/jfrog/jfrog-cli-application v1.0.2-0.20260621072921-cadb78770a3e/go.mod h1:p8yLtbmCxxQucIbLZKnWu0F+EDtj6NLXbRQCEK/nb6o=
github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260702071632-62c27c48b207 h1:RbqWYCj0Iw1IGO9gW7ghEHV8L2xnMjDUulDnNHOstVM=
github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260702071632-62c27c48b207/go.mod h1:VqV0Bed11HoBlugAEGa3RumbwnDVslEf0gKocTzLs9s=
github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260707101914-5f6d052c3b99 h1:V9AtxtEshzsnMUn78mPhTzMqZUJx/2DF7ELnj+URzPM=
github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260707101914-5f6d052c3b99/go.mod h1:VqV0Bed11HoBlugAEGa3RumbwnDVslEf0gKocTzLs9s=
github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260624085155-5ba797de2616 h1:bioFXGzf3pF2qnC3LZD1S1saWiHSekL4vdsDSWksj/4=
github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260624085155-5ba797de2616/go.mod h1:9R90mhbczGXwW5EGlDs7F08ejQU/xdoDhYHMvzBiqgE=
github.com/jfrog/jfrog-cli-evidence v0.9.5-0.20260618135203-4d2bdd4ee35f h1:MV4BATdkEoUYJmdPDvaB9EBb8JQZg28n/K4X7dcmyAY=
Expand Down
93 changes: 93 additions & 0 deletions helm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -958,6 +958,99 @@ func TestHelmBuildPublishWithCIVcsProps(t *testing.T) {
assert.Greater(t, artifactCount, 0, "No artifacts were validated for CI VCS properties")
}

// TestHelmPushWithLocalGitVcsProps verifies local git VCS props on Helm artifacts
// when running build-publish with VCS collection enabled and no CI env.
func TestHelmPushWithLocalGitVcsProps(t *testing.T) {
initHelmTest(t)
defer cleanHelmTest(t)

buildName := tests.HelmBuildName + "-local-git"
buildNumber := "1"

cleanupEnv := tests.SetupLocalGitVcsEnv(t)
defer cleanupEnv()

inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, buildName, artHttpDetails)
defer inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, buildName, artHttpDetails)

chartDir := createTestHelmChartWithDependencies(t, "test-chart-local-git", "0.2.0")
defer func() {
if err := os.RemoveAll(chartDir); err != nil {
t.Logf("Warning: Failed to remove test chart directory %s: %v", chartDir, err)
}
}()
tests.CopyGitFixtureIntoProject(t, chartDir)

originalDir, err := os.Getwd()
require.NoError(t, err)
defer func() {
if err := os.Chdir(originalDir); err != nil {
t.Logf("Warning: Failed to change back to original directory: %v", err)
}
}()
require.NoError(t, os.Chdir(chartDir))

helmCmd := exec.Command("helm", "dependency", "update")
helmCmd.Dir = chartDir
require.NoError(t, helmCmd.Run(), "helm dependency update should succeed")

jfrogCli := coreTests.NewJfrogCli(execMain, "jfrog", "")
require.NoError(t, jfrogCli.Exec("helm", "package", ".",
"--build-name="+buildName, "--build-number="+buildNumber), "helm package should succeed")

chartFiles, err := filepath.Glob(filepath.Join(chartDir, "*.tgz"))
require.NoError(t, err)
require.NotEmpty(t, chartFiles, "Chart package file should be created")
chartFile := filepath.Base(chartFiles[0])

parsedURL, err := url.Parse(serverDetails.ArtifactoryUrl)
require.NoError(t, err)
registryHost := parsedURL.Host
registryURL := fmt.Sprintf("oci://%s/%s", registryHost, tests.HelmLocalRepo)

if !isRepoExist(tests.HelmLocalRepo) {
t.Skipf("Repository %s does not exist. Skipping test.", tests.HelmLocalRepo)
}

err = loginHelmRegistry(t, registryHost)
if err != nil {
errorMsg := strings.ToLower(err.Error())
if strings.Contains(errorMsg, "account temporarily locked") {
t.Skip("Artifactory account is temporarily locked. Skipping test.")
}
if strings.Contains(errorMsg, "http response to https") ||
strings.Contains(errorMsg, "tls: first record does not look like a tls handshake") {
t.Skip("Helm registry login failed due to HTTPS/HTTP mismatch. Skipping test.")
}
}
require.NoError(t, err, "helm registry login should succeed")

err = jfrogCli.Exec("helm", "push", chartFile, registryURL,
"--build-name="+buildName, "--build-number="+buildNumber)
if err != nil {
errorMsg := strings.ToLower(err.Error())
if strings.Contains(errorMsg, "404") ||
strings.Contains(errorMsg, "not found") ||
strings.Contains(errorMsg, "exit status 1") {
t.Skip("OCI registry API not accessible (404). Skipping test.")
}
}
require.NoError(t, err, "helm push should succeed")

require.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber))

publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber)
require.NoError(t, err)
require.True(t, found)

serviceManager, err := utils.CreateServiceManager(serverDetails, 3, 1000, false)
require.NoError(t, err)

count := tests.ValidateLocalGitVcsPropsOnBuildInfoArtifacts(t, serviceManager, publishedBuildInfo, tests.HelmLocalRepo,
tests.VcsFixtureMainURL, tests.VcsFixtureMainRevision, tests.VcsFixtureMainBranch)
assert.Greater(t, count, 0)
}

// InitHelmTests initializes Helm tests
func InitHelmTests() {
initArtifactoryCli()
Expand Down
49 changes: 49 additions & 0 deletions huggingface_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ import (
"strings"
"testing"

"github.com/jfrog/jfrog-cli-core/v2/artifactory/utils"
"github.com/jfrog/jfrog-cli-core/v2/utils/config"
"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
coreTests "github.com/jfrog/jfrog-cli-core/v2/utils/tests"
"github.com/jfrog/jfrog-cli/inttestutils"
"github.com/jfrog/jfrog-cli/utils/tests"
clientTestUtils "github.com/jfrog/jfrog-client-go/utils/tests"
"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -867,6 +869,53 @@ func InitHuggingFaceTests() {
createRequiredRepos()
}

func TestHuggingFaceUploadWithLocalGitVcsProps(t *testing.T) {
initHuggingFaceTest(t)
defer cleanHuggingFaceTest(t)
checkHuggingFaceHubAvailable(t)

buildName := tests.HuggingFaceBuildName + "-local-git"
buildNumber := "1"

cleanupEnv := tests.SetupLocalGitVcsEnv(t)
defer cleanupEnv()

inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, buildName, artHttpDetails)
defer inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, buildName, artHttpDetails)

tempDir, err := os.MkdirTemp("", "hf-local-git-*")
require.NoError(t, err)
t.Cleanup(func() { _ = os.RemoveAll(tempDir) })
tests.CopyGitFixtureIntoProject(t, tempDir)

require.NoError(t, os.WriteFile(filepath.Join(tempDir, "config.json"),
[]byte(`{"model_type": "local-git-vcs"}`), 0o644))
require.NoError(t, os.WriteFile(filepath.Join(tempDir, "model.bin"),
[]byte("model"), 0o644))

jfrogCli := coreTests.NewJfrogCli(execMain, "jfrog", "")
args := []string{
"hf", "u", tempDir, "test-org/test-local-git-model",
"--repo-type=model",
"--build-name=" + buildName,
"--build-number=" + buildNumber,
"--repo-key=" + tests.HuggingFaceLocalRepo,
}
require.NoError(t, jfrogCli.Exec(args...))
require.NoError(t, jfrogCli.Exec("rt", "bp", buildName, buildNumber, "--dot-git-path", tempDir))

publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber)
require.NoError(t, err)
require.True(t, found)

serviceManager, err := utils.CreateServiceManager(serverDetails, 3, 1000, false)
require.NoError(t, err)

count := tests.ValidateLocalGitVcsPropsOnBuildInfoArtifacts(t, serviceManager, publishedBuildInfo, tests.HuggingFaceLocalRepo,
tests.VcsFixtureMainURL, tests.VcsFixtureMainRevision, tests.VcsFixtureMainBranch)
assert.Greater(t, count, 0)
}

// CleanHuggingFaceTests cleans up after HuggingFace tests
func CleanHuggingFaceTests() {
deleteCreatedRepos()
Expand Down
6 changes: 6 additions & 0 deletions utils/tests/artifact_props.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ func ArtifactFullPath(a buildinfo.Artifact, defaultRepo string) string {
if repo == "" {
repo = defaultRepo
}
if path == "" {
if repo != "" {
return repo
}
return ""
}
if repo != "" {
return repo + "/" + path
}
Expand Down
10 changes: 10 additions & 0 deletions utils/tests/artifact_props_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,16 @@ func TestArtifactItemPath_DoesNotDoubleAppendName(t *testing.T) {
assert.Equal(t, "mvn-local/com/foo/1.0/foo.jar", ArtifactItemPath(a, ""))
}

func TestArtifactFullPath_EmptyPathReturnsRepoOnly(t *testing.T) {
a := buildinfo.Artifact{Path: "", Name: "config.json"}
assert.Equal(t, "my-repo", ArtifactFullPath(a, "my-repo"))
}

func TestArtifactItemPath_EmptyPathDoesNotDoubleSlash(t *testing.T) {
a := buildinfo.Artifact{Path: "", Name: "config.json"}
assert.Equal(t, "my-repo/config.json", ArtifactItemPath(a, "my-repo"))
}

func TestArtifactItemPath_NpmTarballPathDoesNotAppendName(t *testing.T) {
a := buildinfo.Artifact{
OriginalDeploymentRepo: "cli-npm-123",
Expand Down
Loading