diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 041fd21..248db1f 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -1,64 +1,48 @@ -name: Docker +name: release on: push: - branches: ["main"] + tags: + - "v*" + workflow_dispatch: -env: - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} +permissions: + contents: write + packages: write jobs: - build: + goreleaser: runs-on: ubuntu-latest - permissions: - contents: read - packages: write - id-token: write - steps: - - name: Checkout repository + - name: Checkout uses: actions/checkout@v4 - - - name: Install cosign - if: github.event_name != 'pull_request' - uses: sigstore/cosign-installer@v3.5.0 with: - cosign-release: "v2.1.1" + fetch-depth: 0 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version-file: "go.mod" + cache: true + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - with: - platforms: linux/amd64,linux/arm64 - - name: Log into registry ${{ env.REGISTRY }} - if: github.event_name != 'pull_request' + - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} + registry: ghcr.io + username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Extract Docker metadata - id: meta - uses: docker/metadata-action@v5 + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v6 with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - - - name: Build and push Docker image - id: build-and-push - uses: docker/build-push-action@v5 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max - platforms: linux/amd64,linux/arm64 - - - name: Sign the published Docker image - if: ${{ github.event_name != 'pull_request' }} + distribution: goreleaser + version: latest + args: release --clean env: - DIGEST: ${{ steps.build-and-push.outputs.digest }} - run: echo "${TAGS}" | xargs -I {} cosign sign --yes {}@${DIGEST} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index c9aefaa..fb76900 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ .env *.mmdb .geoipupdate.lock -.idea/ \ No newline at end of file +.idea/ +dist/ diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..3d092fb --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,66 @@ +version: 2 + +before: + hooks: + - go mod tidy + +snapshot: + version_template: "{{ .Version }}" + +builds: + - env: + - CGO_ENABLED=0 + goos: + - linux + goarch: + - amd64 + - arm64 + ldflags: + - -s -w + flags: + - -trimpath + +archives: + - format: tar.gz + name_template: >- + {{ .ProjectName }}_ + {{- .Version }}_ + {{- .Os }}_ + {{- .Arch }} + +dockers: + - image_templates: + - "ghcr.io/skidoodle/{{ .ProjectName }}:{{ .Tag }}" + - "ghcr.io/skidoodle/{{ .ProjectName }}:latest" + + dockerfile: Dockerfile.release + use: buildx + goos: linux + goarch: amd64 + + build_flag_templates: + - "--label=org.opencontainers.image.created={{.Date}}" + - "--label=org.opencontainers.image.title={{.ProjectName}}" + - "--label=org.opencontainers.image.revision={{.FullCommit}}" + - "--label=org.opencontainers.image.version={{.Version}}" + + - image_templates: + - "ghcr.io/skidoodle/{{ .ProjectName }}:{{ .Tag }}-arm64" + + dockerfile: Dockerfile.release + use: buildx + goos: linux + goarch: arm64 + + build_flag_templates: + - "--label=org.opencontainers.image.created={{.Date}}" + - "--label=org.opencontainers.image.title={{.ProjectName}}" + - "--label=org.opencontainers.image.revision={{.FullCommit}}" + - "--label=org.opencontainers.image.version={{.Version}}" + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" diff --git a/Dockerfile.release b/Dockerfile.release new file mode 100644 index 0000000..0ec6374 --- /dev/null +++ b/Dockerfile.release @@ -0,0 +1,24 @@ +FROM alpine:latest AS sys-context + +RUN apk add --no-cache ca-certificates tzdata + +RUN echo "appuser:x:10001:10001:appuser:/:/sbin/nologin" > /etc/passwd_app \ + && echo "appuser:x:10001:appuser" > /etc/group_app + +RUN mkdir -p /app/data /app/uploads + +FROM scratch + +COPY --from=sys-context /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ +COPY --from=sys-context /usr/share/zoneinfo /usr/share/zoneinfo + +COPY --from=sys-context /etc/passwd_app /etc/passwd +COPY --from=sys-context /etc/group_app /etc/group + +COPY ipinfo /app/ipinfo + +WORKDIR /app +USER 10001 +EXPOSE 3000 + +ENTRYPOINT ["/app/ipinfo"]