Skip to content

Commit 9984b4a

Browse files
committed
resolve conflicts and update depes
2 parents f0f7228 + 20b9565 commit 9984b4a

29 files changed

+1676
-813
lines changed

artifactory/commands/container/dockerfileutils/parser.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ func newDockerfileParser() *dockerfileParser {
4747
// - FROM --platform=linux/amd64 ubuntu:20.04
4848
// - FROM --platform=linux/amd64 ubuntu:20.04 AS builder
4949
// - FROM builder (skipped - references previous stage)
50-
func ParseDockerfileBaseImages(dockerfilePath string) ([]ocicontainer.BaseImage, error) {
50+
func ParseDockerfileBaseImages(dockerfilePath string) ([]ocicontainer.DockerImage, error) {
5151
file, err := os.Open(dockerfilePath)
5252
if err != nil {
5353
return nil, err
@@ -103,8 +103,8 @@ func readDockerfileLines(file *os.File) ([]string, error) {
103103
}
104104

105105
// extractBaseImages processes all lines and extracts base images from FROM instructions
106-
func (p *dockerfileParser) extractBaseImages(lines []string) []ocicontainer.BaseImage {
107-
var baseImages []ocicontainer.BaseImage
106+
func (p *dockerfileParser) extractBaseImages(lines []string) []ocicontainer.DockerImage {
107+
var baseImages []ocicontainer.DockerImage
108108

109109
for _, line := range lines {
110110
if !isFromInstruction(line) {
@@ -130,7 +130,7 @@ func (p *dockerfileParser) extractBaseImages(lines []string) []ocicontainer.Base
130130
}
131131

132132
p.seenImages[fromInfo.image] = true
133-
baseImages = append(baseImages, ocicontainer.BaseImage{
133+
baseImages = append(baseImages, ocicontainer.DockerImage{
134134
Image: fromInfo.image,
135135
OS: fromInfo.os,
136136
Architecture: fromInfo.arch,

artifactory/commands/container/pull.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"github.com/jfrog/jfrog-cli-core/v2/common/build"
77
"github.com/jfrog/jfrog-cli-core/v2/utils/config"
88
"github.com/jfrog/jfrog-client-go/utils/errorutils"
9+
"github.com/jfrog/jfrog-client-go/utils/log"
910
)
1011

1112
type PullCommand struct {
@@ -76,7 +77,12 @@ func (pc *PullCommand) Run() error {
7677
if err != nil || buildInfoModule == nil {
7778
return err
7879
}
79-
return build.SaveBuildInfo(buildName, buildNumber, project, buildInfoModule)
80+
err = build.SaveBuildInfo(buildName, buildNumber, project, buildInfoModule)
81+
if err != nil {
82+
return err
83+
}
84+
log.Info("Successfully Saved build info for " + buildName + "/" + buildNumber)
85+
return nil
8086
}
8187

8288
func (pc *PullCommand) CommandName() string {

artifactory/commands/helm/buildinfo.go

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,29 @@ import (
1212

1313
// CollectHelmBuildInfoWithFlexPack collects Helm build info using FlexPack
1414
func CollectHelmBuildInfoWithFlexPack(workingDir, buildName, buildNumber, project, commandName string, helmArgs []string, serverDetails *config.ServerDetails) error {
15-
buildInfo, err := collectBuildInfoWithFlexPack(workingDir, buildName, buildNumber)
15+
serviceManager, err := utils.CreateServiceManager(serverDetails, -1, 0, false)
1616
if err != nil {
17-
return fmt.Errorf("failed to collect build info: %w", err)
17+
return fmt.Errorf("failed to create services manager: %w", err)
1818
}
19-
if buildInfo == nil {
20-
log.Debug("No build info collected, skipping further processing")
21-
return nil
19+
buildInfoService := buildtool.CreateBuildInfoService()
20+
build, err := buildInfoService.GetOrCreateBuildWithProject(buildName, buildNumber, project)
21+
if err != nil {
22+
return fmt.Errorf("failed to create build info: %w", err)
2223
}
23-
serviceManager, err := utils.CreateServiceManager(serverDetails, -1, 0, false)
24+
buildInfo, err := build.ToBuildInfo()
2425
if err != nil {
25-
return fmt.Errorf("failed to create services manager: %w", err)
26+
return fmt.Errorf("failed to build info: %w", err)
2627
}
27-
updateDependencyOCILayersInBuildInfo(buildInfo, serviceManager)
28-
if commandName == "push" {
29-
handlePushCommand(buildInfo, helmArgs, serviceManager)
28+
switch commandName {
29+
case "push":
30+
return handlePushCommand(buildInfo, helmArgs, serviceManager, buildName, buildNumber, project)
31+
case "package":
32+
return handlePackageCommand(buildInfo, helmArgs, serviceManager, buildName, buildNumber, project)
33+
case "dependency":
34+
return handleDependencyCommand(buildInfo, helmArgs, serviceManager, workingDir, buildName, buildNumber, project)
3035
}
31-
return saveBuildInfo(buildInfo, buildName, buildNumber, project)
36+
log.Info("Skipping helm build info because", commandName, "command is not collecting build info")
37+
return nil
3238
}
3339

3440
// collectBuildInfoWithFlexPack collects build info using FlexPack
@@ -53,6 +59,6 @@ func saveBuildInfo(buildInfo *entities.BuildInfo, buildName, buildNumber, projec
5359
log.Warn("Failed to save build info for jfrog-cli compatibility: ", err.Error())
5460
return err
5561
}
56-
log.Info("Build info saved locally. Use 'jf rt bp ", buildName, " ", buildNumber, "' to publish it to Artifactory.")
62+
log.Info("Build info saved locally. Use 'jf rt bp", buildName, buildNumber, "' to publish it to Artifactory.")
5763
return nil
5864
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package helm
2+
3+
import (
4+
"fmt"
5+
"github.com/jfrog/build-info-go/entities"
6+
"github.com/jfrog/jfrog-client-go/artifactory"
7+
)
8+
9+
func handleDependencyCommand(buildInfoOld *entities.BuildInfo, args []string, serviceManager artifactory.ArtifactoryServicesManager, workingDir, buildName, buildNumber, project string) error {
10+
chartPath := workingDir
11+
chartPaths := getPaths(args)
12+
if len(chartPaths) >= 2 {
13+
chartPath = chartPaths[1]
14+
}
15+
buildInfo, err := collectBuildInfoWithFlexPack(chartPath, buildName, buildNumber)
16+
if err != nil {
17+
return fmt.Errorf("failed to collect build info: %w", err)
18+
}
19+
if buildInfo == nil {
20+
return fmt.Errorf("no build info collected, skipping further processing")
21+
}
22+
updateDependencyOCILayersInBuildInfo(buildInfo, serviceManager)
23+
if len(buildInfo.Modules) > 0 {
24+
appendModuleInExistingBuildInfo(buildInfoOld, &buildInfo.Modules[0])
25+
}
26+
removeDuplicateDependencies(buildInfoOld)
27+
err = saveBuildInfo(buildInfoOld, buildName, buildNumber, project)
28+
if err != nil {
29+
return fmt.Errorf("failed to save build info")
30+
}
31+
return nil
32+
}

artifactory/commands/helm/helmcommand.go

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@ package helm
22

33
import (
44
"fmt"
5-
"io"
6-
"net/url"
7-
"os"
8-
"os/exec"
9-
105
buildUtils "github.com/jfrog/jfrog-cli-core/v2/common/build"
116
"github.com/jfrog/jfrog-cli-core/v2/utils/config"
127
"github.com/jfrog/jfrog-client-go/auth"
138
"github.com/jfrog/jfrog-client-go/utils/errorutils"
149
"github.com/jfrog/jfrog-client-go/utils/log"
10+
"io"
11+
"net/url"
12+
"os"
13+
"os/exec"
1514
)
1615

1716
// HelmCommand represents a Helm command execution
@@ -91,13 +90,7 @@ func (hc *HelmCommand) ServerDetails() (*config.ServerDetails, error) {
9190

9291
// Run executes the Helm command
9392
func (hc *HelmCommand) Run() error {
94-
if hc.requiresCredentialsInArguments() {
95-
hc.appendCredentialsInArguments()
96-
}
97-
err := hc.performRegistryLogin()
98-
if err != nil {
99-
return err
100-
}
93+
hc.appendCredentialsInArguments()
10194
if err := hc.executeHelmCommand(); err != nil {
10295
return errorutils.CheckErrorf("helm %s failed: %w", hc.cmdName, err)
10396
}
@@ -107,21 +100,23 @@ func (hc *HelmCommand) Run() error {
107100
return nil
108101
}
109102

110-
// requiresCredentialsInArguments checks if the command requires credentials to be appended to arguments
111-
func (hc *HelmCommand) requiresCredentialsInArguments() bool {
112-
cmdName := hc.cmdName
113-
return cmdName == "registry" || cmdName == "repo" || cmdName == "dependency" || cmdName == "upgrade" || cmdName == "install" || cmdName == "pull" || cmdName == "push"
114-
}
115-
116103
// appendCredentialsInArguments appends the username and password to arguments
117104
func (hc *HelmCommand) appendCredentialsInArguments() {
118-
user, pass := hc.getCredentials()
119-
if user == "" || pass == "" {
105+
if hc.username != "" && hc.password != "" {
106+
hc.helmArgs = append(hc.helmArgs, "--username", hc.username)
107+
hc.helmArgs = append(hc.helmArgs, "--password", hc.password)
108+
return
109+
}
110+
if hc.cmdName != "registry" && hc.serverId == "" {
111+
return
112+
}
113+
username, password := hc.getCredentials()
114+
if username == "" || password == "" {
120115
log.Debug("No credentials available for helm registry login")
121116
return
122117
}
123-
hc.helmArgs = append(hc.helmArgs, fmt.Sprintf("--username=%s", user))
124-
hc.helmArgs = append(hc.helmArgs, fmt.Sprintf("--password=%s", pass))
118+
hc.helmArgs = append(hc.helmArgs, fmt.Sprintf("--username=%s", username))
119+
hc.helmArgs = append(hc.helmArgs, fmt.Sprintf("--password=%s", password))
125120
}
126121

127122
// executeHelmCommand executes the native Helm command

artifactory/commands/helm/helmcommand_test.go

Lines changed: 1 addition & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -62,80 +62,6 @@ func TestHelmCommandSetters(t *testing.T) {
6262
assert.Equal(t, buildConfig, cmd.buildConfiguration)
6363
}
6464

65-
// TestRequiresCredentialsInArguments tests the requiresCredentialsInArguments method
66-
func TestRequiresCredentialsInArguments(t *testing.T) {
67-
tests := []struct {
68-
name string
69-
cmdName string
70-
expected bool
71-
}{
72-
{
73-
name: "Registry command requires credentials",
74-
cmdName: "registry",
75-
expected: true,
76-
},
77-
{
78-
name: "Repo command requires credentials",
79-
cmdName: "repo",
80-
expected: true,
81-
},
82-
{
83-
name: "Dependency command requires credentials",
84-
cmdName: "dependency",
85-
expected: true,
86-
},
87-
{
88-
name: "Upgrade command requires credentials",
89-
cmdName: "upgrade",
90-
expected: true,
91-
},
92-
{
93-
name: "Install command requires credentials",
94-
cmdName: "install",
95-
expected: true,
96-
},
97-
{
98-
name: "Pull command requires credentials",
99-
cmdName: "pull",
100-
expected: true,
101-
},
102-
{
103-
name: "Push command requires credentials",
104-
cmdName: "push",
105-
expected: true,
106-
},
107-
{
108-
name: "Package command does not require credentials",
109-
cmdName: "package",
110-
expected: false,
111-
},
112-
{
113-
name: "Template command does not require credentials",
114-
cmdName: "template",
115-
expected: false,
116-
},
117-
{
118-
name: "List command does not require credentials",
119-
cmdName: "list",
120-
expected: false,
121-
},
122-
{
123-
name: "Empty command does not require credentials",
124-
cmdName: "",
125-
expected: false,
126-
},
127-
}
128-
129-
for _, tt := range tests {
130-
t.Run(tt.name, func(t *testing.T) {
131-
cmd := NewHelmCommand()
132-
cmd.SetHelmCmdName(tt.cmdName)
133-
result := cmd.requiresCredentialsInArguments()
134-
assert.Equal(t, tt.expected, result)
135-
})
136-
}
137-
}
138-
13965
// TestAppendCredentialsInArguments tests the appendCredentialsInArguments method
14066
func TestAppendCredentialsInArguments(t *testing.T) {
14167
tests := []struct {
@@ -150,7 +76,7 @@ func TestAppendCredentialsInArguments(t *testing.T) {
15076
username: "cmduser",
15177
password: "cmdpass",
15278
serverDetails: &config.ServerDetails{},
153-
expectedArgs: []string{"--username=cmduser", "--password=cmdpass"},
79+
expectedArgs: []string{"--username", "cmduser", "--password", "cmdpass"},
15480
},
15581
{
15682
name: "Append credentials from server details",

artifactory/commands/helm/layers.go

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ package helm
22

33
import (
44
"fmt"
5-
"github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/ocicontainer"
6-
artutils "github.com/jfrog/jfrog-cli-core/v2/artifactory/utils"
7-
"strings"
8-
95
"github.com/jfrog/build-info-go/entities"
106
ioutils "github.com/jfrog/gofrog/io"
7+
"github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/ocicontainer"
8+
artutils "github.com/jfrog/jfrog-cli-core/v2/artifactory/utils"
119
"github.com/jfrog/jfrog-client-go/artifactory"
1210
"github.com/jfrog/jfrog-client-go/artifactory/services"
1311
servicesUtils "github.com/jfrog/jfrog-client-go/artifactory/services/utils"
12+
"github.com/jfrog/jfrog-client-go/utils/io/content"
1413
"github.com/jfrog/jfrog-client-go/utils/log"
14+
"strings"
1515
)
1616

1717
type manifest struct {
@@ -76,7 +76,7 @@ func addOCILayersForDependency(dep entities.Dependency, serviceManager artifacto
7676
return
7777
}
7878
searchPattern := fmt.Sprintf("%s/%s/*", repoName, versionPath)
79-
resultMap, err := searchDependencyOCIFilesByPath(serviceManager, searchPattern)
79+
resultMap, err := searchDependencyOCIFilesByPath(serviceManager, searchPattern, "")
8080
if err != nil {
8181
log.Debug("Failed to search OCI artifacts for dependency ", dep.Id, " : ", err)
8282
return
@@ -108,7 +108,6 @@ func addOCILayersForDependency(dep entities.Dependency, serviceManager artifacto
108108
for _, depLayer := range dependencyLayers {
109109
*processedDependencies = append(*processedDependencies, entities.Dependency{
110110
Id: depLayer.Name,
111-
Type: depLayer.Type,
112111
Repository: depLayer.Repo,
113112
Checksum: entities.Checksum{
114113
Sha1: depLayer.Actual_Sha1,
@@ -184,7 +183,7 @@ func searchClassicHelmChart(serviceManager artifactory.ArtifactoryServicesManage
184183
}
185184

186185
// searchDependencyOCIFilesByPath searches for OCI artifacts using a search pattern
187-
func searchDependencyOCIFilesByPath(serviceManager artifactory.ArtifactoryServicesManager, searchPattern string) (map[string]*servicesUtils.ResultItem, error) {
186+
func searchDependencyOCIFilesByPath(serviceManager artifactory.ArtifactoryServicesManager, searchPattern string, buildProperties string) (map[string]*servicesUtils.ResultItem, error) {
188187
log.Debug("Searching for OCI artifacts with pattern: ", searchPattern)
189188
searchParams := services.NewSearchParams()
190189
searchParams.Pattern = searchPattern
@@ -193,6 +192,9 @@ func searchDependencyOCIFilesByPath(serviceManager artifactory.ArtifactoryServic
193192
if err != nil {
194193
return nil, fmt.Errorf("failed to search for OCI artifacts: %w", err)
195194
}
195+
if buildProperties != "" {
196+
addBuildPropertiesOnArtifacts(serviceManager, reader, buildProperties, searchPattern)
197+
}
196198
var closeErr error
197199
defer func() {
198200
if closeErr != nil {
@@ -223,8 +225,30 @@ func getManifest(resultMap map[string]*servicesUtils.ResultItem, serviceManager
223225
return
224226
}
225227

228+
func getManifestSha256(resultMap map[string]*servicesUtils.ResultItem) (string, error) {
229+
if len(resultMap) == 0 {
230+
return "", fmt.Errorf("no manifest found")
231+
}
232+
manifestResult, ok := resultMap["manifest.json"]
233+
if !ok || manifestResult == nil {
234+
return "", fmt.Errorf("no manifest found")
235+
}
236+
return manifestResult.Sha256, nil
237+
}
238+
226239
// Download the content of layer search result.
227240
func downloadLayer(searchResult servicesUtils.ResultItem, result interface{}, serviceManager artifactory.ArtifactoryServicesManager, repo string) error {
228241
searchResult.Repo = repo
229242
return artutils.RemoteUnmarshal(serviceManager, searchResult.GetItemRelativePath(), result)
230243
}
244+
245+
func addBuildPropertiesOnArtifacts(serviceManager artifactory.ArtifactoryServicesManager, reader *content.ContentReader, buildProps, searchPattern string) {
246+
propsParams := services.PropsParams{
247+
Reader: reader,
248+
Props: buildProps,
249+
}
250+
_, err := serviceManager.SetProps(propsParams)
251+
if err != nil {
252+
log.Warn(fmt.Sprintf("Failed to set properties on %s: %s", searchPattern, err))
253+
}
254+
}

0 commit comments

Comments
 (0)