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 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
package release
import (
"fmt"
"log"
"time"
"github.com/Azure/azure-sdk-for-go/eng/tools/generator/cmd/v2/common"
"github.com/Azure/azure-sdk-for-go/eng/tools/generator/flags"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)
var (
releaseBranchNamePattern = "release-%s-%s-%s-%v"
)
// Release command
func Command() *cobra.Command {
releaseCmd := &cobra.Command{
Use: "release-v2 <azure-sdk-for-go directory/commitid> <azure-rest-api-specs directory/commitid> <rp-name> [namespaceName]",
Short: "Generate a v2 release of azure-sdk-for-go",
Long: `This command will generate a new v2 release for azure-sdk-for-go with given rp name and namespace name.
azure-sdk-for-go directory/commitid: the directory path of the azure-sdk-for-go with git control or just a commitid for remote repo
azure-rest-api-specs directory: the directory path of the azure-rest-api-specs with git control or just a commitid for remote repo
rp-name: name of resource provider to be released, same for the swagger folder name
namespaceName: name of namespace to be released, default value is arm+rp-name
`,
Args: cobra.RangeArgs(3, 4),
RunE: func(cmd *cobra.Command, args []string) error {
rpName := args[2]
namespaceName := "arm" + rpName
if len(args) == 4 {
namespaceName = args[3]
}
ctx := commandContext{
rpName: rpName,
namespaceName: namespaceName,
flags: ParseFlags(cmd.Flags()),
}
return ctx.execute(args[0], args[1])
},
}
BindFlags(releaseCmd.Flags())
return releaseCmd
}
type Flags struct {
VersionNumber string
SwaggerRepo string
PackageTitle string
SDKRepo string
SpecRPName string
ReleaseDate string
SkipCreateBranch bool
SkipGenerateExample bool
PackageConfig string
GoVersion string
}
func BindFlags(flagSet *pflag.FlagSet) {
flagSet.String("version-number", "", "Specify the version number of this release")
flagSet.String("package-title", "", "Specifies the title of this package")
flagSet.String("sdk-repo", "https://github.com/Azure/azure-sdk-for-go", "Specifies the sdk repo URL for generation")
flagSet.String("spec-repo", "https://github.com/Azure/azure-rest-api-specs", "Specifies the swagger repo URL for generation")
flagSet.String("spec-rp-name", "", "Specifies the swagger spec RP name, default is RP name")
flagSet.String("release-date", "", "Specifies the release date in changelog")
flagSet.Bool("skip-create-branch", false, "Skip create release branch after generation")
flagSet.Bool("skip-generate-example", false, "Skip generate example for SDK in the same time")
flagSet.String("package-config", "", "Additional config for package")
flagSet.String("go-version", "1.18", "Go version")
}
func ParseFlags(flagSet *pflag.FlagSet) Flags {
return Flags{
VersionNumber: flags.GetString(flagSet, "version-number"),
PackageTitle: flags.GetString(flagSet, "package-title"),
SDKRepo: flags.GetString(flagSet, "sdk-repo"),
SwaggerRepo: flags.GetString(flagSet, "spec-repo"),
SpecRPName: flags.GetString(flagSet, "spec-rp-name"),
ReleaseDate: flags.GetString(flagSet, "release-date"),
SkipCreateBranch: flags.GetBool(flagSet, "skip-create-branch"),
SkipGenerateExample: flags.GetBool(flagSet, "skip-generate-example"),
PackageConfig: flags.GetString(flagSet, "package-config"),
GoVersion: flags.GetString(flagSet, "go-version"),
}
}
type commandContext struct {
rpName string
namespaceName string
flags Flags
}
func (c *commandContext) execute(sdkRepoParam, specRepoParam string) error {
sdkRepo, err := common.GetSDKRepo(sdkRepoParam, c.flags.SDKRepo)
if err != nil {
return err
}
specCommitHash, err := common.GetSpecCommit(specRepoParam)
if err != nil {
return err
}
log.Printf("Release generation for rp: %s, namespace: %s", c.rpName, c.namespaceName)
generateCtx := common.GenerateContext{
SDKPath: sdkRepo.Root(),
SDKRepo: &sdkRepo,
SpecCommitHash: specCommitHash,
SpecRepoURL: c.flags.SwaggerRepo,
}
if c.flags.SpecRPName == "" {
c.flags.SpecRPName = c.rpName
}
result, err := generateCtx.GenerateForSingleRPNamespace(&common.GenerateParam{
RPName: c.rpName,
NamespaceName: c.namespaceName,
NamespaceConfig: c.flags.PackageConfig,
SpecficPackageTitle: c.flags.PackageTitle,
SpecficVersion: c.flags.VersionNumber,
SpecRPName: c.flags.SpecRPName,
ReleaseDate: c.flags.ReleaseDate,
SkipGenerateExample: c.flags.SkipGenerateExample,
GoVersion: c.flags.GoVersion,
})
if err != nil {
return fmt.Errorf("failed to finish release generation process: %+v", err)
}
// print generation result
log.Printf("Generation result: %s", result)
if !c.flags.SkipCreateBranch {
log.Printf("Create new branch for release")
releaseBranchName := fmt.Sprintf(releaseBranchNamePattern, c.rpName, c.namespaceName, result.Version, time.Now().Unix())
if err := sdkRepo.CreateReleaseBranch(releaseBranchName); err != nil {
return fmt.Errorf("failed to create release branch: %+v", err)
}
log.Printf("Include the packages that is about to release in this release and do release commit...")
// append a time in long to avoid collision of branch names
if err := sdkRepo.AddReleaseCommit(c.rpName, c.namespaceName, generateCtx.SpecCommitHash, result.Version); err != nil {
return fmt.Errorf("failed to add release package or do release commit: %+v", err)
}
}
return nil
}
|