From 089006da0237e3b30a8dbec5288f0ba6c60fe283 Mon Sep 17 00:00:00 2001 From: Jesse Peterson Date: Fri, 11 Aug 2023 10:19:47 -0700 Subject: [PATCH] revamp GH actions and Docker --- .github/workflows/go.yml | 33 ------------- .github/workflows/on-push-pr.yml | 81 ++++++++++++++++++++++++++++++++ .github/workflows/on-release.yml | 20 ++++++++ Dockerfile | 6 ++- Dockerfile.buildx | 21 +++++++++ Makefile | 9 ++-- 6 files changed, 130 insertions(+), 40 deletions(-) delete mode 100644 .github/workflows/go.yml create mode 100644 .github/workflows/on-push-pr.yml create mode 100644 .github/workflows/on-release.yml create mode 100644 Dockerfile.buildx diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml deleted file mode 100644 index 3da5e58..0000000 --- a/.github/workflows/go.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Go - -on: - push: - branches: [ main ] - pull_request: - types: [opened, reopened, synchronize] - -jobs: - build-test: - name: Build, test, and format - strategy: - matrix: - go-version: [1.18.x] - platform: [ubuntu-latest, macos-latest, windows-latest] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v3 - - - name: setup go - uses: actions/setup-go@v4 - with: - go-version: ${{ matrix.go-version }} - - - name: Build - run: go build -v ./... - - - name: Test - run: go test -v -race ./... - - - name: Format - if: matrix.platform == 'ubuntu-latest' - run: if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then exit 1; fi diff --git a/.github/workflows/on-push-pr.yml b/.github/workflows/on-push-pr.yml new file mode 100644 index 0000000..71e9eac --- /dev/null +++ b/.github/workflows/on-push-pr.yml @@ -0,0 +1,81 @@ +on: + push: + branches: [main] + tags: ["v*.*.*"] + pull_request: + types: [opened, reopened, synchronize] +jobs: + format-build-test: + strategy: + matrix: + go-version: ['1.19.x'] + platform: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.platform }} + steps: + - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3.2.0 + + - uses: actions/setup-go@6edd4406fa81c3da01a34fa6f6343087c207a568 # v3.5.0 + with: + go-version: ${{ matrix.go-version }} + + - if: matrix.platform == 'ubuntu-latest' + run: if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then exit 1; fi + + - run: go build -v ./... + + - run: make test + docker-build-push: + if: github.event_name != 'pull_request' + needs: format-build-test + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3.2.0 + + - uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2.2.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - uses: docker/setup-buildx-action@4c0219f9ac95b02789c1075625400b2acbff50b1 # v2.9.1 + + - uses: docker/metadata-action@818d4b7b91585d195f67373fd9cb0332e31a7175 # v4.6.0 + id: meta + with: + images: | + ghcr.io/${{ github.repository }} + tags: | + type=ref,event=branch + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + type=sha + + - uses: docker/build-push-action@2eb1c1961a95fc15694676618e422e8ba1d63825 # v4.1.1 + with: + context: . + push: true + file: Dockerfile.buildx + platforms: linux/amd64,linux/arm64,linux/arm + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + release-zips: + if: github.event_name != 'pull_request' + needs: format-build-test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3.2.0 + + - uses: actions/setup-go@6edd4406fa81c3da01a34fa6f6343087c207a568 # v3.5.0 + with: + go-version: '1.19' + + - run: CGO_ENABLED=0 make release + + - uses: actions/upload-artifact@v3 + with: + name: release-zips + path: "*.zip" diff --git a/.github/workflows/on-release.yml b/.github/workflows/on-release.yml new file mode 100644 index 0000000..cb7b141 --- /dev/null +++ b/.github/workflows/on-release.yml @@ -0,0 +1,20 @@ +on: + release: + types: [published] +jobs: + release-zips: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3.2.0 + + - uses: actions/setup-go@6edd4406fa81c3da01a34fa6f6343087c207a568 # v3.5.0 + with: + go-version: '1.19' + + - run: CGO_ENABLED=0 make release + + - run: gh release upload ${{ github.event.release.tag_name }} *.zip + env: + GH_TOKEN: ${{ github.token }} diff --git a/Dockerfile b/Dockerfile index 934427a..42a4f2a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,9 @@ FROM gcr.io/distroless/static -COPY kmfddm-linux-amd64 /kmfddm +ARG TARGETOS TARGETARCH + +COPY kmfddm-$TARGETOS-$TARGETARCH /usr/bin/kmfddm EXPOSE 9002 -ENTRYPOINT ["/kmfddm"] +ENTRYPOINT ["/usr/bin/kmfddm"] diff --git a/Dockerfile.buildx b/Dockerfile.buildx new file mode 100644 index 0000000..425a3c0 --- /dev/null +++ b/Dockerfile.buildx @@ -0,0 +1,21 @@ +FROM --platform=$BUILDPLATFORM golang:1.19 AS builder + +WORKDIR /go/app + +COPY . . + +ARG TARGETOS TARGETARCH + +RUN --mount=type=cache,target=/root/.cache/go-build \ + --mount=type=cache,target=/go/pkg \ + CGO_ENABLED=0 make kmfddm-$TARGETOS-$TARGETARCH + +FROM gcr.io/distroless/static + +ARG TARGETOS TARGETARCH + +COPY --from=builder /go/app/kmfddm-$TARGETOS-$TARGETARCH /usr/bin/kmfddm + +EXPOSE 8080 + +ENTRYPOINT ["/usr/bin/kmfddm"] diff --git a/Makefile b/Makefile index 823a370..7a9c1f1 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,8 @@ KMFDDM=\ kmfddm-darwin-arm64 \ kmfddm-darwin-amd64 \ kmfddm-linux-amd64 \ + kmfddm-linux-arm64 \ + kmfddm-linux-arm \ kmfddm-windows-amd64.exe SUPPLEMENTAL=\ @@ -34,12 +36,9 @@ kmfddm-%-$(VERSION).zip: kmfddm-%.exe $(SUPPLEMENTAL) rm -rf $(subst .zip,,$@) clean: - rm -f kmfddm-* kmfddm-*.zip + rm -f kmfddm-* -release: \ - kmfddm-darwin-amd64-$(VERSION).zip \ - kmfddm-darwin-arm64-$(VERSION).zip \ - kmfddm-linux-amd64-$(VERSION).zip +release: $(foreach bin,$(GAT),$(subst .exe,,$(bin))-$(VERSION).zip) test: go test -v -cover -race ./...