Skip to content

Commit 62652ec

Browse files
Add use-existing-release option to upload functionality
This makes it possible to add the release packages to an existing release instead of creating a new release. This is useful when a release is used to trigger the helm package and upload.
1 parent fc4d837 commit 62652ec

File tree

7 files changed

+43
-8
lines changed

7 files changed

+43
-8
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ Flags:
8585
--release-name-template string Go template for computing release names, using chart metadata (default "{{ .Name }}-{{ .Version }}")
8686
--release-notes-file string Markdown file with chart release notes. If it is set to empty string, or the file is not found, the chart description will be used instead. The file is read from the chart package
8787
--skip-existing Skip upload if release exists
88+
--use-existing-release Add pacakges to exisiting release instead of creating new release
8889
-t, --token string GitHub Auth Token
8990
--make-release-latest bool Mark the created GitHub release as 'latest' (default "true")
9091
--packages-with-index Host the package files in the GitHub Pages branch

cr/cmd/upload.go

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ func init() {
5252
uploadCmd.Flags().StringP("git-upload-url", "u", "https://uploads.github.com/", "GitHub Upload URL (only needed for private GitHub)")
5353
uploadCmd.Flags().StringP("commit", "c", "", "Target commit for release")
5454
uploadCmd.Flags().Bool("skip-existing", false, "Skip upload if release exists")
55+
uploadCmd.Flags().Bool("use-existing-release", false, "Skip upload if release exists")
5556
uploadCmd.Flags().String("release-name-template", "{{ .Name }}-{{ .Version }}", "Go template for computing release names, using chart metadata")
5657
uploadCmd.Flags().String("release-notes-file", "", "Markdown file with chart release notes. "+
5758
"If it is set to empty string, or the file is not found, the chart description will be used instead. The file is read from the chart package")

doc/cr_upload.md

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ cr upload [flags]
3030
--release-notes-file string Markdown file with chart release notes. If it is set to empty string, or the file is not found, the chart description will be used instead. The file is read from the chart package
3131
--remote string The Git remote used when creating a local worktree for the GitHub Pages branch (default "origin")
3232
--skip-existing Skip upload if release exists
33+
--use-existing-release Add pacakges to exisiting release instead of creating new release
3334
-t, --token string GitHub Auth Token
3435
```
3536

pkg/config/config.go

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ type Options struct {
5858
Remote string `mapstructure:"remote"`
5959
ReleaseNameTemplate string `mapstructure:"release-name-template"`
6060
SkipExisting bool `mapstructure:"skip-existing"`
61+
UseExistingRelease bool `mapstructure:"use-existing-release"`
6162
ReleaseNotesFile string `mapstructure:"release-notes-file"`
6263
GenerateReleaseNotes bool `mapstructure:"generate-release-notes"`
6364
MakeReleaseLatest bool `mapstructure:"make-release-latest"`

pkg/github/github.go

+24-6
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,20 @@ func (c *Client) CreateRelease(_ context.Context, input *Release) error {
118118
return err
119119
}
120120

121-
for _, asset := range input.Assets {
122-
if err := c.uploadReleaseAsset(context.TODO(), *release.ID, asset.Path); err != nil {
123-
return err
124-
}
121+
return c.uploadReleaseAssets(context.TODO(), *release.ID, input.Assets)
122+
}
123+
124+
// AddAssetsToRelease Adds assets to an existing release
125+
func (c *Client) AddAssetsToRelease(_ context.Context, releaseName string, assets []*Asset) error {
126+
release, _, err := c.Repositories.GetReleaseByTag(context.TODO(), c.owner, c.repo, releaseName)
127+
if err != nil {
128+
return err
125129
}
126-
return nil
130+
if release == nil {
131+
return errors.Wrapf(err, "could not find GitHub release to add assets %s", releaseName)
132+
}
133+
134+
return c.uploadReleaseAssets(context.TODO(), *release.ID, assets)
127135
}
128136

129137
// CreatePullRequest creates a pull request in the repository specified by repoURL.
@@ -149,7 +157,17 @@ func (c *Client) CreatePullRequest(owner string, repo string, message string, he
149157
return *pullRequest.HTMLURL, nil
150158
}
151159

152-
// UploadAsset uploads specified assets to a given release object
160+
// uploadReleaseAssets uploads specified assets to a given release object
161+
func (c *Client) uploadReleaseAssets(_ context.Context, releaseID int64, assets []*Asset) error {
162+
for _, asset := range assets {
163+
if err := c.uploadReleaseAsset(context.TODO(), releaseID, asset.Path); err != nil {
164+
return err
165+
}
166+
}
167+
return nil
168+
}
169+
170+
// uploadReleaseAsset uploads specified an asset to a given release object
153171
func (c *Client) uploadReleaseAsset(_ context.Context, releaseID int64, filename string) error {
154172
filename, err := filepath.Abs(filename)
155173
if err != nil {

pkg/releaser/releaser.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import (
4949
// objects
5050
type GitHub interface {
5151
CreateRelease(ctx context.Context, input *github.Release) error
52+
AddAssetsToRelease(ctx context.Context, tag string, assets []*github.Asset) error
5253
GetRelease(ctx context.Context, tag string) (*github.Release, error)
5354
CreatePullRequest(owner string, repo string, message string, head string, base string) (string, error)
5455
}
@@ -341,8 +342,15 @@ func (r *Releaser) CreateReleases() error {
341342
continue
342343
}
343344
}
344-
if err := r.github.CreateRelease(context.TODO(), release); err != nil {
345-
return errors.Wrapf(err, "error creating GitHub release %s", releaseName)
345+
346+
if r.config.UseExistingRelease {
347+
if err := r.github.AddAssetsToRelease(context.TODO(), releaseName, release.Assets); err != nil {
348+
return errors.Wrapf(err, "error adding assets to GitHub release %s", releaseName)
349+
}
350+
} else {
351+
if err := r.github.CreateRelease(context.TODO(), release); err != nil {
352+
return errors.Wrapf(err, "error creating GitHub release %s", releaseName)
353+
}
346354
}
347355

348356
if r.config.PackagesWithIndex {

pkg/releaser/releaser_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ func (f *FakeGitHub) CreateRelease(ctx context.Context, input *github.Release) e
9292
return nil
9393
}
9494

95+
func (f *FakeGitHub) AddAssetsToRelease(ctx context.Context, releaseName string, assets []*github.Asset) error {
96+
f.Called(ctx, releaseName, assets)
97+
return nil
98+
}
99+
95100
func (f *FakeGitHub) GetRelease(ctx context.Context, tag string) (*github.Release, error) { //nolint: revive
96101
release := &github.Release{
97102
Name: "testdata/release-packages/test-chart-0.1.0",

0 commit comments

Comments
 (0)