diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1da25a8..13ca557 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,18 +2,21 @@ name: ci on: push: - branches: [ master ] - pull_request: - branches: [ master ] + branches: [master] + paths-ignore: + - "**.md" + - "**/.gitignore" + - ".github/workflows/**" jobs: - golangci: + lint: name: Lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: golangci-lint + - name: Check out code + uses: actions/checkout@v2 + - name: Run golangci lint uses: golangci/golangci-lint-action@v2 with: version: latest @@ -22,15 +25,78 @@ jobs: name: Build runs-on: ubuntu-latest steps: - - - name: Set up Go 1.x + - name: Check out code + uses: actions/checkout@v2 + - name: Set up Go uses: actions/setup-go@v2 with: go-version: ^1.16 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v2 - - name: Build run: make build + + tag: + name: Tag + runs-on: ubuntu-latest + needs: [lint, build] + steps: + - name: Check out code + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Set GitHub Actions as commit author + shell: bash + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + + - name: Setup sv4git + run: | + curl -s https://api.github.com/repos/bvieira/sv4git/releases/latest | jq -r '.assets[] | select(.browser_download_url | contains("linux")) | .browser_download_url' | wget -O /tmp/sv4git.tar.gz -qi - \ + && tar -C /usr/local/bin -xzf /tmp/sv4git.tar.gz + + - name: Create tag + id: create-tag + run: | + git sv tag + VERSION=$(git sv cv) + echo "::set-output name=tag::v$VERSION" + outputs: + tag: ${{ steps.create-tag.outputs.tag }} + + release: + name: Release + runs-on: ubuntu-latest + needs: [tag] + steps: + - name: Check out code + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Setup sv4git + run: | + curl -s https://api.github.com/repos/bvieira/sv4git/releases/latest | jq -r '.assets[] | select(.browser_download_url | contains("linux")) | .browser_download_url' | wget -O /tmp/sv4git.tar.gz -qi - \ + && tar -C /usr/local/bin -xzf /tmp/sv4git.tar.gz + + - name: Set up Go + id: go + uses: actions/setup-go@v2 + with: + go-version: ^1.16 + + - name: Create release notes + run: | + git sv rn -t "${{ needs.tag.outputs.tag }}" > release-notes.md + + - name: Build releases + run: make release-all + + - name: Release + uses: softprops/action-gh-release@v1 + with: + body_path: release-notes.md + tag_name: ${{ needs.tag.outputs.tag }} + fail_on_unmatched_files: true + files: | + bin/git-sv_* diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 0000000..2921440 --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,35 @@ +name: pull_request + +on: + pull_request: + branches: [ master ] + paths-ignore: + - '**.md' + - '**/.gitignore' + +jobs: + + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v2 + - name: Run golangci lint + uses: golangci/golangci-lint-action@v2 + with: + version: latest + + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v2 + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: ^1.16 + id: go + - name: Build + run: make build diff --git a/.gitignore b/.gitignore index b3eda77..9e67889 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ bin/ *.out *.sample +todo # Additional generated artifacts artifacts/ diff --git a/cmd/git-sv/handlers.go b/cmd/git-sv/handlers.go index 36de37a..d37cfb5 100644 --- a/cmd/git-sv/handlers.go +++ b/cmd/git-sv/handlers.go @@ -263,9 +263,9 @@ func tagHandler(git sv.Git, semverProcessor sv.SemVerCommitsProcessor) func(c *c } nextVer, _ := semverProcessor.NextVersion(currentVer, commits) - fmt.Printf("%d.%d.%d\n", nextVer.Major(), nextVer.Minor(), nextVer.Patch()) - - if err := git.Tag(nextVer); err != nil { + tagname, err := git.Tag(nextVer) + fmt.Println(tagname) + if err != nil { return fmt.Errorf("error generating tag version: %s, message: %v", nextVer.String(), err) } return nil diff --git a/cmd/git-sv/main.go b/cmd/git-sv/main.go index 6b154f4..dc3e59f 100644 --- a/cmd/git-sv/main.go +++ b/cmd/git-sv/main.go @@ -140,7 +140,7 @@ func main() { } if apperr := app.Run(os.Args); apperr != nil { - log.Fatal("failed to run cli, error: ", apperr) + log.Fatal("ERROR: ", apperr) } } diff --git a/sv/git.go b/sv/git.go index 4290310..bab6d14 100644 --- a/sv/git.go +++ b/sv/git.go @@ -23,7 +23,7 @@ type Git interface { LastTag() string Log(lr LogRange) ([]GitCommitLog, error) Commit(header, body, footer string) error - Tag(version semver.Version) error + Tag(version semver.Version) (string, error) Tags() ([]GitTag, error) Branch() string IsDetached() (bool, error) @@ -123,17 +123,20 @@ func (g GitImpl) Commit(header, body, footer string) error { } // Tag create a git tag. -func (g GitImpl) Tag(version semver.Version) error { +func (g GitImpl) Tag(version semver.Version) (string, error) { tag := fmt.Sprintf(g.tagCfg.Pattern, version.Major(), version.Minor(), version.Patch()) tagMsg := fmt.Sprintf("Version %d.%d.%d", version.Major(), version.Minor(), version.Patch()) tagCommand := exec.Command("git", "tag", "-a", tag, "-m", tagMsg) - if err := tagCommand.Run(); err != nil { - return err + if out, err := tagCommand.CombinedOutput(); err != nil { + return tag, combinedOutputErr(err, out) } pushCommand := exec.Command("git", "push", "origin", tag) - return pushCommand.Run() + if out, err := pushCommand.CombinedOutput(); err != nil { + return tag, combinedOutputErr(err, out) + } + return tag, nil } // Tags list repository tags.