/
yarnutils.go
129 lines (116 loc) · 4.62 KB
/
yarnutils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package utils
import (
"encoding/json"
ioutils "github.com/jfrog/gofrog/io"
"io"
"strconv"
"strings"
"github.com/jfrog/build-info-go/entities"
"github.com/jfrog/jfrog-cli-core/v2/common/build"
"github.com/jfrog/jfrog-cli-core/v2/common/format"
"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
"github.com/jfrog/jfrog-client-go/artifactory"
"github.com/jfrog/jfrog-client-go/artifactory/services"
servicesUtils "github.com/jfrog/jfrog-client-go/artifactory/services/utils"
"github.com/jfrog/jfrog-client-go/utils/errorutils"
"github.com/jfrog/jfrog-client-go/utils/log"
)
type aqlResult struct {
Results []*servicesUtils.ResultItem `json:"results,omitempty"`
}
func GetDependenciesFromLatestBuild(servicesManager artifactory.ArtifactoryServicesManager, buildName string) (map[string]*entities.Dependency, error) {
buildDependencies := make(map[string]*entities.Dependency)
previousBuild, found, err := servicesManager.GetBuildInfo(services.BuildInfoParams{BuildName: buildName, BuildNumber: servicesUtils.LatestBuildNumberKey})
if err != nil || !found {
return buildDependencies, err
}
for _, module := range previousBuild.BuildInfo.Modules {
for _, dependency := range module.Dependencies {
buildDependencies[dependency.Id] = &entities.Dependency{Id: dependency.Id, Type: dependency.Type,
Checksum: entities.Checksum{Md5: dependency.Md5, Sha1: dependency.Sha1}}
}
}
return buildDependencies, nil
}
// Get dependency's checksum and type.
func getDependencyInfo(name, ver string, previousBuildDependencies map[string]*entities.Dependency,
servicesManager artifactory.ArtifactoryServicesManager) (checksum entities.Checksum, fileType string, err error) {
id := name + ":" + ver
if dep, ok := previousBuildDependencies[id]; ok {
// Get checksum from previous build.
checksum = dep.Checksum
fileType = dep.Type
return
}
// Get info from Artifactory.
log.Debug("Fetching checksums for", id)
var stream io.ReadCloser
stream, err = servicesManager.Aql(servicesUtils.CreateAqlQueryForYarn(name, ver))
if err != nil {
return
}
defer ioutils.Close(stream, &err)
var result []byte
result, err = io.ReadAll(stream)
if err != nil {
return
}
parsedResult := new(aqlResult)
if err = json.Unmarshal(result, parsedResult); err != nil {
return entities.Checksum{}, "", errorutils.CheckError(err)
}
if len(parsedResult.Results) == 0 {
log.Debug(id, "could not be found in Artifactory.")
return
}
if i := strings.LastIndex(parsedResult.Results[0].Name, "."); i != -1 {
fileType = parsedResult.Results[0].Name[i+1:]
}
log.Debug(id, "was found in Artifactory. Name:", parsedResult.Results[0].Name,
"SHA-1:", parsedResult.Results[0].Actual_Sha1,
"MD5:", parsedResult.Results[0].Actual_Md5)
checksum = entities.Checksum{Sha1: parsedResult.Results[0].Actual_Sha1, Md5: parsedResult.Results[0].Actual_Md5, Sha256: parsedResult.Results[0].Sha256}
return
}
func ExtractYarnOptionsFromArgs(args []string) (threads int, detailedSummary, xrayScan bool, scanOutputFormat format.OutputFormat, cleanArgs []string, buildConfig *build.BuildConfiguration, err error) {
threads = 3
// Extract threads information from the args.
flagIndex, valueIndex, numOfThreads, err := coreutils.FindFlag("--threads", args)
if err != nil {
return
}
coreutils.RemoveFlagFromCommand(&args, flagIndex, valueIndex)
if numOfThreads != "" {
threads, err = strconv.Atoi(numOfThreads)
if err != nil {
err = errorutils.CheckError(err)
return
}
}
detailedSummary, xrayScan, scanOutputFormat, cleanArgs, buildConfig, err = ExtractNpmOptionsFromArgs(args)
return
}
func PrintMissingDependencies(missingDependencies []string) {
if len(missingDependencies) == 0 {
return
}
log.Warn(strings.Join(missingDependencies, "\n"), "\nThe npm dependencies above could not be found in Artifactory and therefore are not included in the build-info.\n"+
"Deleting the local cache will force populating Artifactory with these dependencies.")
}
func CreateCollectChecksumsFunc(previousBuildDependencies map[string]*entities.Dependency, servicesManager artifactory.ArtifactoryServicesManager, missingDepsChan chan string) func(dependency *entities.Dependency) (bool, error) {
return func(dependency *entities.Dependency) (bool, error) {
splitDepId := strings.SplitN(dependency.Id, ":", 2)
name := splitDepId[0]
ver := splitDepId[1]
// Get dependency info.
checksum, fileType, err := getDependencyInfo(name, ver, previousBuildDependencies, servicesManager)
if err != nil || checksum.IsEmpty() {
missingDepsChan <- dependency.Id
return false, err
}
// Update dependency.
dependency.Type = fileType
dependency.Checksum = checksum
return true, nil
}
}