Skip to content

Commit 238339c

Browse files
authored
Exposing build artifact metadata from maven and npm (#5008)
1 parent 70d2abf commit 238339c

15 files changed

+186
-25
lines changed

cmd/mavenBuild.go

+42-1
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
package cmd
22

33
import (
4+
"encoding/json"
45
"os"
56
"path"
67
"path/filepath"
78
"reflect"
89
"strings"
910

11+
"github.com/SAP/jenkins-library/pkg/build"
1012
"github.com/SAP/jenkins-library/pkg/buildsettings"
1113
"github.com/SAP/jenkins-library/pkg/command"
1214
"github.com/SAP/jenkins-library/pkg/log"
1315
"github.com/SAP/jenkins-library/pkg/maven"
1416
"github.com/SAP/jenkins-library/pkg/piperutils"
1517
"github.com/SAP/jenkins-library/pkg/telemetry"
18+
"github.com/SAP/jenkins-library/pkg/versioning"
1619
"github.com/pkg/errors"
1720

1821
piperhttp "github.com/SAP/jenkins-library/pkg/http"
@@ -159,7 +162,45 @@ func runMavenBuild(config *mavenBuildOptions, telemetryData *telemetry.CustomDat
159162
mavenOptions.Goals = []string{"deploy"}
160163
mavenOptions.Defines = []string{}
161164
_, err := maven.Execute(&mavenOptions, utils)
162-
return err
165+
if err != nil {
166+
return err
167+
}
168+
if config.CreateBuildArtifactsMetadata {
169+
buildCoordinates := []versioning.Coordinates{}
170+
options := versioning.Options{}
171+
var utils versioning.Utils
172+
173+
matches, _ := fileUtils.Glob("**/pom.xml")
174+
for _, match := range matches {
175+
176+
artifact, err := versioning.GetArtifact("maven", match, &options, utils)
177+
if err != nil {
178+
log.Entry().Warnf("unable to get artifact metdata : %v", err)
179+
} else {
180+
coordinate, err := artifact.GetCoordinates()
181+
if err != nil {
182+
log.Entry().Warnf("unable to get artifact coordinates : %v", err)
183+
} else {
184+
coordinate.BuildPath = filepath.Dir(match)
185+
coordinate.URL = config.AltDeploymentRepositoryURL
186+
buildCoordinates = append(buildCoordinates, coordinate)
187+
}
188+
}
189+
}
190+
191+
if len(buildCoordinates) == 0 {
192+
log.Entry().Warnf("unable to identify artifact coordinates for the maven packages published")
193+
return nil
194+
}
195+
196+
var buildArtifacts build.BuildArtifacts
197+
198+
buildArtifacts.Coordinates = buildCoordinates
199+
jsonResult, _ := json.Marshal(buildArtifacts)
200+
commonPipelineEnvironment.custom.mavenBuildArtifacts = string(jsonResult)
201+
}
202+
203+
return nil
163204
} else {
164205
log.Entry().Infof("publish not detected, ignoring maven deploy")
165206
}

cmd/mavenBuild_generated.go

+15-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/mavenBuild_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,25 @@ func TestMavenBuild(t *testing.T) {
135135
assert.Contains(t, mockedUtils.Calls[0].Params, "profile1,profile2")
136136
})
137137

138+
t.Run("mavenBuild should not create build artifacts metadata when CreateBuildArtifactsMetadata is false and Publish is true", func(t *testing.T) {
139+
mockedUtils := newMavenMockUtils()
140+
mockedUtils.AddFile("pom.xml", []byte{})
141+
config := mavenBuildOptions{CreateBuildArtifactsMetadata: false, Publish: true}
142+
err := runMavenBuild(&config, nil, &mockedUtils, &cpe)
143+
assert.Nil(t, err)
144+
assert.Equal(t, mockedUtils.Calls[0].Exec, "mvn")
145+
assert.Contains(t, mockedUtils.Calls[0].Params, "install")
146+
assert.Empty(t, cpe.custom.mavenBuildArtifacts)
147+
})
148+
149+
t.Run("mavenBuild should not create build artifacts metadata when CreateBuildArtifactsMetadata is true and Publish is false", func(t *testing.T) {
150+
mockedUtils := newMavenMockUtils()
151+
mockedUtils.AddFile("pom.xml", []byte{})
152+
config := mavenBuildOptions{CreateBuildArtifactsMetadata: true, Publish: false}
153+
err := runMavenBuild(&config, nil, &mockedUtils, &cpe)
154+
assert.Nil(t, err)
155+
assert.Equal(t, mockedUtils.Calls[0].Exec, "mvn")
156+
assert.Empty(t, cpe.custom.mavenBuildArtifacts)
157+
})
158+
138159
}

