diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index f354527..48e6695 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -33,15 +33,21 @@ jobs: - name: Setting environment variables id: get_env run: | + DOWNLOAD_URL=$(curl -s https://api.github.com/repos/lukaszraczylo/semver-generator/releases/latest \ + | grep browser_download_url \ + | grep semver-gen-linux-amd64 \ + | cut -d '"' -f 4) + curl -s -L -o semver-gen "$DOWNLOAD_URL" && chmod +x semver-gen TMP_SANITISED_REPOSITORY_NAME=$(echo ${{ github.event.repository.name }} | sed -e 's|\.|-|g') TMP_GITHUB_COMMITS_COUNT=$(git rev-list --count HEAD) TMP_GITHUB_COUNT_NUMBER=$(echo ${GITHUB_RUN_NUMBER}) + TMP_RELEASE_VERSION=$(./semver-gen generate -l -c config-release.yaml | sed -e 's|SEMVER ||g') echo "::set-output name=SANITISED_REPOSITORY_NAME::$TMP_SANITISED_REPOSITORY_NAME" echo "::set-output name=DOCKER_IMAGE::ghcr.io/${{ github.repository_owner }}/$TMP_SANITISED_REPOSITORY_NAME" echo "::set-output name=GITHUB_COMMIT_NUMBER::$TMP_GITHUB_COMMITS_COUNT" echo "::set-output name=GITHUB_SHA::$(echo ${GITHUB_SHA::8})" echo "::set-output name=GITHUB_RUN_ID::$TMP_GITHUB_COUNT_NUMBER" - echo "::set-output name=RELEASE_VERSION::1.$TMP_GITHUB_COMMITS_COUNT.$TMP_GITHUB_COUNT_NUMBER" + echo "::set-output name=RELEASE_VERSION::$TMP_RELEASE_VERSION" test: needs: [ prepare ] @@ -53,9 +59,6 @@ jobs: steps: - name: Checkout repo uses: actions/checkout@v2 - - name: Configure git for private modules - run: | - git config --global url."https://${{ secrets.GHCR_TOKEN }}:x-oauth-basic@github.com/${{ github.repository_owner }}".insteadOf "https://github.com/${{ github.repository_owner }}" - name: Lint Code Base if: env.ENABLE_CODE_LINT == true env: @@ -81,7 +84,6 @@ jobs: uses: actions/checkout@v2 - name: Configure git for private modules run: | - git config --global url."https://${{ secrets.GHCR_TOKEN }}:x-oauth-basic@github.com/${{ github.repository_owner }}".insteadOf "https://github.com/${{ github.repository_owner }}" make update - name: WriteGoList run: go list -json -m all > go.list @@ -149,26 +151,35 @@ jobs: image: "${{ needs.prepare.outputs.DOCKER_IMAGE }}:${{ needs.prepare.outputs.GITHUB_SHA }}" fail-build: true - release: - name: Create Release + build-binary: + needs: [ prepare, test, code_scans ] + name: Binary compilation and release runs-on: ubuntu-latest - needs: [ prepare, deploy ] steps: - name: Checkout code uses: actions/checkout@v2 with: fetch-depth: 0 + - name: Compile binary + uses: thatisuday/go-cross-build@v1 + with: + platforms: linux/amd64,darwin/amd64,windows/amd64,linux/arm64,darwin/amd64 + name: semver-gen + package: ./ + compress: false + dest: dist - name: Get list of the commits since last release run: | echo "$(git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"%h %s")" > .release_notes - name: Create Release id: create_release - uses: actions/create-release@main + uses: softprops/action-gh-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - tag_name: v${{ github.event.repository.name }}/${{ needs.prepare.outputs.RELEASE_VERSION }} - release_name: v${{ needs.prepare.outputs.RELEASE_VERSION }} + files: dist/semver-gen-* + tag_name: ${{ needs.prepare.outputs.RELEASE_VERSION }} + name: ${{ needs.prepare.outputs.RELEASE_VERSION }} body_path: .release_notes draft: false - prerelease: ${{ github.ref != 'refs/heads/master' && github.ref != 'refs/heads/main' }} \ No newline at end of file + prerelease: ${{ github.ref != 'refs/heads/master' && github.ref != 'refs/heads/main' }} diff --git a/Makefile b/Makefile index fce7efd..3836a48 100644 --- a/Makefile +++ b/Makefile @@ -7,4 +7,7 @@ run: build @./semver-gen test: - @go test ./... -v -race -cover \ No newline at end of file + @go test ./... -v -race -cover + +update: + @go get -u ./... \ No newline at end of file diff --git a/README.md b/README.md index d06a117..32bfcf0 100644 --- a/README.md +++ b/README.md @@ -18,18 +18,28 @@ Project created overnight, to prove that management of semantic versioning is NO ### Usage ```bash - bash$ ./semver-gen -g +bash$ ./semver-gen generate -r https://github.com/nextapps-de/winbox +SEMVER 9.0.10 +bash$ ./semver-gen generate -l SEMVER 5.1.1 ``` -Available flags: +** Local repository flag `-l` will always take precedence over remote repository URL ** ```yaml +Usage: + semver-gen generate [flags] + semver-gen [command] + +Available Commands: + generate Generates semantic version + help Help about any command + Flags: -c, --config string Path to config file (default "config.yaml") - -g, --generate Generate semantic version - -h, --help help for this command - -r, --repository string Repository URL. If not specified local dir will be used. (default "https://github.com/lukaszraczylo/simple-gql-client") + -h, --help help for semver-gen + -l, --local Use local repository + -r, --repository string Remote repository URL. (default "https://github.com/lukaszraczylo/simple-gql-client") ``` #### Calculations example diff --git a/action.yml b/action.yml new file mode 100644 index 0000000..873b58d --- /dev/null +++ b/action.yml @@ -0,0 +1,24 @@ +# action.yml +name: 'Semantic Version Generator' +description: 'Automagic semantic version generator' +inputs: + config-file: + description: 'Configuration file' + required: false + repository-url: + description: 'Repository URL' + required: false + default: 'https://github.com/lukaszraczylo/simple-gql-client' + repository-local: + description: 'Use already cloned repository' + required: false +outputs: + semantic-version: # id of output + description: 'Calculated semantic version' +runs: + using: 'docker' + image: 'Dockerfile' + args: + - ${{ inputs.config-file }} + - ${{ inputs.repository-url }} + - ${{ inputs.repository-local }} \ No newline at end of file diff --git a/cmd/generate.go b/cmd/generate.go new file mode 100644 index 0000000..d702503 --- /dev/null +++ b/cmd/generate.go @@ -0,0 +1,37 @@ +/* +Copyright © 2021 LUKASZ RACZYLO + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package cmd + +import ( + "github.com/spf13/cobra" +) + +// generateCmd represents the generate command +var generateCmd = &cobra.Command{ + Use: "generate [flags]", + Short: "Generates semantic version", + Long: `Semantic version generation using your configuration file and fuzzy matching of git commit messages. + Please refer to documentation on https://github.com/lukaszraczylo/semver-generator for more information.`, + Run: func(cmd *cobra.Command, args []string) { + repo.Generate = true + repo.setupCobra() + main() + }, +} + +func init() { + rootCmd.AddCommand(generateCmd) +} diff --git a/cmd/main.go b/cmd/main.go index 2c5f8dc..01cacef 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -64,6 +64,7 @@ type Setup struct { Force Force Generate bool LocalConfigFile string + UseLocal bool } type CommitDetails struct { @@ -90,18 +91,15 @@ func (s *Setup) CalculateSemver() SemVer { matchMajor := checkMatches(commitSlice, s.Wording.Major) if matchPatch { s.Semver.Patch++ - // fmt.Println("Patch version bumped:", commit.Message) } if matchMinor { s.Semver.Minor++ s.Semver.Patch = 1 - // fmt.Println("Minor version bumped:", commit.Message) } if matchMajor { s.Semver.Major++ s.Semver.Minor = 0 s.Semver.Patch = 1 - // fmt.Println("Major version bumped:", commit.Message) } } return s.Semver @@ -125,14 +123,27 @@ func (s *Setup) ListCommits() ([]CommitDetails, error) { } func (s *Setup) Prepare() error { - u, _ := url.Parse(s.RepositoryName) - s.RepositoryLocalPath = fmt.Sprintf("/tmp/foo/%s", u.Path) - os.RemoveAll(s.RepositoryLocalPath) - s.RepositoryHandler, err = git.PlainClone(s.RepositoryLocalPath, false, &git.CloneOptions{ - URL: s.RepositoryName, - }) - if err != nil { - fmt.Println("Unable to reach repository", err.Error()) + if !repo.UseLocal { + u, err := url.Parse(s.RepositoryName) + if err != nil { + fmt.Println("Unable to parse repository URL", err.Error()) + return err + } + s.RepositoryLocalPath = fmt.Sprintf("/tmp/foo/%s", u.Path) + os.RemoveAll(s.RepositoryLocalPath) + s.RepositoryHandler, err = git.PlainClone(s.RepositoryLocalPath, false, &git.CloneOptions{ + URL: s.RepositoryName, + }) + if err != nil { + fmt.Println("Unable to reach repository", err.Error()) + return err + } + } else { + s.RepositoryHandler, err = git.PlainOpen(s.RepositoryLocalPath) + if err != nil { + fmt.Println("Unable to reach repository", err.Error()) + return err + } } return err } @@ -165,10 +176,6 @@ func (s *Setup) getSemver() string { return fmt.Sprintf("%d.%d.%d", s.Semver.Major, s.Semver.Minor, s.Semver.Patch) } -func (s *Setup) parseFlags() { - -} - func main() { if repo.Generate { err := repo.ReadConfig(repo.LocalConfigFile) diff --git a/cmd/root.go b/cmd/root.go index efacf86..9d1394b 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -22,11 +22,9 @@ import ( "github.com/spf13/cobra" ) -var cfgFile string - // rootCmd represents the base command when called without any subcommands var rootCmd = &cobra.Command{ - Use: "semver-gen", + Use: "semver-gen generate [flags]", Short: "An effortless semantic version generator", Long: `semver-gen // Lukasz Raczylo, raczylo.com @@ -39,12 +37,32 @@ func Execute() { cobra.CheckErr(rootCmd.Execute()) } +func (r *Setup) setupCobra() { + r.RepositoryName, err = rootCmd.Flags().GetString("repository") + if err != nil { + panic(err) + } + r.LocalConfigFile, err = rootCmd.Flags().GetString("config") + if err != nil { + panic(err) + } + r.UseLocal = varUseLocal + if err != nil { + panic(err) + } +} + +var ( + varRepoName, varLocalCfg string + varUseLocal bool +) + func init() { repo = &Setup{} if !strings.HasSuffix(os.Args[0], ".test") { - rootCmd.PersistentFlags().StringVarP(&repo.RepositoryName, "repository", "r", "https://github.com/lukaszraczylo/simple-gql-client", "Repository URL. If not specified local dir will be used.") - rootCmd.PersistentFlags().StringVarP(&repo.LocalConfigFile, "config", "c", "config.yaml", "Path to config file") - rootCmd.PersistentFlags().BoolVarP(&repo.Generate, "generate", "g", true, "Generate semantic version") - main() + cobra.OnInitialize(repo.setupCobra) + rootCmd.PersistentFlags().StringVarP(&varRepoName, "repository", "r", "https://github.com/lukaszraczylo/simple-gql-client", "Remote repository URL.") + rootCmd.PersistentFlags().StringVarP(&varLocalCfg, "config", "c", "config.yaml", "Path to config file") + rootCmd.PersistentFlags().BoolVarP(&varUseLocal, "local", "l", false, "Use local repository") } } diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..7ac1392 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,5 @@ +#!/bin/sh -l + +echo "Hello $1" + +echo "::set-output name=semver::$time" \ No newline at end of file