From c7d6c7cc7bc557c8911452e314d179dd28bd272c Mon Sep 17 00:00:00 2001 From: Sebastian Beisch Date: Wed, 24 Feb 2021 22:38:15 +0100 Subject: [PATCH] feat(integrations): add first simple npm integration Integrations are simple helpers to make integration with existing tools easier. At basic npm support, the integration will set the version before release to the `package.json` ```yml integrations: npm: enabled: true ``` --- .github/workflows/main.yml | 16 +++-- Makefile | 14 +++++ README.md | 37 ++++++++++- cmd/go-semantic-release/commands/changelog.go | 6 +- .../commands/integrations.go | 62 +++++++++++++++++++ go.mod | 15 +++-- go.sum | 39 ++++++++---- internal/integrations/integrations.go | 26 ++++++++ internal/integrations/npm.go | 28 +++++++++ internal/integrations/npm_test.go | 62 +++++++++++++++++++ pkg/config/config.go | 28 ++++++--- 11 files changed, 294 insertions(+), 39 deletions(-) create mode 100644 Makefile create mode 100644 cmd/go-semantic-release/commands/integrations.go create mode 100644 internal/integrations/integrations.go create mode 100644 internal/integrations/npm.go create mode 100644 internal/integrations/npm_test.go diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 911c01b..ec5fb61 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -8,7 +8,7 @@ jobs: build: strategy: matrix: - go: ["1.13", "1.14", "1.15"] + go: ["1.13", "1.14", "1.15", "1.16"] name: Build with go version ${{ matrix.go }} runs-on: ubuntu-latest steps: @@ -39,8 +39,12 @@ jobs: GOOS=windows GOARCH=386 CGO_ENABLED=0 go build -o build/go-semantic-release.windows_i386.exe -ldflags "-w -s -X main.version=`./build/go-semantic-release-temp next`" ./cmd/go-semantic-release/ GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -o build/go-semantic-release.windows_x86_64.exe -ldflags "-w -s -X main.version=`./build/go-semantic-release-temp next`" ./cmd/go-semantic-release/ GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 go build -o build/go-semantic-release.darwin_x86_64 -ldflags "-w -s -X main.version=`./build/go-semantic-release-temp next`" ./cmd/go-semantic-release/ - - name: Build Docker image - if: matrix.go == '1.15' && github.repository == 'Nightapes/go-semantic-release' + - name: Build Docker image PR + if: github.ref != 'refs/heads/master' + run: | + docker build -t nightapes/go-semantic-release:development-${{matrix.go}} . + - name: Build Docker image master + if: github.ref == 'refs/heads/master' run: | docker login -u nightapes -p ${{ secrets.DOCKER_PASSWORD }} docker login -u nightapes -p ${{ secrets.GITHUB_TOKEN }} docker.pkg.github.com @@ -65,7 +69,7 @@ jobs: name: build path: build - name: Release - if: github.repository == 'Nightapes/go-semantic-release' + if: github.ref == 'refs/heads/master' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | @@ -73,8 +77,8 @@ jobs: docker login -u nightapes -p ${{ secrets.DOCKER_PASSWORD }} docker login -u nightapes -p $GITHUB_TOKEN docker.pkg.github.com ./build/go-semantic-release-temp release --loglevel trace - - name: Release fork - if: github.repository != 'Nightapes/go-semantic-release' + - name: Release PR + if: github.ref != 'refs/heads/master' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..804c4a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ + + +all: build + +.PHONY: build + +build: + go build -o build/go-semantic-release-temp ./cmd/go-semantic-release/ + +lint: + golangci-lint run --print-issued-lines=false --fix ./... + +test: + go test --coverprofile coverage.out -v -race -parallel 20 ./... diff --git a/README.md b/README.md index 7990035..d95db60 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,9 @@ hooks: - name: echo $RELEASE_VERSION postRelease: - name: echo $RELEASE_VERSION +integrations: + npm: + enabled: true ``` #### CommitFormat @@ -156,7 +159,27 @@ assets: #### Hooks -Hooks will run when calling `release`. Hooks run only if a release will be triggered. +Hooks will run when calling `release`. Hooks run only if a release will be triggered. +You can define hooks which run before or after the release. The shell commands will run in order, you can access the current release version via +an environment variable `RELEASE_VERSION` + +```yml +hooks: + preRelease: + - name: echo $RELEASE_VERSION + postRelease: + - name: echo $RELEASE_VERSION +``` + +#### Integrations + +Integrations are simple helpers to make integration with existing tools easier. +At the moment npm is supported, the integration will set the version before release to the `package.json` +```yml +integrations: + npm: + enabled: true +``` #### Changelog @@ -231,6 +254,18 @@ changelog: repository: ## Your docker repository, which is used for docker run ``` +##### NPM + +You can print a help text for a npm package + +```yml +changelog: + npm: + name: ## Name of the npm package + repository: ## Your docker repository, which is used for docker run +``` + + ### Version `go-semantic-release` has two modes for calculating the version: automatic or manual. diff --git a/cmd/go-semantic-release/commands/changelog.go b/cmd/go-semantic-release/commands/changelog.go index 2b770bc..90a0227 100644 --- a/cmd/go-semantic-release/commands/changelog.go +++ b/cmd/go-semantic-release/commands/changelog.go @@ -62,10 +62,6 @@ var changelogCmd = &cobra.Command{ return err } - if err = s.WriteChangeLog(generatedChangelog.Content, file); err != nil { - log.Fatal(err) - } - - return nil + return s.WriteChangeLog(generatedChangelog.Content, file) }, } diff --git a/cmd/go-semantic-release/commands/integrations.go b/cmd/go-semantic-release/commands/integrations.go new file mode 100644 index 0000000..e06141b --- /dev/null +++ b/cmd/go-semantic-release/commands/integrations.go @@ -0,0 +1,62 @@ +package commands + +import ( + "github.com/Nightapes/go-semantic-release/internal/integrations" + "github.com/Nightapes/go-semantic-release/pkg/semanticrelease" + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func init() { + integrationsCmd.Flags().Bool("checks", false, "Check for missing values and envs") + integrationsCmd.Flags().StringP("out", "o", "CHANGELOG.md", "Name of the file") + rootCmd.AddCommand(integrationsCmd) +} + +var integrationsCmd = &cobra.Command{ + Use: "integrations", + Short: "Call integrations from config file manual", + RunE: func(cmd *cobra.Command, args []string) error { + config, err := cmd.Flags().GetString("config") + if err != nil { + return err + } + + repository, err := cmd.Flags().GetString("repository") + if err != nil { + return err + } + + force, err := cmd.Flags().GetBool("no-cache") + if err != nil { + return err + } + + configChecks, err := cmd.Flags().GetBool("checks") + if err != nil { + return err + } + + releaseConfig := readConfig(config) + + s, err := semanticrelease.New(releaseConfig, repository, configChecks) + if err != nil { + return err + } + + provider, err := s.GetCIProvider() + if err != nil { + return err + } + + releaseVersion, err := s.GetNextVersion(provider, force) + if err != nil { + return err + } + log.Debugf("Found %d commits till last release", len(releaseVersion.Commits)) + + i := integrations.New(&releaseConfig.Integrations, releaseVersion) + + return i.Run() + }, +} diff --git a/go.mod b/go.mod index 932db98..3865bd2 100644 --- a/go.mod +++ b/go.mod @@ -11,15 +11,18 @@ require ( github.com/google/go-github/v25 v25.1.3 github.com/imdario/mergo v0.3.11 // indirect github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect + github.com/magefile/mage v1.11.0 // indirect github.com/pkg/errors v0.9.1 - github.com/sirupsen/logrus v1.7.0 - github.com/spf13/cobra v1.1.1 + github.com/sirupsen/logrus v1.8.0 + github.com/spf13/cobra v1.1.3 github.com/stretchr/testify v1.7.0 + github.com/tidwall/pretty v1.1.0 // indirect + github.com/tidwall/sjson v1.1.5 github.com/xanzy/ssh-agent v0.3.0 // indirect - golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect - golang.org/x/net v0.0.0-20210119194325-5f4716e94777 // indirect - golang.org/x/oauth2 v0.0.0-20210113205817-d3ed898aa8a3 - golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 // indirect + golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 // indirect + golang.org/x/net v0.0.0-20210224082022-3d97a244fca7 // indirect + golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93 + golang.org/x/sys v0.0.0-20210223212115-eede4237b368 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect diff --git a/go.sum b/go.sum index e7e5e0f..de0fd95 100644 --- a/go.sum +++ b/go.sum @@ -218,6 +218,10 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/magefile/mage v1.10.0 h1:3HiXzCUY12kh9bIuyXShaVe529fJfyqoVM42o/uom2g= +github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magefile/mage v1.11.0 h1:C/55Ywp9BpgVVclD3lRnSYCwXTYxmSppIgLeDYlNuls= +github.com/magefile/mage v1.11.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -267,16 +271,16 @@ github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNX github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.0 h1:nfhvjKcUMhBMVqbKHJlk5RPrrfYr/NMo3692g0dwfWU= +github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -291,6 +295,16 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tidwall/gjson v1.6.8 h1:CTmXMClGYPAmln7652e69B7OLXfTi5ABcPPwjIWUv7w= +github.com/tidwall/gjson v1.6.8/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= +github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE= +github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.0.2 h1:Z7S3cePv9Jwm1KwS0513MRaoUe3S01WPbLNV40pwWZU= +github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.1.0 h1:K3hMW5epkdAVwibsQEfR/7Zj0Qgt4DxtNumTq/VloO8= +github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/sjson v1.1.5 h1:wsUceI/XDyZk3J1FUvuuYlK62zJv2HO2Pzb8A5EWdUE= +github.com/tidwall/sjson v1.1.5/go.mod h1:VuJzsZnTowhSxWdOgsAnb886i4AjEyTkk7tNtsL7EYE= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= @@ -318,8 +332,8 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -380,16 +394,16 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7 h1:OgUuv8lsRpBibGNbSizVwKWlysjaNzmC9gYMhPVfqFM= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210113205817-d3ed898aa8a3 h1:BaN3BAqnopnKjvl+15DYP6LLrbBHfbfmlFYzmFj/Q9Q= -golang.org/x/oauth2 v0.0.0-20210113205817-d3ed898aa8a3/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93 h1:alLDrZkL34Y2bnGHfvC1CYBRBXCXgx8AC2vY4MRtYX4= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -432,8 +446,8 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210223212115-eede4237b368 h1:fDE3p0qf2V1co1vfj3/o87Ps8Hq6QTGNxJ5Xe7xSp80= +golang.org/x/sys v0.0.0-20210223212115-eede4237b368/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -590,7 +604,6 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= diff --git a/internal/integrations/integrations.go b/internal/integrations/integrations.go new file mode 100644 index 0000000..6d5d20d --- /dev/null +++ b/internal/integrations/integrations.go @@ -0,0 +1,26 @@ +package integrations + +import ( + "github.com/Nightapes/go-semantic-release/internal/shared" + "github.com/Nightapes/go-semantic-release/pkg/config" +) + +// Integrations struct +type Integrations struct { + version *shared.ReleaseVersion + config *config.Integrations +} + +func New(config *config.Integrations, version *shared.ReleaseVersion) *Integrations { + return &Integrations{ + config: config, + version: version, + } +} + +func (i Integrations) Run() error { + if i.config.NPM.Enabled { + return i.updateNPM() + } + return nil +} diff --git a/internal/integrations/npm.go b/internal/integrations/npm.go new file mode 100644 index 0000000..8700600 --- /dev/null +++ b/internal/integrations/npm.go @@ -0,0 +1,28 @@ +package integrations + +import ( + log "github.com/sirupsen/logrus" + "github.com/tidwall/sjson" + "io/ioutil" +) + +func (i *Integrations) updateNPM() error { + + npmConfig := i.config.NPM + if npmConfig.Path == "" { + npmConfig.Path = "./package.json" + } + + log.Debugf("Set version %s to %s", i.version.Next.Version, npmConfig.Path) + data, err := ioutil.ReadFile(npmConfig.Path) + if err != nil { + return err + } + + newData, err := sjson.Set(string(data), "version", i.version.Next.Version) + if err != nil { + return err + } + + return ioutil.WriteFile(npmConfig.Path, []byte(newData), 0777) +} diff --git a/internal/integrations/npm_test.go b/internal/integrations/npm_test.go new file mode 100644 index 0000000..9e8f55a --- /dev/null +++ b/internal/integrations/npm_test.go @@ -0,0 +1,62 @@ +package integrations + +import ( + "github.com/Masterminds/semver" + "github.com/Nightapes/go-semantic-release/internal/shared" + "github.com/Nightapes/go-semantic-release/pkg/config" + "github.com/stretchr/testify/assert" + "io/ioutil" + "os" + "testing" +) + +func TestIntegrations_updateNPM(t *testing.T) { + file, err := ioutil.TempFile("", "package") + if err != nil { + t.Fatal(err) + } + defer os.Remove(file.Name()) + + err = ioutil.WriteFile(file.Name(), []byte(`{ +"name": "test", +"version": "0.0.0", +"license": "MIT", +"scripts": { + "ng": "ng", + "nx": "nx" + } +}`), 0777) + if err != nil { + t.Fatal(err) + } + + testVersion, err := semver.NewVersion("1.2.0") + if err != nil { + t.Fatal(err) + } + + i := New(&config.Integrations{NPM: config.IntegrationNPM{ + Enabled: true, + Path: file.Name(), + }}, &shared.ReleaseVersion{ + Next: shared.ReleaseVersionEntry{ + Version: testVersion, + }, + }) + + assert.NoError(t, i.updateNPM()) + updatedFile, err := ioutil.ReadFile(file.Name()) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, `{ +"name": "test", +"version": "1.2.0", +"license": "MIT", +"scripts": { + "ng": "ng", + "nx": "nx" + } +}`, string(updatedFile)) + +} diff --git a/pkg/config/config.go b/pkg/config/config.go index 3487f12..715b194 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -35,8 +35,8 @@ type ChangelogDocker struct { //ChangelogNPM type struct type ChangelogNPM struct { - YARN bool `yaml:"latest"` - Repository string `yaml:"repository"` + Repository string `yaml:"repository"` + PackageName string `yaml:"name"` } //Asset type struct @@ -66,11 +66,11 @@ type GitLabProvider struct { // GitProvider struct type GitProvider struct { - Email string `yaml:"email"` - Username string `yaml:"user"` - Auth string `yaml:"auth"` - SSH bool `yaml:"ssh"` - TagPrefix *string `yaml:"tagPrefix,omitempty"` + Email string `yaml:"email"` + Username string `yaml:"user"` + Auth string `yaml:"auth"` + SSH bool `yaml:"ssh"` + TagPrefix *string `yaml:"tagPrefix,omitempty"` } // Hooks struct @@ -84,11 +84,22 @@ type Checksum struct { Algorithm string `yaml:"algorithm"` } +// Checksum struct +type Integrations struct { + NPM IntegrationNPM `yaml:"npm"` +} + +// Checksum struct +type IntegrationNPM struct { + Enabled bool `yaml:"enabled"` + Path string `yaml:"path"` +} + // ReleaseConfig struct type ReleaseConfig struct { CommitFormat string `yaml:"commitFormat"` Branch map[string]string `yaml:"branch"` - Analyzer AnalyzerConfig `yaml:"analyzer"` + Analyzer AnalyzerConfig `yaml:"analyzer"` Changelog ChangelogConfig `yaml:"changelog,omitempty"` Release string `yaml:"release,omitempty"` GitHubProvider GitHubProvider `yaml:"github,omitempty"` @@ -97,6 +108,7 @@ type ReleaseConfig struct { Assets []Asset `yaml:"assets"` Checksum Checksum `yaml:"checksum,omitempty"` Hooks Hooks `yaml:"hooks"` + Integrations Integrations `yaml:"integrations"` ReleaseTitle string `yaml:"title"` IsPreRelease bool }