tmp(releaser): add helper methods for releasers

This commit is contained in:
Felix Wiedmann
2019-05-28 22:12:45 +02:00
parent 29a97cbba4
commit 17f715beca
3 changed files with 164 additions and 40 deletions

View File

@@ -0,0 +1,82 @@
package releaser
import (
"encoding/json"
"fmt"
"github.com/Nightapes/go-semantic-release/pkg/config"
"io/ioutil"
"strings"
)
// GITHUB identifer for github interface
const GITHUB = "github"
const githubCreateRleasURL = "https://api.github.com/repos"
const githubUploadAssetURL = "https://uploads.github.com"
// GitHubReleaser type struct
type GitHubReleaser struct {
repositoryURL string
authToken string
assets []config.Asset
Version string `json:"tag_name"`
Branch string `json:"target_commitish"`
ReleaseName string `json:"name"`
ReleaseMessage string `json:"body"`
Draft bool `json:"draft,omitempty"`
Prerelease bool `json:"prerelease,omitempty"`
}
type gitHubCreateReleaseResponse struct {
ReleaseURL string `json:url`
AssetUploadURL string `json:upload_url`
}
// NewGitHubReleaser initialize a new GitHubRelease
func NewGitHubReleaser(c *config.ReleaseConfig) *GitHubReleaser {
return &GitHubReleaser{
repositoryURL: c.Github["url"],
authToken: c.Github["authToken"],
assets: c.Assets,
}
}
// CreateRelease creates release on remote
func (g *GitHubReleaser) CreateRelease(releaseName, releaseMessage, branch, version string) error {
g.ReleaseName = releaseName
g.ReleaseMessage = releaseMessage
g.Branch = branch
g.Version = version
repositoryURI := strings.TrimLeft(g.repositoryURL, "/")
jsonRelease, err := json.Marshal(g)
if err != nil {
return fmt.Errorf("releaser: github: could not marshal GitHubReleaser struct. Error: %s", err.Error())
}
tempDir, err := ioutil.TempDir(".", "tempZipAssets")
if err != nil {
return fmt.Errorf("releaser: github: Could not create a temp directory. Error: %s", err.Error())
}
assetList, err := prepareAssets(tempDir, g.assets)
if err != nil {
return err
}
response, err := makeReleaseRequest(githubCreateRleasURL+repositoryURI, g.authToken, jsonRelease)
if err != nil {
return err
}
releaseInfo := gitHubCreateReleaseResponse{}
if err := json.Unmarshal(response, &releaseInfo); err != nil {
return err
}
// tbd build new upload url
if err := uploadReleaseAssets(releaseInfo.AssetUploadURL, g.authToken, assetList); err != nil {
return err
}
return nil
}

View File

@@ -1,10 +1,12 @@
package releaser
import (
"archive/zip"
"bytes"
"fmt"
"github.com/Nightapes/go-semantic-release/internal/cache"
"github.com/Nightapes/go-semantic-release/internal/releaser/releasers"
"github.com/Nightapes/go-semantic-release/pkg/config"
"io/ioutil"
"net/http"
)
// Releasers struct type
@@ -27,10 +29,86 @@ func New(c *config.ReleaseConfig) *Releasers {
//GetReleaser returns an initialized releaser
func (r *Releasers) GetReleaser(releaserType string) (Releaser, error) {
switch releaserType {
case releasers.GITHUB:
return releasers.NewGitHubReleaser(r.config), nil
case GITHUB:
return NewGitHubReleaser(r.config), nil
}
return nil, fmt.Errorf("Could not initialize a releaser from this type: %s", releaserType)
}
// tbd. http helper function
func makeReleaseRequest(url, authToken string, jsonRelease []byte) ([]byte, error) {
request, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(jsonRelease))
request.Header.Set("Authorization", authToken)
request.Header.Set("content-type", "application/json")
client := http.Client{}
defer client.CloseIdleConnections()
response, err := client.Do(request)
if err != nil {
return []byte{}, err
}
bodyContent, _ := ioutil.ReadAll(response.Body)
if response.StatusCode >= http.StatusMultipleChoices {
return []byte{}, fmt.Errorf("Could not create new release. HTTP %d: %s", response.StatusCode, string(bodyContent))
}
return bodyContent, nil
}
func uploadReleaseAssets(url, authToken string, assets []string) error {
body := []byte{}
request, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(body))
request.Header.Set("Authorization", authToken)
client := http.Client{}
defer client.CloseIdleConnections()
response, err := client.Do(request)
if err != nil {
return err
}
bodyContent, _ := ioutil.ReadAll(response.Body)
if response.StatusCode >= http.StatusMultipleChoices {
return fmt.Errorf("Could not create new release. HTTP %d: %s", response.StatusCode, string(bodyContent))
}
return nil
}
func prepareAssets(tempDir string, asset []config.Asset) ([]string, error) {
buf := new(bytes.Buffer)
tempAssets := []string{}
for _, asset := range asset {
if asset.Compress {
fileContent, err := ioutil.ReadFile(asset.Name)
if err != nil {
return []string{}, err
}
w := zip.NewWriter(buf)
zip, err := w.Create(tempDir + asset.Name)
if err != nil {
return []string{}, err
}
_, err = zip.Write(fileContent)
if err != nil {
return []string{}, err
}
tempAssets = append(tempAssets, tempDir+asset.Name)
} else {
tempAssets = append(tempAssets, asset.Name)
}
}
return tempAssets, nil
}

View File

@@ -1,36 +0,0 @@
package releasers
import (
"github.com/Nightapes/go-semantic-release/pkg/config"
)
// GITHUB identifer for github interface
const GITHUB = "github"
// GitHubReleaser type struct
type GitHubReleaser struct {
RepositoryURL string
TagName string `json:"tag_name"`
TargetCommitish string `json:"target_commitish"`
ReleaseName string `json:"name"`
ReleaseMessage string `json:"body"`
Draft bool `json:"draft,omitempty"`
Prerelease bool `json:"prerelease,omitempty"`
// Assets
}
// CreateRelease creates release on remote
func (g *GitHubReleaser) CreateRelease(releaseName, releaseMessage string) error {
g.ReleaseName = releaseName
g.ReleaseMessage = releaseMessage
return nil
}
// NewGitHubReleaser initialize a new GitHubRelease
func NewGitHubReleaser(c *config.ReleaseConfig, branch, latestVersion string) *GitHubReleaser {
return &GitHubReleaser{
RepositoryURL: c.Github["url"],
TargetCommitish: branch,
TagName: latestVersion,
}
}