feat: tag releases on merged prs

This commit is contained in:
Julian Tölle 2024-08-04 21:22:22 +02:00
parent fe871a0213
commit 6120821631
5 changed files with 337 additions and 33 deletions

View file

@ -40,9 +40,16 @@ func init() {
runCmd.PersistentFlags().StringVar(&flagRepo, "repo", "", "")
}
func run(cmd *cobra.Command, args []string) error {
func run(cmd *cobra.Command, _ []string) error {
ctx := cmd.Context()
logger.DebugContext(ctx, "run called",
"forge", flagForge,
"branch", flagBranch,
"owner", flagOwner,
"repo", flagRepo,
)
var f rp.Forge
forgeOptions := rp.ForgeOptions{
@ -54,6 +61,7 @@ func run(cmd *cobra.Command, args []string) error {
//case "gitlab":
//f = rp.NewGitLab(forgeOptions)
case "github":
logger.DebugContext(ctx, "using forge GitHub")
f = rp.NewGitHub(logger, &rp.GitHubOptions{
ForgeOptions: forgeOptions,
Owner: flagOwner,
@ -61,6 +69,11 @@ func run(cmd *cobra.Command, args []string) error {
})
}
err := createPendingReleases(ctx, f)
if err != nil {
return fmt.Errorf("failed to create pending releases: %w", err)
}
changesets, releases, err := getChangesetsFromForge(ctx, f)
if err != nil {
return fmt.Errorf("failed to get changesets: %w", err)
@ -74,6 +87,70 @@ func run(cmd *cobra.Command, args []string) error {
return nil
}
func createPendingReleases(ctx context.Context, forge rp.Forge) error {
logger.InfoContext(ctx, "checking for pending releases")
prs, err := forge.PendingReleases(ctx)
if err != nil {
return err
}
if len(prs) == 0 {
logger.InfoContext(ctx, "No pending releases found")
return nil
}
logger.InfoContext(ctx, "Found pending releases", "length", len(prs))
for _, pr := range prs {
err = createPendingRelease(ctx, forge, pr)
if err != nil {
return err
}
}
return nil
}
func createPendingRelease(ctx context.Context, forge rp.Forge, pr *rp.ReleasePullRequest) error {
logger := logger.With("pr.id", pr.ID, "pr.title", pr.Title)
if pr.ReleaseCommit == nil {
return fmt.Errorf("pull request is missing the merge commit")
}
logger.Info("Creating release", "commit.hash", pr.ReleaseCommit.Hash)
version, err := pr.Version()
if err != nil {
return err
}
changelog, err := pr.ChangelogText()
if err != nil {
return err
}
// TODO: pre-release & latest
logger.DebugContext(ctx, "Creating release on forge")
err = forge.CreateRelease(ctx, *pr.ReleaseCommit, version, changelog, false, true)
if err != nil {
return fmt.Errorf("failed to create release on forge: %w", err)
}
logger.DebugContext(ctx, "created release", "release.title", version, "release.url", forge.ReleaseURL(version))
logger.DebugContext(ctx, "updating pr labels")
err = forge.SetPullRequestLabels(ctx, pr, []string{rp.LabelReleasePending}, []string{rp.LabelReleaseTagged})
if err != nil {
return err
}
logger.DebugContext(ctx, "updated pr labels")
logger.InfoContext(ctx, "Created release", "release.title", version, "release.url", forge.ReleaseURL(version))
return nil
}
func getChangesetsFromForge(ctx context.Context, forge rp.Forge) ([]rp.Changeset, rp.Releases, error) {
releases, err := forge.LatestTags(ctx)
if err != nil {
@ -123,6 +200,20 @@ func reconcileReleasePR(ctx context.Context, forge rp.Forge, changesets []rp.Cha
logger.InfoContext(ctx, "found existing release pull request", "pr.id", pr.ID, "pr.title", pr.Title)
}
if len(changesets) == 0 {
if pr != nil {
logger.InfoContext(ctx, "closing existing pull requests, no changesets available", "pr.id", pr.ID, "pr.title", pr.Title)
err = forge.ClosePullRequest(ctx, pr)
if err != nil {
return err
}
} else {
logger.InfoContext(ctx, "No changesets available for release")
}
return nil
}
var releaseOverrides rp.ReleaseOverrides
if pr != nil {
releaseOverrides, err = pr.GetOverrides()