cmd/npmExecuteScripts.go

+20-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package cmd
22

33
import (
4+
"encoding/json"
45
"os"
56

7+
"github.com/SAP/jenkins-library/pkg/build"
68
"github.com/SAP/jenkins-library/pkg/buildsettings"
79
"github.com/SAP/jenkins-library/pkg/log"
810
"github.com/SAP/jenkins-library/pkg/npm"
911
"github.com/SAP/jenkins-library/pkg/telemetry"
12+
"github.com/SAP/jenkins-library/pkg/versioning"
1013
)
1114

1215
func npmExecuteScripts(config npmExecuteScriptsOptions, telemetryData *telemetry.CustomData, commonPipelineEnvironment *npmExecuteScriptsCommonPipelineEnvironment) {
@@ -85,9 +88,11 @@ func runNpmExecuteScripts(npmExecutor npm.Executor, config *npmExecuteScriptsOpt
8588
}
8689
commonPipelineEnvironment.custom.buildSettingsInfo = buildSettingsInfo
8790

91+
buildCoordinates := []versioning.Coordinates{}
92+
8893
if config.Publish {
8994
if len(config.BuildDescriptorList) > 0 {
90-
err = npmExecutor.PublishAllPackages(config.BuildDescriptorList, config.RepositoryURL, config.RepositoryUsername, config.RepositoryPassword, config.PackBeforePublish)
95+
err = npmExecutor.PublishAllPackages(config.BuildDescriptorList, config.RepositoryURL, config.RepositoryUsername, config.RepositoryPassword, config.PackBeforePublish, &buildCoordinates)
9196
if err != nil {
9297
return err
9398
}
@@ -97,12 +102,25 @@ func runNpmExecuteScripts(npmExecutor npm.Executor, config *npmExecuteScriptsOpt
97102
return err
98103
}
99104

100-
err = npmExecutor.PublishAllPackages(packageJSONFiles, config.RepositoryURL, config.RepositoryUsername, config.RepositoryPassword, config.PackBeforePublish)
105+
err = npmExecutor.PublishAllPackages(packageJSONFiles, config.RepositoryURL, config.RepositoryUsername, config.RepositoryPassword, config.PackBeforePublish, &buildCoordinates)
101106
if err != nil {
102107
return err
103108
}
104109
}
105110
}
106111

112+
if config.CreateBuildArtifactsMetadata {
113+
if len(buildCoordinates) == 0 {
114+
log.Entry().Warnf("unable to identify artifact coordinates for the npm packages published")
115+
return nil
116+
}
117+
118+
var buildArtifacts build.BuildArtifacts
119+
120+
buildArtifacts.Coordinates = buildCoordinates
121+
jsonResult, _ := json.Marshal(buildArtifacts)
122+
commonPipelineEnvironment.custom.npmBuildArtifacts = string(jsonResult)
123+
}
124+
107125
return nil
108126
}

cmd/npmExecuteScripts_generated.go

+29-15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/npmExecuteScripts_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -194,4 +194,5 @@ func TestNpmExecuteScripts(t *testing.T) {
194194
v := os.Getenv("NODE_ENV")
195195
assert.Equal(t, "production", v)
196196
})
197+
197198
}

pkg/build/artifact.go

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package build
2+
3+
import "github.com/SAP/jenkins-library/pkg/versioning"
4+
5+
type BuildArtifacts struct {
6+
Coordinates []versioning.Coordinates
7+
}

pkg/npm/mock.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package npm
55

66
import (
77
"fmt"
8+
"github.com/SAP/jenkins-library/pkg/versioning"
89

910
"github.com/SAP/jenkins-library/pkg/mock"
1011
)
@@ -123,6 +124,6 @@ func (n *NpmExecutorMock) CreateBOM(packageJSONFiles []string) error {
123124
}
124125

