diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..d583494 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,116 @@ +name: Release + +on: + push: + tags: + - 'v*.*.*' + +jobs: + build-and-release: + name: Build and Release + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: '1.25' + + - name: Get version from tag + id: get_version + run: | + echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT + echo "Version: ${GITHUB_REF#refs/tags/}" + + - name: Build binaries for multiple platforms + run: | + mkdir -p dist + + # Linux AMD64 + GOOS=linux GOARCH=amd64 go build -o dist/relspec-linux-amd64 -ldflags "-X main.version=${{ steps.get_version.outputs.VERSION }}" ./cmd/relspec + + # Linux ARM64 + GOOS=linux GOARCH=arm64 go build -o dist/relspec-linux-arm64 -ldflags "-X main.version=${{ steps.get_version.outputs.VERSION }}" ./cmd/relspec + + # macOS AMD64 + GOOS=darwin GOARCH=amd64 go build -o dist/relspec-darwin-amd64 -ldflags "-X main.version=${{ steps.get_version.outputs.VERSION }}" ./cmd/relspec + + # macOS ARM64 (Apple Silicon) + GOOS=darwin GOARCH=arm64 go build -o dist/relspec-darwin-arm64 -ldflags "-X main.version=${{ steps.get_version.outputs.VERSION }}" ./cmd/relspec + + # Windows AMD64 + GOOS=windows GOARCH=amd64 go build -o dist/relspec-windows-amd64.exe -ldflags "-X main.version=${{ steps.get_version.outputs.VERSION }}" ./cmd/relspec + + # Create checksums + cd dist + sha256sum * > checksums.txt + cd .. + + - name: Generate release notes + id: release_notes + run: | + # Get the previous tag + previous_tag=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "") + + if [ -z "$previous_tag" ]; then + # No previous tag, get all commits + commits=$(git log --pretty=format:"- %s (%h)" --no-merges) + else + # Get commits since the previous tag + commits=$(git log "${previous_tag}..HEAD" --pretty=format:"- %s (%h)" --no-merges) + fi + + # Create release notes + cat > release_notes.md << EOF + # Release ${{ steps.get_version.outputs.VERSION }} + + ## Changes + + ${commits} + + ## Installation + + Download the appropriate binary for your platform: + + - **Linux (AMD64)**: \`relspec-linux-amd64\` + - **Linux (ARM64)**: \`relspec-linux-arm64\` + - **macOS (Intel)**: \`relspec-darwin-amd64\` + - **macOS (Apple Silicon)**: \`relspec-darwin-arm64\` + - **Windows (AMD64)**: \`relspec-windows-amd64.exe\` + + Make the binary executable (Linux/macOS): + \`\`\`bash + chmod +x relspec-* + \`\`\` + + Verify the download with the provided checksums. + EOF + + - name: Create Release + uses: softprops/action-gh-release@v1 + with: + body_path: release_notes.md + files: | + dist/relspec-linux-amd64 + dist/relspec-linux-arm64 + dist/relspec-darwin-amd64 + dist/relspec-darwin-arm64 + dist/relspec-windows-amd64.exe + dist/checksums.txt + draft: false + prerelease: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Summary + run: | + echo "Release ${{ steps.get_version.outputs.VERSION }} created successfully!" + echo "Binaries built for:" + echo " - Linux (amd64, arm64)" + echo " - macOS (amd64, arm64)" + echo " - Windows (amd64)" diff --git a/Makefile b/Makefile index a1ddaf9..e797f7c 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: all build test test-unit test-integration lint coverage clean install help docker-up docker-down docker-test docker-test-integration +.PHONY: all build test test-unit test-integration lint coverage clean install help docker-up docker-down docker-test docker-test-integration release release-version # Binary name BINARY_NAME=relspec @@ -112,5 +112,55 @@ docker-test-integration: docker-up ## Start DB and run integration tests $(GOTEST) -v ./pkg/readers/pgsql/ -count=1 || (make docker-down && exit 1) @make docker-down +release: ## Create and push a new release tag (auto-increments patch version) + @echo "Creating new release..." + @latest_tag=$$(git describe --tags --abbrev=0 2>/dev/null || echo ""); \ + if [ -z "$$latest_tag" ]; then \ + version="v1.0.0"; \ + echo "No existing tags found. Creating first release: $$version"; \ + commit_logs=$$(git log --pretty=format:"- %s" --no-merges); \ + else \ + echo "Latest tag: $$latest_tag"; \ + version_number=$${latest_tag#v}; \ + IFS='.' read -r major minor patch <<< "$$version_number"; \ + patch=$$((patch + 1)); \ + version="v$$major.$$minor.$$patch"; \ + echo "Creating new release: $$version"; \ + commit_logs=$$(git log "$${latest_tag}..HEAD" --pretty=format:"- %s" --no-merges); \ + fi; \ + if [ -z "$$commit_logs" ]; then \ + tag_message="Release $$version"; \ + else \ + tag_message="Release $$version\n\n$$commit_logs"; \ + fi; \ + git tag -a "$$version" -m "$$tag_message"; \ + git push origin "$$version"; \ + echo "Tag $$version created and pushed to remote repository." + +release-version: ## Create and push a release with specific version (use: make release-version VERSION=v1.2.3) + @if [ -z "$(VERSION)" ]; then \ + echo "Error: VERSION is required. Usage: make release-version VERSION=v1.2.3"; \ + exit 1; \ + fi + @version="$(VERSION)"; \ + if ! echo "$$version" | grep -q "^v"; then \ + version="v$$version"; \ + fi; \ + echo "Creating release: $$version"; \ + latest_tag=$$(git describe --tags --abbrev=0 2>/dev/null || echo ""); \ + if [ -z "$$latest_tag" ]; then \ + commit_logs=$$(git log --pretty=format:"- %s" --no-merges); \ + else \ + commit_logs=$$(git log "$${latest_tag}..HEAD" --pretty=format:"- %s" --no-merges); \ + fi; \ + if [ -z "$$commit_logs" ]; then \ + tag_message="Release $$version"; \ + else \ + tag_message="Release $$version\n\n$$commit_logs"; \ + fi; \ + git tag -a "$$version" -m "$$tag_message"; \ + git push origin "$$version"; \ + echo "Tag $$version created and pushed to remote repository." + help: ## Display this help screen @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' diff --git a/make_release.sh b/make_release.sh deleted file mode 100644 index d1b42c5..0000000 --- a/make_release.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash - -# Ask if the user wants to make a release version -read -p "Do you want to make a release version? (y/n): " make_release - -if [[ $make_release =~ ^[Yy]$ ]]; then - # Get the latest tag from git - latest_tag=$(git describe --tags --abbrev=0 2>/dev/null) - - if [ -z "$latest_tag" ]; then - # No tags exist yet, start with v1.0.0 - suggested_version="v1.0.0" - echo "No existing tags found. Starting with $suggested_version" - else - echo "Latest tag: $latest_tag" - - # Remove 'v' prefix if present - version_number="${latest_tag#v}" - - # Split version into major.minor.patch - IFS='.' read -r major minor patch <<< "$version_number" - - # Increment patch version - patch=$((patch + 1)) - - # Construct new version - suggested_version="v${major}.${minor}.${patch}" - echo "Suggested next version: $suggested_version" - fi - - # Ask the user for the version number with the suggested version as default - read -p "Enter the version number (press Enter for $suggested_version): " version - - # Use suggested version if user pressed Enter without input - if [ -z "$version" ]; then - version="$suggested_version" - fi - - # Prepend 'v' to the version if it doesn't start with it - if ! [[ $version =~ ^v ]]; then - version="v$version" - fi - - # Get commit logs since the last tag - if [ -z "$latest_tag" ]; then - # No previous tag, get all commits - commit_logs=$(git log --pretty=format:"- %s" --no-merges) - else - # Get commits since the last tag - commit_logs=$(git log "${latest_tag}..HEAD" --pretty=format:"- %s" --no-merges) - fi - - # Create the tag message - if [ -z "$commit_logs" ]; then - tag_message="Release $version" - else - tag_message="Release $version - -${commit_logs}" - fi - - # Create an annotated tag with the commit logs - git tag -a "$version" -m "$tag_message" - - # Push the tag to the remote repository - git push origin "$version" - - echo "Tag $version created and pushed to the remote repository." -else - echo "No release version created." -fi