diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 144425b..3ed2004 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -5,30 +5,33 @@ on: branches: [main] pull_request: +env: + GO_VERSION: "1.24" + jobs: test: runs-on: ubuntu-latest + container: + image: golang:1.24-alpine3.21 defaults: run: shell: sh steps: - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: "1.24" - - uses: actions/cache@v4 with: - path: ~/.cache/go-build - key: go-build-${{ hashFiles('**/*.go', 'go.sum') }} - restore-keys: go-build- + path: | + /go/pkg/mod + /root/.cache/go-build + key: go-${{ hashFiles('go.sum') }} + restore-keys: go- - name: Install build tools run: apk add --no-cache gcc musl-dev - - name: Vet - run: go vet ./... + - name: Download modules + run: go mod download - name: Test run: CGO_ENABLED=1 go test -race -timeout 120s ./... @@ -45,3 +48,18 @@ jobs: - uses: golangci/golangci-lint-action@v7 with: version: v2.11.2 + + vulncheck: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-go@v5 + with: + go-version: "1.24" + + - name: Install govulncheck + run: go install golang.org/x/vuln/cmd/govulncheck@latest + + - name: Run govulncheck + run: govulncheck ./... diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..349556d --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,68 @@ +name: Release + +on: + push: + tags: + - "[0-9]*" + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-go@v5 + with: + go-version: "1.24" + + - uses: actions/cache@v4 + with: + path: | + ~/go/pkg/mod + ~/.cache/go-build + key: release-go-${{ hashFiles('go.sum') }} + restore-keys: release-go- + + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v7 + with: + distribution: goreleaser + version: "~> v2" + args: release --clean + env: + GORELEASER_FORCE_TOKEN: gitea + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + + docker: + runs-on: ubuntu-latest + needs: [release] + steps: + - uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + push: true + platforms: linux/amd64,linux/arm64 + tags: | + lerkolabs/uptop:${{ github.ref_name }} + lerkolabs/uptop:latest + build-args: | + VERSION=${{ github.ref_name }} + COMMIT=${{ github.sha }} + BUILD_DATE=${{ github.event.head_commit.timestamp }} diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml deleted file mode 100644 index 0ced3ab..0000000 --- a/.github/workflows/docker.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Publish Release - -on: - push: - tags: - - '[0-9]*' - -jobs: - push_to_registry: - name: Build and Push Docker Image - runs-on: ubuntu-latest - steps: - - name: Check out the repo - uses: actions/checkout@v4 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Extract metadata (tags, labels) - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ secrets.DOCKERHUB_USERNAME }}/uptop - tags: | - type=match,pattern=\d+\.\d+\.\d+ - type=raw,value=latest - - - name: Build and push - uses: docker/build-push-action@v5 - with: - context: . - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - build-args: | - VERSION=${{ github.ref_name }} - COMMIT=${{ github.sha }} - BUILD_DATE=${{ github.event.head_commit.timestamp }} diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..27fb7ed --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,42 @@ +version: 2 + +gitea_urls: + api: https://gitea.lerkolabs.com/api/v1 + download: https://gitea.lerkolabs.com + +release: + gitea: + owner: lerko + name: uptop + +builds: + - main: ./cmd/uptop/main.go + binary: uptop + env: + - CGO_ENABLED=1 + goos: + - linux + goarch: + - amd64 + ldflags: + - -s -w + - -X main.version={{ .Version }} + - -X main.commit={{ .Commit }} + - -X main.date={{ .Date }} + flags: + - -trimpath + +archives: + - formats: [tar.gz] + name_template: "{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}" + +checksum: + name_template: checksums.txt + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^chore:" + - "^style:" diff --git a/Dockerfile b/Dockerfile index 54671e9..48f7b9e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,13 +3,16 @@ FROM golang:1.24-alpine3.21 AS builder RUN apk add --no-cache gcc musl-dev WORKDIR /app COPY go.mod go.sum ./ -RUN go mod download +RUN --mount=type=cache,target=/go/pkg/mod \ + go mod download COPY . . ENV CGO_ENABLED=1 ARG VERSION=dev ARG COMMIT=none ARG BUILD_DATE=unknown -RUN go build -ldflags="-s -w -X main.version=${VERSION} -X main.commit=${COMMIT} -X main.date=${BUILD_DATE}" -o uptop ./cmd/uptop/main.go +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go build -trimpath -ldflags="-s -w -X main.version=${VERSION} -X main.commit=${COMMIT} -X main.date=${BUILD_DATE}" -o uptop ./cmd/uptop/main.go # --- Stage 2: Runner --- FROM alpine:3.21