feat(changelog): add docker usage to changelog

This commit is contained in:
Nightapes
2019-08-31 17:05:10 +02:00
parent 829f2925ab
commit 8643656339
11 changed files with 257 additions and 74 deletions

1
.gitignore vendored
View File

@@ -16,3 +16,4 @@ go-semantic-release
.vscode/settings.json .vscode/settings.json
CHANGELOG.md CHANGELOG.md
cover.html cover.html
build/

View File

@@ -1,21 +1,12 @@
commitFormat: angular
title: "go-semantic-release release"
branch:
master: beta
rc: rc
beta: beta
alpha: alpha
changelog:
printAll: false
template: ''
templatePath: ''
release: 'github' release: 'github'
github:
repo: "go-semantic-release"
user: "nightapes"
commitFormat: angular
branch:
master: release
assets: assets:
- name: ./build/go-semantic-release - name: ./build/go-semantic-release
compress: false compress: false
- name: ./build/go-semantic-release.exe - name: ./build/go-semantic-release.exe
compress: false compress: false
github:
repo: "go-semantic-release"
user: "nightapes"
customUrl: ""

180
README.md
View File

@@ -2,24 +2,178 @@
## Release Types ## Release Types
| Type | Git tag | Changelog | Release | Write access git | Api token | | Type | Implemendet | Git tag | Changelog | Release | Write access git | Api token |
|--- |:---: |:---: |:---: |:---: |:---: | | ---------- | :----------------: | :----------------: | :----------------: | :----------------: | :----------------: | :----------------: |
| `git` | :white_check_mark: | | | :white_check_mark:| | | `github` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | :white_check_mark: |
| `github` | :white_check_mark: | :white_check_mark: | :white_check_mark:| | :white_check_mark: | | `gitlab` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | :white_check_mark: |
| `gitlab` | :white_check_mark: | :white_check_mark: | :white_check_mark:| | :white_check_mark: | | `git` | Comming soon | :white_check_mark: | | | :white_check_mark: | |
| `bitbuckt` | Comming soon | :white_check_mark: | | | :white_check_mark: | |
## Supported CI Pipelines
* Github Actions
* Gitlab CI
* Travis CI
* Custom CI, set enviroment `CI=true`
## How to use
`go-semantic-release` config file
Create a file with the name `.release.yml` or anything else, but you need to set to every command `-c <your config file>`
### Example config
```yml
commitFormat: angular
branch:
master: release
release: 'github'
github:
repo: "go-semantic-release"
user: "nightapes"
assets:
- name: ./build/go-semantic-release
compress: false
- name: ./build/go-semantic-release.exe
compress: false
```
#### CommitFormat
Set the commit format, at the moment we support ony [angular](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit-message-format), more coming soon.
```yml
commitFormat: angular
```
#### Branch
You can define which kind of release should be created for different branches.
Supported release kinds:
* `release` -> `v1.0.0`
* `rc` -> `v1.0.0-rc.0`
* `beta` -> `v1.0.0-beta.0`
* `alpha` -> `v1.0.0-alpha.0`
Add a branch config to your config
```yml
branch:
<branch-name>: <kind>
```
#### Relase
At the moment we support releases to gitlab and github.
##### Github
```yml
release: 'github'
github:
user: "<user/group"
repo: "<repositroyname>"
## Optional, if your not using github.com
customURL: <https://your.github>
```
##### Gitlab
```yml
release: 'gitlab'
gitlab:
repo: "<repositroyname>" ## Example group/project
## Optional, if your not using gitlab.com
customURL: <https://your.gitlab>
```
#### Assets
You can upload assets to a release
Support for gitlab and github.
If you want, you can let the file be compressed before uploading
```yml
assets:
- name: ./build/go-semantic-release
compress: false
```
#### Changelog
```yml
changelog:
printAll: false ## Print all valid commits to changelog
```
##### Docker
You can print a help text for a docker image
```yml
changelog:
docker:
latest: false ## If you uploaded a latest image
repository: ## Your docker repository, which is used for docker run
```
### Version
`go-semantic-release` has two modes for calcualting the version: automatic or manual.
#### Automatic
Version will be calculated on the `next` or `release` command
#### Manual
If you don't want that `go-semantic-release` is calculating the version from the commits, you can set the version by hand with
following command:
```bash
./go-semantic-release set 1.1.1
```
### Print version
Print the next version, can be used to add version to your program
```bash
./go-semantic-release next
```
Example with go-lang
```bash
go build -ldflags "--X main.version=`./go-semantic-release next`"
```
### Create release
```bash
./go-semantic-release release
```
## Build ## Build from source
`go build ./cmd/go-semantic-release/` ```bash
go build ./cmd/go-semantic-release/
```
## Run ### Testing
Print the next version ```bash
go test ./...
```
`./go-semantic-release version next` ### Linting
Set a version ```
curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.16.0
`./go-semantic-release version set v1.1.1` golangci-lint run ./...
```

