From 866ba43dd49c238c97831362cdab50630b0b9aa7 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Wed, 18 Dec 2024 09:25:08 -0500 Subject: [PATCH] chore: generate release notes for release (#3740) Signed-off-by: Mark Phelps <209477+markphelps@users.noreply.github.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 18 ++++++---- .goreleaser.yml | 27 +-------------- build/magefile.go | 4 +++ build/release/release.go | 64 +++++++++++++++++++++++++++++++++++ go.work.sum | 9 +++++ 5 files changed, 90 insertions(+), 32 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 048a5d9ec8..9b248d1f02 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -145,12 +145,23 @@ jobs: private_key: ${{ secrets.FLIPT_RELEASE_BOT_APP_PEM }} installation_id: ${{ secrets.FLIPT_RELEASE_BOT_INSTALLATION_ID }} + - name: Install Mage + uses: magefile/mage-action@v3 + with: + # mac build currently doesn't exist for v1.15.0 https://github.com/magefile/mage/issues/481 + version: v1.14.0 + install-only: true + + - name: Generate Release Notes + run: | + mage release:notes ${{ github.ref_name }} > release-notes.md + - name: GoReleaser uses: goreleaser/goreleaser-action@v6 with: distribution: goreleaser-pro version: "~> v2.3.0" - args: release --clean + args: release --clean --release-notes-tmpl release-notes.md env: GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }} GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} @@ -160,11 +171,6 @@ jobs: DISCORD_WEBHOOK_ID: ${{ secrets.DISCORD_WEBHOOK_ID }} DISCORD_WEBHOOK_TOKEN: ${{ secrets.DISCORD_WEBHOOK_TOKEN }} - - name: Install Mage - uses: magefile/mage-action@v3 - with: - install-only: true - # TODO: see if we can wire up the `release-tag-latest` workflow to run # after release with the same tag - name: Tag and Push latest diff --git a/.goreleaser.yml b/.goreleaser.yml index 6acdb3a6e5..46a5ccd35b 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -45,32 +45,7 @@ release: prerelease: auto # enable rc releases (e.g. v1.0.0-rc.1) target_commitish: "{{ .Commit }}" footer: | - ## Installation - - ### Homebrew :beer: - - ```bash - brew install flipt-io/brew/flipt - ``` - - ### Docker Images :whale: - - ```bash - docker pull docker.flipt.io/flipt/flipt:v{{ .Tag }} - ``` - - ```bash - docker pull ghcr.io/flipt-io/flipt:v{{ .Tag }} - ``` - - ## Thank you! - - We hope you :heart: this release! Feel free to open issues/discussions or reach out to us on Discord if you have any questions or feedback. - - - [Discord](https://flipt.io/discord) - - [Github Discussions](https://github.com/flipt-io/flipt/discussions) - - [Github Issues](https://github.com/flipt-io/flipt/issues) - - [Newsletter](https://www.flipt.io/#newsletter) + snapshot: version_template: "{{ .ShortCommit }}-snapshot" diff --git a/build/magefile.go b/build/magefile.go index 8ff9a22378..641990ff2c 100644 --- a/build/magefile.go +++ b/build/magefile.go @@ -31,3 +31,7 @@ func (r Release) Changelog(ctx context.Context, module, version string) error { func (r Release) Tag(ctx context.Context, module, version string) error { return release.Tag(ctx, module, version) } + +func (r Release) Notes(ctx context.Context, version string) error { + return release.GenerateReleaseNotes(version) +} diff --git a/build/release/release.go b/build/release/release.go index ef76e99c5e..b08fe0b472 100644 --- a/build/release/release.go +++ b/build/release/release.go @@ -7,6 +7,7 @@ import ( "os" "os/exec" "path" + "runtime" "strconv" "strings" "time" @@ -132,6 +133,69 @@ func Latest(module string, includePre bool) error { return nil } +func GenerateReleaseNotes(version string) error { + defer chdirRoot()() + + // check if sed is installed + _, err := exec.Command("which", "sed").CombinedOutput() + if err != nil { + return fmt.Errorf("sed is not installed") + } + + // if on macos use ghead instead of head + head := "head" + // get the os + os := runtime.GOOS + if os == "darwin" { + head = "ghead" + } + + // check if ghead is installed + _, err = exec.Command("which", head).CombinedOutput() + if err != nil { + return fmt.Errorf("%s is not installed", head) + } + + cmd := exec.Command("sh", "-c", fmt.Sprintf("sed -e '/^## \\[%s\\]/,/^## / ! d' ../CHANGELOG.md | %s --lines -2", version, head)) + out, err := cmd.CombinedOutput() + if err != nil { + return err + } + + tmpl := ` +%s +## Installation + +### Homebrew :beer: + +` + "```bash" + ` +brew install flipt-io/brew/flipt +` + "```" + ` + +### Docker Images :whale: + +` + "```bash" + ` +docker pull docker.flipt.io/flipt/flipt:v{{ .Tag }} +` + "```" + ` + +` + "```bash" + ` +docker pull ghcr.io/flipt-io/flipt:v{{ .Tag }} +` + "```" + ` + +## Thank you! + +We hope you :heart: this release! Feel free to open issues/discussions or reach out to us on Discord if you have any questions or feedback. + +- [Discord](https://flipt.io/discord) +- [Github Discussions](https://github.com/flipt-io/flipt/discussions) +- [Github Issues](https://github.com/flipt-io/flipt/issues) +- [Newsletter](https://www.flipt.io/#newsletter) +` + + fmt.Printf(tmpl, string(out)) + return nil +} + func UpdateChangelog(module, version string) error { defer chdirRoot()() diff --git a/go.work.sum b/go.work.sum index f19bd590c9..aa7df3aa80 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1844,6 +1844,7 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0/go.mod h1:ceUgdyfNv4h4g go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= @@ -1997,6 +1998,7 @@ golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= @@ -2017,6 +2019,7 @@ golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2097,6 +2100,7 @@ golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2113,6 +2117,7 @@ golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2261,6 +2266,7 @@ google.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go. google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo= google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:wp2WsuBYj6j8wUdo3ToZsdxxixbvQNAHqVJrTgi5E5M= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88= google.golang.org/genproto/googleapis/api v0.0.0-20241206012308-a4fef0638583/go.mod h1:jehYqy3+AhJU9ve55aNOaSml7wUXjF9x6z2LcCfpAhY= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240429193739-8cf5692501f6/go.mod h1:ULqtoQMxDLNRfW+pJbKA68wtIy1OiYjdIsJs3PMpzh8= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240730163845-b1a4ccb954bf/go.mod h1:5/MT647Cn/GGhwTpXC7QqcaR5Cnee4v4MKCU1/nwnIQ= @@ -2298,6 +2304,7 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20240930140551-af27646dc61f/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/genproto/googleapis/rpc v0.0.0-20241113202542-65e8d215514f/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/genproto/googleapis/rpc v0.0.0-20241206012308-a4fef0638583/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2331,6 +2338,8 @@ google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR google.golang.org/grpc v1.66.1/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=