From b0489e2e2c20ed5c43f80bc9af4c31da431e8e89 Mon Sep 17 00:00:00 2001 From: Matt Clegg Date: Fri, 28 Jun 2024 13:00:10 +0100 Subject: [PATCH 1/2] USE URL from API when private Signed-off-by: Matt Clegg --- pkg/github/github.go | 28 ++++++++++++++++++++++++---- pkg/releaser/releaser.go | 31 +++++++++++++++++++++++++++---- pkg/releaser/releaser_test.go | 10 +++++----- 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/pkg/github/github.go b/pkg/github/github.go index 4143c50d..0c826e4a 100644 --- a/pkg/github/github.go +++ b/pkg/github/github.go @@ -29,6 +29,10 @@ import ( "golang.org/x/oauth2" ) +type Repository struct { + *github.Repository +} + type Release struct { Name string Description string @@ -39,8 +43,9 @@ type Release struct { } type Asset struct { - Path string - URL string + Path string + BrowserDownloadURL string + URL string } // Client is the client for interacting with the GitHub API @@ -95,8 +100,13 @@ func (c *Client) GetRelease(_ context.Context, tag string) (*Release, error) { result := &Release{ Assets: []*Asset{}, } - for _, ass := range release.Assets { - asset := &Asset{*ass.Name, *ass.BrowserDownloadURL} + + for _, releaseAsset := range release.Assets { + asset := &Asset{ + *releaseAsset.Name, + *releaseAsset.BrowserDownloadURL, + *releaseAsset.URL, + } result.Assets = append(result.Assets, asset) } return result, nil @@ -126,6 +136,16 @@ func (c *Client) CreateRelease(_ context.Context, input *Release) error { return nil } +func (c *Client) GetRepository() (*Repository, error) { + repository, _, err := c.Repositories.Get(context.TODO(), c.owner, c.repo) + if err != nil { + return nil, err + } + return &Repository{ + Repository: repository, + }, nil +} + // CreatePullRequest creates a pull request in the repository specified by repoURL. // The return value is the pull request URL. func (c *Client) CreatePullRequest(owner string, repo string, message string, head string, base string) (string, error) { diff --git a/pkg/releaser/releaser.go b/pkg/releaser/releaser.go index 439ae818..d81e5ff1 100644 --- a/pkg/releaser/releaser.go +++ b/pkg/releaser/releaser.go @@ -50,6 +50,7 @@ type GitHub interface { CreateRelease(ctx context.Context, input *github.Release) error GetRelease(ctx context.Context, tag string) (*github.Release, error) CreatePullRequest(owner string, repo string, message string, head string, base string) (string, error) + GetRepository() (*github.Repository, error) } type Git interface { @@ -138,6 +139,12 @@ func (r *Releaser) UpdateIndexFile() (bool, error) { return false, err } + // GetRepository to confirm if it's Private + repository, err := r.github.GetRepository() + if err != nil { + return false, err + } + var update bool for _, chartPackage := range chartPackages { ch, err := loader.LoadFile(chartPackage) @@ -162,8 +169,9 @@ func (r *Releaser) UpdateIndexFile() (bool, error) { } for _, asset := range release.Assets { - downloadURL, _ := url.Parse(asset.URL) + downloadURL, _ := url.Parse(asset.BrowserDownloadURL) name := filepath.Base(downloadURL.Path) + // Ignore any other files added in the release by the users. if filepath.Ext(name) != chartAssetFileExtension { continue @@ -173,7 +181,11 @@ func (r *Releaser) UpdateIndexFile() (bool, error) { packageName, packageVersion := tagParts[0], tagParts[1] fmt.Printf("Found %s-%s.tgz\n", packageName, packageVersion) if _, err := indexFile.Get(packageName, packageVersion); err != nil { - if err := r.addToIndexFile(indexFile, downloadURL.String()); err != nil { + overrideURL := "" + if *repository.Private { + overrideURL = asset.URL + } + if err := r.addToIndexFile(indexFile, downloadURL.String(), overrideURL); err != nil { return false, err } update = true @@ -255,7 +267,7 @@ func (r *Releaser) splitPackageNameAndVersion(pkg string) []string { return []string{pkg[0:delimIndex], pkg[delimIndex+1:]} } -func (r *Releaser) addToIndexFile(indexFile *repo.IndexFile, url string) error { +func (r *Releaser) addToIndexFile(indexFile *repo.IndexFile, url string, overrideURL string) error { arch := filepath.Join(r.config.PackagePath, filepath.Base(url)) // extract chart metadata @@ -284,7 +296,18 @@ func (r *Releaser) addToIndexFile(indexFile *repo.IndexFile, url string) error { } // Add to index - return indexFile.MustAdd(c.Metadata, filepath.Base(arch), strings.Join(s, "/"), hash) + addToIndex := indexFile.MustAdd(c.Metadata, filepath.Base(arch), strings.Join(s, "/"), hash) + + // replace the URL for Private GitHub repos + if overrideURL != "" { + for _, entry := range indexFile.Entries[c.Metadata.Name] { + if entry.Digest == hash { + entry.URLs = []string{overrideURL} + } + } + } + + return addToIndex } // CreateReleases finds and uploads Helm chart packages to GitHub diff --git a/pkg/releaser/releaser_test.go b/pkg/releaser/releaser_test.go index 55c7841f..13b75cee 100644 --- a/pkg/releaser/releaser_test.go +++ b/pkg/releaser/releaser_test.go @@ -98,12 +98,12 @@ func (f *FakeGitHub) GetRelease(ctx context.Context, tag string) (*github.Releas Description: "A Helm chart for Kubernetes", Assets: []*github.Asset{ { - Path: "testdata/release-packages/test-chart-0.1.0.tgz", - URL: "https://myrepo/charts/test-chart-0.1.0.tgz", + Path: "testdata/release-packages/test-chart-0.1.0.tgz", + BrowserDownloadURL: "https://myrepo/charts/test-chart-0.1.0.tgz", }, { - Path: "testdata/release-packages/third-party-file-0.1.0.txt", - URL: "https://myrepo/charts/third-party-file-0.1.0.txt", + Path: "testdata/release-packages/third-party-file-0.1.0.txt", + BrowserDownloadURL: "https://myrepo/charts/third-party-file-0.1.0.txt", }, }, } @@ -336,7 +336,7 @@ func TestReleaser_addToIndexFile(t *testing.T) { t.Run(tt.name, func(t *testing.T) { indexFile := repo.NewIndexFile() url := fmt.Sprintf("https://myrepo/charts/%s-%s.tgz", tt.chart, tt.version) - err := tt.releaser.addToIndexFile(indexFile, url) + err := tt.releaser.addToIndexFile(indexFile, url, "") if tt.error { assert.Error(t, err) assert.False(t, indexFile.Has(tt.chart, tt.version)) From 1ed59ff406362ffb82697c718de18f7c102be9f0 Mon Sep 17 00:00:00 2001 From: Matt Clegg Date: Wed, 3 Jul 2024 10:53:19 +0100 Subject: [PATCH 2/2] FIX FakeGitHub Signed-off-by: Matt Clegg --- pkg/github/github.go | 7 ++++--- pkg/releaser/releaser_test.go | 7 +++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/pkg/github/github.go b/pkg/github/github.go index 0c826e4a..e66d3de7 100644 --- a/pkg/github/github.go +++ b/pkg/github/github.go @@ -29,8 +29,9 @@ import ( "golang.org/x/oauth2" ) +// Repository represents a GitHub repository. type Repository struct { - *github.Repository + Private *bool `json:"private,omitempty"` } type Release struct { @@ -137,12 +138,12 @@ func (c *Client) CreateRelease(_ context.Context, input *Release) error { } func (c *Client) GetRepository() (*Repository, error) { - repository, _, err := c.Repositories.Get(context.TODO(), c.owner, c.repo) + r, _, err := c.Repositories.Get(context.TODO(), c.owner, c.repo) if err != nil { return nil, err } return &Repository{ - Repository: repository, + Private: r.Private, }, nil } diff --git a/pkg/releaser/releaser_test.go b/pkg/releaser/releaser_test.go index 13b75cee..2e0c6433 100644 --- a/pkg/releaser/releaser_test.go +++ b/pkg/releaser/releaser_test.go @@ -110,6 +110,13 @@ func (f *FakeGitHub) GetRelease(ctx context.Context, tag string) (*github.Releas return release, nil } +func (f *FakeGitHub) GetRepository() (*github.Repository, error) { + b := false + return &github.Repository{ + Private: &b, + }, nil +} + func (f *FakeGitHub) CreatePullRequest(owner string, repo string, message string, head string, base string) (string, error) { f.Called(owner, repo, message, head, base) return "https://github.com/owner/repo/pull/42", nil