View File

@@ -1,2 +0,0 @@
go build ./cmd/main.go && ./main.exe version next --path /f/Repro/ambassador/
go build ./cmd/main.go && ./main.exe --loglevel debug version set v1.1.1 --path /f/Repro/ambassador/

View File

@@ -11,7 +11,7 @@ func init() {
var zipCmd = &cobra.Command{ var zipCmd = &cobra.Command{
Use: "zip", Use: "zip",
Short: "Zip configured artifact from release config", Short: "Zip configured artifact from release config (internal)",
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
config, err := cmd.Flags().GetString("config") config, err := cmd.Flags().GetString("config")
if err != nil { if err != nil {

View File

@@ -31,17 +31,34 @@ introduced by commit:
{{ end -}} {{ end -}}
{{ end -}} {{ end -}}
{{ end -}} {{ end -}}
{{ if .HasDocker}}
## Docker image
New docker image is released under {{$.Backtick}}{{.DockerRepository}}:{{.Version}}{{$.Backtick}}
### Usage
{{$.Backtick}}docker run {{.DockerRepository}}:{{.Version}}{{$.Backtick}}
{{ if .HasDockerLatest}}
or
{{$.Backtick}}docker run {{.DockerRepository}}:latest{{$.Backtick}}
{{ end -}}
{{ end -}}
` `
type changelogContent struct { type changelogContent struct {
Commits map[string][]shared.AnalyzedCommit Commits map[string][]shared.AnalyzedCommit
BreakingChanges []shared.AnalyzedCommit BreakingChanges []shared.AnalyzedCommit
Order []string Order []string
Version string Version string
Now time.Time Now time.Time
Backtick string Backtick string
HasURL bool HasURL bool
URL string URL string
HasDocker bool
HasDockerLatest bool
DockerRepository string
} }
//Changelog struct //Changelog struct
@@ -92,14 +109,17 @@ func (c *Changelog) GenerateChanglog(templateConfig shared.ChangelogTemplateConf
} }
changelogContent := changelogContent{ changelogContent := changelogContent{
Version: templateConfig.Version, Version: templateConfig.Version,
Commits: commitsPerScope, Commits: commitsPerScope,
Now: c.releaseTime, Now: c.releaseTime,
BreakingChanges: commitsBreakingChange, BreakingChanges: commitsBreakingChange,
Backtick: "`", Backtick: "`",
Order: order, Order: order,
HasURL: templateConfig.CommitURL != "", HasURL: templateConfig.CommitURL != "",
URL: templateConfig.CommitURL, URL: templateConfig.CommitURL,
HasDocker: c.config.Changelog.Docker.Repository != "",
HasDockerLatest: c.config.Changelog.Docker.Latest,
DockerRepository: c.config.Changelog.Docker.Repository,
} }
title, err := generateTemplate(defaultChangelogTitle, changelogContent) title, err := generateTemplate(defaultChangelogTitle, changelogContent)

View File

@@ -2,7 +2,6 @@ package gitlab
import ( import (
"bytes" "bytes"
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "io"
@@ -26,7 +25,6 @@ const GITLAB = "gitlab"
// Client type struct // Client type struct
type Client struct { type Client struct {
config *config.GitLabProvider config *config.GitLabProvider
context context.Context
client *http.Client client *http.Client
baseURL string baseURL string
apiURL string apiURL string
@@ -36,8 +34,12 @@ type Client struct {
} }
// New initialize a new gitlabRelease // New initialize a new gitlabRelease
func New(config *config.GitLabProvider, accessToken string) (*Client, error) { func New(config *config.GitLabProvider) (*Client, error) {
ctx := context.Background() accessToken, err := util.GetAccessToken(fmt.Sprintf("%s_ACCESS_TOKEN", strings.ToUpper(GITLAB)))
if err != nil {
return nil, err
}
tokenHeader := util.NewAddHeaderTransport(nil, "PRIVATE-TOKEN", accessToken) tokenHeader := util.NewAddHeaderTransport(nil, "PRIVATE-TOKEN", accessToken)
acceptHeader := util.NewAddHeaderTransport(tokenHeader, "Accept", "application/json") acceptHeader := util.NewAddHeaderTransport(tokenHeader, "Accept", "application/json")
httpClient := &http.Client{ httpClient := &http.Client{
@@ -65,7 +67,6 @@ func New(config *config.GitLabProvider, accessToken string) (*Client, error) {
return &Client{ return &Client{
token: accessToken, token: accessToken,
config: config, config: config,
context: ctx,
baseURL: config.CustomURL, baseURL: config.CustomURL,
apiURL: config.CustomURL + "/api/v4", apiURL: config.CustomURL + "/api/v4",
client: httpClient, client: httpClient,

View File

@@ -20,47 +20,55 @@ import (
) )
func TestGetCommitURL(t *testing.T) { func TestGetCommitURL(t *testing.T) {
os.Setenv("GITLAB_ACCESS_TOKEN", "XXX")
defer os.Unsetenv("GITLAB_ACCESS_TOKEN")
client, err := gitlab.New(&config.GitLabProvider{ client, err := gitlab.New(&config.GitLabProvider{
CustomURL: "https://localhost/", CustomURL: "https://localhost/",
Repo: "test/test", Repo: "test/test",
}, "aToken") })
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, "https://localhost/test/test/commit/{{hash}}", client.GetCommitURL()) assert.Equal(t, "https://localhost/test/test/commit/{{hash}}", client.GetCommitURL())
} }
func TestGetCompareURL(t *testing.T) { func TestGetCompareURL(t *testing.T) {
os.Setenv("GITLAB_ACCESS_TOKEN", "XXX")
defer os.Unsetenv("GITLAB_ACCESS_TOKEN")
client, err := gitlab.New(&config.GitLabProvider{ client, err := gitlab.New(&config.GitLabProvider{
CustomURL: "https://localhost/", CustomURL: "https://localhost/",
Repo: "test/test", Repo: "test/test",
}, "aToken") })
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, "https://localhost/test/test/compare/1.0.0...1.0.1", client.GetCompareURL("1.0.0", "1.0.1")) assert.Equal(t, "https://localhost/test/test/compare/1.0.0...1.0.1", client.GetCompareURL("1.0.0", "1.0.1"))
} }
func TestValidateConfig_EmptyRepro(t *testing.T) { func TestValidateConfig_EmptyRepro(t *testing.T) {
os.Setenv("GITLAB_ACCESS_TOKEN", "XXX")
defer os.Unsetenv("GITLAB_ACCESS_TOKEN")
_, err := gitlab.New(&config.GitLabProvider{ _, err := gitlab.New(&config.GitLabProvider{
CustomURL: "https://localhost/", CustomURL: "https://localhost/",
}, "aToken") })
assert.Error(t, err) assert.Error(t, err)
} }
func TestValidateConfig_DefaultURL(t *testing.T) { func TestValidateConfig_DefaultURL(t *testing.T) {
os.Setenv("GITLAB_ACCESS_TOKEN", "XXX")
defer os.Unsetenv("GITLAB_ACCESS_TOKEN")
config := &config.GitLabProvider{ config := &config.GitLabProvider{
Repo: "localhost/test", Repo: "localhost/test",
} }
_, err := gitlab.New(config, "aToken") _, err := gitlab.New(config)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, "https://gitlab.com", config.CustomURL) assert.Equal(t, "https://gitlab.com", config.CustomURL)
} }
func TestValidateConfig_CustomURL(t *testing.T) { func TestValidateConfig_CustomURL(t *testing.T) {
os.Setenv("GITLAB_ACCESS_TOKEN", "XXX")
defer os.Unsetenv("GITLAB_ACCESS_TOKEN")
config := &config.GitLabProvider{ config := &config.GitLabProvider{
Repo: "/localhost/test/", Repo: "/localhost/test/",
CustomURL: "https://localhost/", CustomURL: "https://localhost/",
} }
_, err := gitlab.New(config, "aToken") _, err := gitlab.New(config)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, "https://localhost", config.CustomURL) assert.Equal(t, "https://localhost", config.CustomURL)
assert.Equal(t, "localhost/test", config.Repo) assert.Equal(t, "localhost/test", config.Repo)
@@ -181,8 +189,9 @@ func TestCreateRelease(t *testing.T) {
if testObject.config.CustomURL == "" { if testObject.config.CustomURL == "" {
testObject.config.CustomURL = testServer.URL testObject.config.CustomURL = testServer.URL
} }
os.Setenv("GITLAB_ACCESS_TOKEN", "aToken")
client, err := gitlab.New(&testObject.config, "aToken") defer os.Unsetenv("GITLAB_ACCESS_TOKEN")
client, err := gitlab.New(&testObject.config)
assert.NoError(t, err) assert.NoError(t, err)
err = client.CreateRelease(testObject.releaseVersion, testObject.generatedChangelog) err = client.CreateRelease(testObject.releaseVersion, testObject.generatedChangelog)
@@ -307,8 +316,9 @@ func TestUploadAssets(t *testing.T) {
if testObject.config.CustomURL == "" { if testObject.config.CustomURL == "" {
testObject.config.CustomURL = testServer.URL testObject.config.CustomURL = testServer.URL
} }
os.Setenv("GITLAB_ACCESS_TOKEN", "aToken")
client, err := gitlab.New(&testObject.config, "aToken") defer os.Unsetenv("GITLAB_ACCESS_TOKEN")
client, err := gitlab.New(&testObject.config)
assert.NoError(t, err) assert.NoError(t, err)
client.Release = "1.0.0" client.Release = "1.0.0"

View File

@@ -2,11 +2,9 @@ package releaser
import ( import (
"fmt" "fmt"
"strings"
"github.com/Nightapes/go-semantic-release/internal/releaser/github" "github.com/Nightapes/go-semantic-release/internal/releaser/github"
"github.com/Nightapes/go-semantic-release/internal/releaser/gitlab" "github.com/Nightapes/go-semantic-release/internal/releaser/gitlab"
"github.com/Nightapes/go-semantic-release/internal/releaser/util"
"github.com/Nightapes/go-semantic-release/internal/shared" "github.com/Nightapes/go-semantic-release/internal/shared"
"github.com/Nightapes/go-semantic-release/pkg/config" "github.com/Nightapes/go-semantic-release/pkg/config"
@@ -42,11 +40,7 @@ func (r *Releasers) GetReleaser() (Releaser, error) {
return github.New(&r.config.GitHubProvider) return github.New(&r.config.GitHubProvider)
case gitlab.GITLAB: case gitlab.GITLAB:
log.Debugf("initialize new %s-provider", gitlab.GITLAB) log.Debugf("initialize new %s-provider", gitlab.GITLAB)
accessToken, err := util.GetAccessToken(fmt.Sprintf("%s_ACCESS_TOKEN", strings.ToUpper(gitlab.GITLAB))) return gitlab.New(&r.config.GitLabProvider)
if err != nil {
return nil, err
}
return gitlab.New(&r.config.GitLabProvider, accessToken)
} }
return nil, fmt.Errorf("could not initialize a releaser from this type: %s", r.config.Release) return nil, fmt.Errorf("could not initialize a releaser from this type: %s", r.config.Release)
} }

View File

@@ -10,9 +10,23 @@ import (
// ChangelogConfig struct // ChangelogConfig struct
type ChangelogConfig struct { type ChangelogConfig struct {
PrintAll bool `yaml:"printAll,omitempty"` PrintAll bool `yaml:"printAll,omitempty"`
Template string `yaml:"template,omitempty"` Template string `yaml:"template,omitempty"`
TemplatePath string `yaml:"templatePath,omitempty"` TemplatePath string `yaml:"templatePath,omitempty"`
Docker ChangelogDocker `yaml:"docker,omitempty"`
NPM ChangelogNPM `yaml:"npm,omitempty"`
}
//ChangelogDocker type struct
type ChangelogDocker struct {
Latest bool `yaml:"latest"`
Repository string `yaml:"repository"`
}
//ChangelogNPM type struct
type ChangelogNPM struct {
YARN bool `yaml:"latest"`
Repository string `yaml:"repository"`
} }
//Asset type struct //Asset type struct