You've already forked go-semantic-release
84 lines
2.2 KiB
Go
84 lines
2.2 KiB
Go
package releaser
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"github.com/Nightapes/go-semantic-release/pkg/config"
|
|
"github.com/google/go-github/v25/github"
|
|
"net/http"
|
|
"os"
|
|
)
|
|
|
|
// GITHUB identifer for github interface
|
|
const GITHUB = "GitHub"
|
|
|
|
// GitHubReleaser type struct
|
|
type GitHubReleaser struct {
|
|
config *config.ReleaseConfig
|
|
client *github.Client
|
|
context context.Context
|
|
release *github.RepositoryRelease
|
|
}
|
|
|
|
type gitHubCreateReleaseResponse struct {
|
|
ReleaseURL string `json:url`
|
|
AssetUploadURL string `json:upload_url`
|
|
}
|
|
|
|
// NewGitHubReleaser initialize a new GitHubRelease
|
|
func NewGitHubReleaser(c *config.ReleaseConfig) *GitHubReleaser {
|
|
ctx := context.Background()
|
|
httpClient := createHTTPClient(ctx, c.Github.AccessToken)
|
|
|
|
return &GitHubReleaser{
|
|
config: c,
|
|
client: github.NewClient(httpClient),
|
|
context: ctx,
|
|
}
|
|
}
|
|
|
|
// CreateRelease creates release on remote
|
|
func (g GitHubReleaser) CreateRelease(tag, releaseName, releaseMessage, targetBranch string) error {
|
|
|
|
release, resp, err := g.client.Repositories.CreateRelease(g.context, g.config.Github.User, g.config.Github.URL, &github.RepositoryRelease{
|
|
TagName: &tag,
|
|
TargetCommitish: &targetBranch,
|
|
Name: &releaseName,
|
|
Body: &releaseMessage,
|
|
Draft: &g.config.IsDraft,
|
|
Prerelease: &g.config.IsPreRelease,
|
|
})
|
|
|
|
if err != nil {
|
|
return fmt.Errorf("releaser: github: Could not create release: %v", err)
|
|
}
|
|
|
|
if resp.StatusCode >= http.StatusBadRequest {
|
|
return fmt.Errorf("releaser: github: Could not create release: response statuscode: %s", resp.Status)
|
|
}
|
|
|
|
g.release = release
|
|
return nil
|
|
|
|
}
|
|
|
|
// UploadAssets uploads specified assets
|
|
func (g GitHubReleaser) UploadAssets(assets []config.Asset) error {
|
|
for _, asset := range assets {
|
|
file, err := os.Open(asset.Name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, resp, err := g.client.Repositories.UploadReleaseAsset(g.context, g.config.Github.User, g.config.Github.URL, *g.release.ID, &github.UploadOptions{Name: asset.Name}, file)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if resp.StatusCode >= http.StatusBadRequest {
|
|
return fmt.Errorf("releaser: github: Could not create release: response statuscode: %s", resp.Status)
|
|
}
|
|
}
|
|
return nil
|
|
}
|