125126
// CreateBOM mock implementation
126-
func (n *NpmExecutorMock) PublishAllPackages(packageJSONFiles []string, registry, username, password string, packBeforePublish bool) error {
127+
func (n *NpmExecutorMock) PublishAllPackages(packageJSONFiles []string, registry, username, password string, packBeforePublish bool, buildCoordinates *[]versioning.Coordinates) error {
127128
return nil
128129
}

pkg/npm/npm.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/SAP/jenkins-library/pkg/command"
1212
"github.com/SAP/jenkins-library/pkg/log"
1313
"github.com/SAP/jenkins-library/pkg/piperutils"
14+
"github.com/SAP/jenkins-library/pkg/versioning"
1415
)
1516

1617
const (
@@ -34,7 +35,7 @@ type Executor interface {
3435
FindPackageJSONFilesWithScript(packageJSONFiles []string, script string) ([]string, error)
3536
RunScriptsInAllPackages(runScripts []string, runOptions []string, scriptOptions []string, virtualFrameBuffer bool, excludeList []string, packagesList []string) error
3637
InstallAllDependencies(packageJSONFiles []string) error
37-
PublishAllPackages(packageJSONFiles []string, registry, username, password string, packBeforePublish bool) error
38+
PublishAllPackages(packageJSONFiles []string, registry, username, password string, packBeforePublish bool, buildCoordinates *[]versioning.Coordinates) error
3839
SetNpmRegistries() error
3940
CreateBOM(packageJSONFiles []string) error
4041
}

pkg/npm/publish.go

+23-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/SAP/jenkins-library/pkg/log"
1313
CredentialUtils "github.com/SAP/jenkins-library/pkg/piperutils"
14+
"github.com/SAP/jenkins-library/pkg/versioning"
1415
)
1516

1617
type npmMinimalPackageDescriptor struct {
@@ -31,7 +32,7 @@ func (pd *npmMinimalPackageDescriptor) Scope() string {
3132
}
3233

3334
// PublishAllPackages executes npm publish for all package.json files defined in packageJSONFiles list
34-
func (exec *Execute) PublishAllPackages(packageJSONFiles []string, registry, username, password string, packBeforePublish bool) error {
35+
func (exec *Execute) PublishAllPackages(packageJSONFiles []string, registry, username, password string, packBeforePublish bool, buildCoordinates *[]versioning.Coordinates) error {
3536
for _, packageJSON := range packageJSONFiles {
3637
log.Entry().Infof("triggering publish for %s", packageJSON)
3738

@@ -43,7 +44,7 @@ func (exec *Execute) PublishAllPackages(packageJSONFiles []string, registry, use
4344
return fmt.Errorf("package.json file '%s' not found: %w", packageJSON, err)
4445
}
4546

46-
err = exec.publish(packageJSON, registry, username, password, packBeforePublish)
47+
err = exec.publish(packageJSON, registry, username, password, packBeforePublish, buildCoordinates)
4748
if err != nil {
4849
return err
4950
}
@@ -52,7 +53,7 @@ func (exec *Execute) PublishAllPackages(packageJSONFiles []string, registry, use
5253
}
5354

5455
// publish executes npm publish for package.json
55-
func (exec *Execute) publish(packageJSON, registry, username, password string, packBeforePublish bool) error {
56+
func (exec *Execute) publish(packageJSON, registry, username, password string, packBeforePublish bool, buildCoordinates *[]versioning.Coordinates) error {
5657
execRunner := exec.Utils.GetExecRunner()
5758

5859
oldWorkingDirectory, err := exec.Utils.Getwd()
@@ -202,6 +203,25 @@ func (exec *Execute) publish(packageJSON, registry, username, password string, p
202203
}
203204
}
204205

206+
options := versioning.Options{}
207+
var utils versioning.Utils
208+
209+
artifact, err := versioning.GetArtifact("npm", packageJSON, &options, utils)
210+
if err != nil {
211+
log.Entry().Warnf("unable to get artifact metdata : %v", err)
212+
} else {
213+
coordinate, err := artifact.GetCoordinates()
214+
if err != nil {
215+
log.Entry().Warnf("unable to get artifact coordinates : %v", err)
216+
} else {
217+
coordinate.BuildPath = filepath.Dir(packageJSON)
218+
coordinate.URL = registry
219+
coordinate.Packaging = "tgz"
220+
221+
*buildCoordinates = append(*buildCoordinates, coordinate)
222+
}
223+
}
224+
205225
return nil
206226
}
207227

0 commit comments

Comments
 (0)