Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Artifactory Release Lifecycle Management - Support release bundle creation by aql #915

Merged
merged 3 commits into from
Mar 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
38 changes: 38 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,8 @@
- [Creating Lifecycle Service Config](#creating-lifeCycle-service-config)
- [Creating New Lifecycle Service Manager](#creating-new-lifeCycle-service-manager)
- [Using Lifecycle Services](#using-lifeCycle-services)
- [Creating a Release Bundle From AQL](#creating-a-release-bundle-from-aql)
- [Creating a Release Bundle From Artifacts](#creating-a-release-bundle-from-artifacts)
- [Creating a Release Bundle From Published Builds](#creating-a-release-bundle-from-published-builds)
- [Creating a Release Bundle From Release Bundles](#creating-a-release-bundle-from-release-bundles)
- [Promoting a Release Bundle](#promoting-a-release-bundle)
Expand Down Expand Up @@ -2434,6 +2436,42 @@ lifecycleManager, err := lifecycle.New(serviceConfig)

### Using Lifecycle Services

#### Creating a Release Bundle From AQL

```go
rbDetails := ReleaseBundleDetails{"rbName", "rbVersion"}
queryParams := CommonOptionalQueryParams{}
queryParams.ProjectKey = "project"
queryParams.Async = true

// The GPG/RSA key-pair name given in Artifactory.
signingKeyName = "key-pair"

aqlQuery := `items.find({"repo": "my-repo","path": ".","name": "a2.in"})`
serviceManager.CreateReleaseBundleFromAql(rbDetails, queryParams, signingKeyName, aqlQuery)
```

#### Creating a Release Bundle From Artifacts

```go
rbDetails := ReleaseBundleDetails{"rbName", "rbVersion"}
queryParams := CommonOptionalQueryParams{}
queryParams.ProjectKey = "project"
queryParams.Async = true

// The GPG/RSA key-pair name given in Artifactory.
signingKeyName = "key-pair"

artifacts := CreateFromArtifacts{Artifacts: []ArtifactSource{
{
Path: "repo/path/file",
Sha256: "3e3deb6628658a48cf0d280a2210211f9d977ec2e10a4619b95d5fb85cb10450",
},
}}

serviceManager.CreateReleaseBundleFromArtifacts(rbDetails, queryParams, signingKeyName, artifacts)
```

#### Creating a Release Bundle From Published Builds

```go
Expand Down
4 changes: 2 additions & 2 deletions artifactory/services/utils/artifactoryutils.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ func HasPrefix(paths []string, prefix string) bool {
// If no buildNumber provided LATEST will be downloaded.
// If buildName or buildNumber contains "/" (slash) it should be escaped by "\" (backslash).
// Result examples of parsing: "aaa/123" > "aaa"-"123", "aaa" > "aaa"-"LATEST", "aaa\\/aaa" > "aaa/aaa"-"LATEST", "aaa/12\\/3" > "aaa"-"12/3".
func getBuildNameAndNumberFromBuildIdentifier(buildIdentifier, projectKey string, flags CommonConf) (string, string, error) {
func GetBuildNameAndNumberFromBuildIdentifier(buildIdentifier, projectKey string, flags CommonConf) (string, string, error) {
buildName, buildNumber, err := ParseNameAndVersion(buildIdentifier, true)
if err != nil {
return "", "", err
Expand Down Expand Up @@ -265,7 +265,7 @@ func filterAqlSearchResultsByBuild(specFile *CommonParams, reader *content.Conte
var wg sync.WaitGroup
wg.Add(2)
// If 'build-number' is missing in spec file, we fetch the latest from artifactory.
buildName, buildNumber, err := getBuildNameAndNumberFromBuildIdentifier(specFile.Build, specFile.Project, flags)
buildName, buildNumber, err := GetBuildNameAndNumberFromBuildIdentifier(specFile.Build, specFile.Project, flags)
if err != nil {
return nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion artifactory/services/utils/searchutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ const (
// Use this function when searching by build without pattern or aql.
// Collect build artifacts and build dependencies separately, then merge the results into one reader.
func SearchBySpecWithBuild(specFile *CommonParams, flags CommonConf) (readerContent *content.ContentReader, err error) {
buildName, buildNumber, err := getBuildNameAndNumberFromBuildIdentifier(specFile.Build, specFile.Project, flags)
buildName, buildNumber, err := GetBuildNameAndNumberFromBuildIdentifier(specFile.Build, specFile.Project, flags)
if err != nil {
return nil, err
}
Expand Down
6 changes: 6 additions & 0 deletions lifecycle/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ func (lcs *LifecycleServicesManager) Client() *jfroghttpclient.JfrogHttpClient {
return lcs.client
}

func (lcs *LifecycleServicesManager) CreateReleaseBundleFromAql(rbDetails lifecycle.ReleaseBundleDetails,
queryParams lifecycle.CommonOptionalQueryParams, signingKeyName string, aqlQuery string) error {
rbService := lifecycle.NewReleaseBundlesService(lcs.config.GetServiceDetails(), lcs.client)
return rbService.CreateFromAql(rbDetails, queryParams, signingKeyName, aqlQuery)
}

func (lcs *LifecycleServicesManager) CreateReleaseBundleFromArtifacts(rbDetails lifecycle.ReleaseBundleDetails,
queryParams lifecycle.CommonOptionalQueryParams, signingKeyName string, sourceArtifacts lifecycle.CreateFromArtifacts) error {
rbService := lifecycle.NewReleaseBundlesService(lcs.config.GetServiceDetails(), lcs.client)
Expand Down
50 changes: 23 additions & 27 deletions lifecycle/services/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ const (
releaseBundleBaseApi = "api/v2/release_bundle"
)

type sourceType string
type SourceType string

const (
artifacts sourceType = "artifacts"
builds sourceType = "builds"
releaseBundles sourceType = "release_bundles"
Aql SourceType = "aql"
Artifacts SourceType = "artifacts"
Builds SourceType = "builds"
ReleaseBundles SourceType = "release_bundles"
)

type createOperation struct {
Expand Down Expand Up @@ -38,45 +39,40 @@ func (c *createOperation) getSigningKeyName() string {
return c.signingKeyName
}

func (rbs *ReleaseBundlesService) CreateFromAql(rbDetails ReleaseBundleDetails, params CommonOptionalQueryParams, signingKeyName string, aqlQuery string) error {
return rbs.CreateReleaseBundle(rbDetails, params, signingKeyName, Aql, CreateFromAqlSource{Aql: aqlQuery})
}

func (rbs *ReleaseBundlesService) CreateFromArtifacts(rbDetails ReleaseBundleDetails, params CommonOptionalQueryParams, signingKeyName string, sourceArtifacts CreateFromArtifacts) error {
operation := createOperation{
reqBody: RbCreationBody{
ReleaseBundleDetails: rbDetails,
SourceType: artifacts,
Source: sourceArtifacts},
params: params,
signingKeyName: signingKeyName,
}
_, err := rbs.doOperation(&operation)
return err
return rbs.CreateReleaseBundle(rbDetails, params, signingKeyName, Artifacts, sourceArtifacts)
}

func (rbs *ReleaseBundlesService) CreateFromBuilds(rbDetails ReleaseBundleDetails, params CommonOptionalQueryParams, signingKeyName string, sourceBuilds CreateFromBuildsSource) error {
operation := createOperation{
reqBody: RbCreationBody{
ReleaseBundleDetails: rbDetails,
SourceType: builds,
Source: sourceBuilds},
params: params,
signingKeyName: signingKeyName,
}
_, err := rbs.doOperation(&operation)
return err
return rbs.CreateReleaseBundle(rbDetails, params, signingKeyName, Builds, sourceBuilds)
}

func (rbs *ReleaseBundlesService) CreateFromBundles(rbDetails ReleaseBundleDetails, params CommonOptionalQueryParams, signingKeyName string, sourceReleaseBundles CreateFromReleaseBundlesSource) error {
return rbs.CreateReleaseBundle(rbDetails, params, signingKeyName, ReleaseBundles, sourceReleaseBundles)
}

func (rbs *ReleaseBundlesService) CreateReleaseBundle(rbDetails ReleaseBundleDetails, params CommonOptionalQueryParams,
signingKeyName string, rbSourceType SourceType, source interface{}) error {
operation := createOperation{
reqBody: RbCreationBody{
ReleaseBundleDetails: rbDetails,
SourceType: releaseBundles,
Source: sourceReleaseBundles},
SourceType: rbSourceType,
Source: source},
params: params,
signingKeyName: signingKeyName,
}
_, err := rbs.doOperation(&operation)
return err
}

type CreateFromAqlSource struct {
Aql string `json:"aql,omitempty"`
}

type SourceBuildDetails struct {
BuildName string
BuildNumber string
Expand Down Expand Up @@ -115,6 +111,6 @@ type ReleaseBundleSource struct {

type RbCreationBody struct {
ReleaseBundleDetails
SourceType sourceType `json:"source_type,omitempty"`
SourceType SourceType `json:"source_type,omitempty"`
Source interface{} `json:"source,omitempty"`
}
Loading