From efd0320b0c393602d1de47d302b5980bb8ecf06b Mon Sep 17 00:00:00 2001 From: Mike Fridman Date: Mon, 3 Jul 2023 08:37:13 -0400 Subject: [PATCH] Update goreleaser --- .github/workflows/release.yml | 36 +++++++++++++++++++++++++ .gitignore | 3 +++ .goreleaser.yaml | 28 +++++++++++++++++++ .goreleaser.yml | 51 ----------------------------------- CHANGELOG.md | 2 +- cmd/goose/main.go | 17 ++++++------ scripts/release-notes.sh | 43 +++++++++++++++++++++++++++++ 7 files changed, 119 insertions(+), 61 deletions(-) create mode 100644 .github/workflows/release.yml create mode 100644 .goreleaser.yaml delete mode 100644 .goreleaser.yml create mode 100755 scripts/release-notes.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..b8bfa84e2 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,36 @@ +name: goreleaser + +on: + push: + tags: + - '*' + +permissions: + contents: write + +jobs: + goreleaser: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - run: git fetch --force --tags + - uses: actions/setup-go@v4 + with: + go-version: stable + # More assembly might be required: Docker logins, GPG, etc. It all depends + # on your needs. + # ${{ github.ref_name }} or $GITHUB_REF_NAME or ${{env.GITHUB_REF_NAME}} currently. + - run: ./scripts/release-notes.sh ${{github.ref_name}} > ./release_notes.txt + - uses: goreleaser/goreleaser-action@v4 + with: + # either 'goreleaser' (default) or 'goreleaser-pro': + distribution: goreleaser + version: latest + args: release --clean --release-notes=./release_notes.txt + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # Your GoReleaser Pro key, if you are using the 'goreleaser-pro' + # distribution: + # GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }} diff --git a/.gitignore b/.gitignore index 69d484b15..3690cfc63 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,6 @@ # Local testing .envrc *.FAIL + +dist/ +release_notes.txt diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 000000000..01b090f47 --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,28 @@ +# yaml-language-server: $schema=https://goreleaser.com/static/schema.json +# +# See https://goreleaser.com/customization/ for more information. +before: + hooks: + # You may remove this if you don't use go modules. + - go mod tidy +builds: + - env: + - CGO_ENABLED=0 + goos: + - linux + - windows + - darwin + goarch: + - amd64 + - arm64 + +archives: + - format: binary + name_template: >- + {{ .ProjectName }}_{{- tolower .Os }}_{{- if eq .Arch "amd64" }}x86_64{{- else }}{{ .Arch }}{{ end }} +checksum: + name_template: 'checksums.txt' +snapshot: + name_template: "{{ incpatch .Version }}-next" +changelog: + use: github-native diff --git a/.goreleaser.yml b/.goreleaser.yml deleted file mode 100644 index 0f2efdc6f..000000000 --- a/.goreleaser.yml +++ /dev/null @@ -1,51 +0,0 @@ -# Documentation at https://goreleaser.com -project_name: goose - -gomod: - proxy: true - -builds: - - env: - - CGO_ENABLED=0 - main: ./cmd/goose - binary: goose - goos: - - linux - - windows - - darwin - goarch: - - amd64 - - arm64 - # Custom ldflags templates. - # Default is `-s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}} -X main.builtBy=goreleaser`. - ldflags: - - -s -w - -# You can disable this pipe in order to not upload any artifacts. -# Defaults to false. -release: - disable: false - -archives: - - replacements: - 386: i386 - amd64: x86_64 - name_template: "{{ tolower .Binary }}_{{ tolower .Os }}_{{ tolower .Arch }}" - format: binary - -checksum: - name_template: "checksums.txt" - -snapshot: - name_template: "{{ incpatch .Version }}-next" - -changelog: - use: github - sort: asc - # Commit messages matching the regexp listed here will be removed from - # the changelog. - filters: - exclude: - - "^docs:" - - "^test:" -# TODO(mf): add docker support? diff --git a/CHANGELOG.md b/CHANGELOG.md index e37f3872e..c0542b4d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## [Unreleased] -- No changes yet. +- Add pre-built binaries with GoReleaser. ## [v3.13.0] - 2023-06-29 diff --git a/cmd/goose/main.go b/cmd/goose/main.go index 359299fab..fcd5f7373 100644 --- a/cmd/goose/main.go +++ b/cmd/goose/main.go @@ -8,7 +8,6 @@ import ( "log" "os" "path/filepath" - "runtime/debug" "sort" "strconv" "strings" @@ -27,7 +26,7 @@ var ( table = flags.String("table", "goose_db_version", "migrations table name") verbose = flags.Bool("v", false, "enable verbose mode") help = flags.Bool("h", false, "print help") - version = flags.Bool("version", false, "print version") + versionFlag = flags.Bool("version", false, "print version") certfile = flags.String("certfile", "", "file path to root CA's certificates in pem format (only support on mysql)") sequential = flags.Bool("s", false, "use sequential numbering for new migrations") allowMissing = flags.Bool("allow-missing", false, "applies missing (out-of-order) migrations") @@ -37,7 +36,11 @@ var ( noColor = flags.Bool("no-color", false, "disable color output (NO_COLOR env variable supported)") ) var ( - gooseVersion = "v3.14.0-dev" + // These variables are populated via GoReleaser ldflags. + // See https://goreleaser.com/cookbooks/using-main.version/ + version = "(devel)" + commit = "none" + date = "unknown" ) func main() { @@ -47,12 +50,8 @@ func main() { return } - if *version { - buildInfo, ok := debug.ReadBuildInfo() - if ok && buildInfo != nil && buildInfo.Main.Version != "(devel)" { - gooseVersion = buildInfo.Main.Version - } - fmt.Printf("goose version: %s\n", gooseVersion) + if *versionFlag { + fmt.Printf("goose version: %s\n", version) return } if *verbose { diff --git a/scripts/release-notes.sh b/scripts/release-notes.sh new file mode 100755 index 000000000..ec7fed6e6 --- /dev/null +++ b/scripts/release-notes.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +set -euo pipefail + +# Check if the required argument is provided +if [ $# -lt 1 ]; then + echo "Usage: $0 []" + exit 1 +fi + +version="$1" +changelog_file="${2:-CHANGELOG.md}" + +# Check if the CHANGELOG.md file exists +if [ ! -f "$changelog_file" ]; then + echo "Error: $changelog_file does not exist" + exit 1 +fi + +CAPTURE=0 +items="" +while IFS= read -r LINE; do + if [[ "${LINE}" == "##"* ]] && [[ "${CAPTURE}" -eq 1 ]]; then + break + fi + if [[ "${LINE}" == "## [${version}]"* ]] && [[ "${CAPTURE}" -eq 0 ]]; then + CAPTURE=1 + continue + fi + if [[ "${CAPTURE}" -eq 1 ]]; then + items+="$(echo "${LINE}" | xargs)" + # if items is not empty, add a newline + if [[ -n "$items" ]]; then + items+=$'\n' + fi + fi +done <"${changelog_file}" + +if [[ -n "$items" ]]; then + echo "${items%$'\n'}" +else + echo "No changelog items found for version $version" +fi