diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000..17aaceb287 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,51 @@ +name: goreleaser + +on: + push: + tags: + - 'v*.*.*' + +permissions: + contents: write + id-token: write + packages: write + attestations: write +jobs: + goreleaser: + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - + name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: stable + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - + name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - + name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - + name: Run GoReleaser + uses: goreleaser/goreleaser-action@v7 + with: + distribution: goreleaser + version: '~> v2' + args: release --clean + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000000..ab966d00aa --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,136 @@ +# yaml-language-server: $schema=https://goreleaser.com/static/schema.json +# vim: set ts=2 sw=2 tw=0 fo=cnqoj + +version: 2 + +before: + hooks: + - go mod tidy + +builds: + - main: ./cmd/micro + id: micro + binary: micro + env: + - CGO_ENABLED=0 + - >- + {{- if eq .Os "darwin" }} + {{- if eq .Arch "amd64"}}CC=o64-clang{{- end }} + {{- if eq .Arch "arm64"}}CC=aarch64-apple-darwin20.2-clang{{- end }} + {{- end }} + {{- if eq .Os "windows" }} + {{- if eq .Arch "amd64" }}CC=x86_64-w64-mingw32-gcc{{- end }} + {{- end }} + goos: + - linux + - windows + - darwin + goarch: + - amd64 + - arm + - arm64 + goarm: + - 7 + ignore: + - goos: windows + goarch: arm + + - main: ./cmd/protoc-gen-micro + id: protoc-gen-micro + binary: protoc-gen-micro + env: + - CGO_ENABLED=0 + - >- + {{- if eq .Os "darwin" }} + {{- if eq .Arch "amd64"}}CC=o64-clang{{- end }} + {{- if eq .Arch "arm64"}}CC=aarch64-apple-darwin20.2-clang{{- end }} + {{- end }} + {{- if eq .Os "windows" }} + {{- if eq .Arch "amd64" }}CC=x86_64-w64-mingw32-gcc{{- end }} + {{- end }} + goos: + - linux + - windows + - darwin + goarch: + - amd64 + - arm + - arm64 + goarm: + - 7 + ignore: + - goos: windows + goarch: arm + +archives: + - id: micro + ids: + - micro + formats: [tar.gz] + name_template: >- + {{ .Binary }}_ + {{- .Os }}_ + {{- .Arch }} + {{- if .Arm }}v{{ .Arm }}{{ end }} + files: + - none* + format_overrides: + - goos: windows + formats: [zip] + + - id: protoc-gen-micro + ids: + - protoc-gen-micro + formats: [tar.gz] + name_template: >- + {{ .Binary }}_ + {{- .Os }}_ + {{- .Arch }} + {{- if .Arm }}v{{ .Arm }}{{ end }} + files: + - none* + format_overrides: + - goos: windows + formats: [zip] + +report_sizes: true + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" + +dockers_v2: + - + ids: + - micro + - protoc-gen-micro + images: + - "micro/micro" + - "ghcr.io/go-micro/micro" + tags: + - "v{{ .Version }}" + - "{{ if .IsNightly }}nightly{{ end }}" + - "{{ if not .IsNightly }}latest{{ end }}" + labels: + "io.artifacthub.package.readme-url": "https://raw.githubusercontent.com/micro/go-micro/refs/heads/master/README.md" + "io.artifacthub.package.logo-url": "https://www.gravatar.com/avatar/09d1da3ea9ee61753219a19016d6a672?s=120&r=g&d=404" + "org.opencontainers.image.description": "A Go Platform built for Developers" + "org.opencontainers.image.created": "{{.Date}}" + "org.opencontainers.image.title": "{{.ProjectName}}" + "org.opencontainers.image.revision": "{{.FullCommit}}" + "org.opencontainers.image.version": "{{.Version}}" + "org.opencontainers.image.source": "{{.GitURL}}" + "org.opencontainers.image.url": "{{.GitURL}}" + "org.opencontainers.image.licenses": "MIT" + + platforms: + - linux/amd64 + - linux/arm64 + + retry: + attempts: 5 + delay: 5s + max_delay: 2m diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..a2576e4faf --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +FROM alpine:latest +ARG TARGETPLATFORM +ENV USER=micro +ENV GROUPNAME=$USER +ARG UID=1001 +ARG GID=1001 +RUN addgroup --gid "$GID" "$GROUPNAME" \ + && adduser \ + --disabled-password \ + --gecos "" \ + --home "/micro" \ + --ingroup "$GROUPNAME" \ + --no-create-home \ + --uid "$UID" "$USER" + +ENV PATH=/usr/local/go/bin:$PATH +RUN apk --no-cache add git make curl +COPY --from=golang:1.26.0-alpine /usr/local/go /usr/local/go + +COPY $TARGETPLATFORM/micro /usr/local/go/bin/ +COPY $TARGETPLATFORM/protoc-gen-micro /usr/local/go/bin/ + +WORKDIR /micro +EXPOSE 8080 +ENTRYPOINT ["/usr/local/go/bin/micro"] +CMD ["server"] diff --git a/Makefile b/Makefile index 4f444703a7..fa5b4a338d 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,14 @@ -.PHONY: test test-race test-coverage lint fmt install-tools proto clean help +NAME = micro +GIT_COMMIT = $(shell git rev-parse --short HEAD) +GIT_TAG = $(shell git describe --abbrev=0 --tags --always --match "v*") +GIT_IMPORT = go-micro.dev/v5/cmd/micro +BUILD_DATE = $(shell date +%s) +LDFLAGS = -X $(GIT_IMPORT).BuildDate=$(BUILD_DATE) -X $(GIT_IMPORT).GitCommit=$(GIT_COMMIT) -X $(GIT_IMPORT).GitTag=$(GIT_TAG) + +# GORELEASER_DOCKER_IMAGE = ghcr.io/goreleaser/goreleaser-cross:v1.25.7 +GORELEASER_DOCKER_IMAGE = ghcr.io/goreleaser/goreleaser:latest + +.PHONY: test test-race test-coverage lint fmt install-tools proto clean help gorelease-dry-run gorelease-dry-run-docker # Default target help: @@ -13,6 +23,9 @@ help: @echo " make proto - Generate protobuf code" @echo " make clean - Clean build artifacts" +$(NAME): + CGO_ENABLED=0 go build -ldflags "-s -w ${LDFLAGS}" -o $(NAME) cmd/micro/main.go + # Run tests test: go test -v ./... @@ -56,3 +69,14 @@ clean: find . -name "*.test" -type f -delete go clean -cache -testcache +# Try binary release +gorelease-dry-run: + docker run \ + --rm \ + -e CGO_ENABLED=0 \ + -v $(CURDIR):/$(NAME) \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -w /$(NAME) \ + $(GORELEASER_DOCKER_IMAGE) \ + --clean --verbose --skip=publish,validate --snapshot + diff --git a/internal/website/install.sh b/internal/website/install.sh index a05240f8ec..512f0873ac 100755 --- a/internal/website/install.sh +++ b/internal/website/install.sh @@ -12,7 +12,7 @@ ARCH=$(uname -m) case $ARCH in x86_64|amd64) ARCH="amd64" ;; aarch64|arm64) ARCH="arm64" ;; - armv7l) ARCH="arm" ;; + armv7l) ARCH="armv7" ;; *) echo "Unsupported architecture: $ARCH"; exit 1 ;; esac @@ -35,25 +35,52 @@ echo "Installing micro ${VERSION} for ${OS}/${ARCH}..." # Download URL if [ "$VERSION" = "latest" ]; then - URL="https://github.com/micro/go-micro/releases/latest/download/micro-${OS}-${ARCH}" + URL="https://github.com/micro/go-micro/releases/latest/download/micro_${OS}_${ARCH}.tar.gz" else - URL="https://github.com/micro/go-micro/releases/download/${VERSION}/micro-${OS}-${ARCH}" + URL="https://github.com/micro/go-micro/releases/download/${VERSION}/micro_${OS}_${ARCH}.tar.gz" fi +# Create temp directory for extraction +TMP_DIR=$(mktemp -d) +TMP_FILE="${TMP_DIR}/micro.tar.gz" + # Download -TMP_FILE=$(mktemp) if command -v curl &> /dev/null; then curl -fsSL "$URL" -o "$TMP_FILE" elif command -v wget &> /dev/null; then wget -q "$URL" -O "$TMP_FILE" else echo "Error: curl or wget required" + rm -rf "$TMP_DIR" exit 1 fi -# Install -chmod +x "$TMP_FILE" -mv "$TMP_FILE" "$INSTALL_DIR/micro" +# Extract and install +tar -xzf "$TMP_FILE" -C "$TMP_DIR" + +# Handle different archive structures (binary at root or in subdirectory) +if [ -f "${TMP_DIR}/micro" ]; then + BINARY_PATH="${TMP_DIR}/micro" +elif [ -f "${TMP_DIR}/micro_${OS}_${ARCH}/micro" ]; then + BINARY_PATH="${TMP_DIR}/micro_${OS}_${ARCH}/micro" +else + # Try to find any executable named 'micro' in the extracted content + BINARY_PATH=$(find "$TMP_DIR" -name "micro" -type f -executable | head -n1) +fi + +if [ -z "$BINARY_PATH" ] || [ ! -f "$BINARY_PATH" ]; then + echo "Error: Could not find micro binary in archive" + echo "Archive contents:" + tar -tzf "$TMP_FILE" + rm -rf "$TMP_DIR" + exit 1 +fi + +chmod +x "$BINARY_PATH" +mv "$BINARY_PATH" "$INSTALL_DIR/micro" + +# Cleanup +rm -rf "$TMP_DIR" echo "" echo "✓ Installed micro to $INSTALL_DIR/micro"