diff --git a/.github/workflows/go-cross.yml b/.github/workflows/go-cross.yml new file mode 100644 index 0000000..cd7a79b --- /dev/null +++ b/.github/workflows/go-cross.yml @@ -0,0 +1,45 @@ +name: Go Matrix +on: [push, pull_request] + +jobs: + + cross: + name: Go + runs-on: ${{ matrix.os }} + env: + CGO_ENABLED: 0 + + strategy: + matrix: + go-version: [ 1.14, 1.15, 1.x ] + os: [ubuntu-latest, macos-latest, windows-latest] + + steps: + # https://github.com/marketplace/actions/setup-go-environment + - name: Set up Go ${{ matrix.go-version }} + uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go-version }} + + # https://github.com/marketplace/actions/checkout + - name: Checkout code + uses: actions/checkout@v2 + + # https://github.com/marketplace/actions/cache + - name: Cache Go modules + uses: actions/cache@v2 + with: + path: | + ~/go/pkg/mod # Module download cache + ~/.cache/go-build # Build cache (Linux) + ~/Library/Caches/go-build # Build cache (Mac) + '%LocalAppData%\go-build' # Build cache (Windows) + key: ${{ runner.os }}-${{ matrix.go-version }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-${{ matrix.go-version }}-go- + + - name: Test + run: go test -v -cover ./... + + - name: Build + run: go build -v -ldflags "-s -w" -trimpath diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..9d8f798 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,81 @@ +name: Main + +on: + push: + branches: + - master + tags: + - v* + pull_request: + +jobs: + + main: + name: Main Process + runs-on: ubuntu-latest + env: + GO_VERSION: 1.15 + GOLANGCI_LINT_VERSION: v1.33.0 + SEIHON_VERSION: v0.5.1 + CGO_ENABLED: 0 + + steps: + + # https://github.com/marketplace/actions/setup-go-environment + - name: Set up Go ${{ env.GO_VERSION }} + uses: actions/setup-go@v2 + with: + go-version: ${{ env.GO_VERSION }} + + # https://github.com/marketplace/actions/checkout + - name: Check out code + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + # https://github.com/marketplace/actions/cache + - name: Cache Go modules + uses: actions/cache@v2 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + + - name: Check and get dependencies + run: | + go mod tidy + git diff --exit-code go.mod + git diff --exit-code go.sum + go mod download + + # https://golangci-lint.run/usage/install#other-ci + - name: Install golangci-lint ${{ env.GOLANGCI_LINT_VERSION }} + run: | + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin ${GOLANGCI_LINT_VERSION} + golangci-lint --version + + - name: Make + run: make + + - name: Make Image + run: make image + + # Install Docker image multi-arch builder + - name: Install seihon ${{ env.SEIHON_VERSION }} + if: startsWith(github.ref, 'refs/tags/v') + run: | + curl -sSfL https://raw.githubusercontent.com/ldez/seihon/master/godownloader.sh | sh -s -- -b $(go env GOPATH)/bin ${SEIHON_VERSION} + seihon --version + + - name: Docker Login + if: startsWith(github.ref, 'refs/tags/v') + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + run: | + echo "${DOCKER_PASSWORD}" | docker login --username "${DOCKER_USERNAME}" --password-stdin + + - name: Deploy Docker Images (seihon) + if: startsWith(github.ref, 'refs/tags/v') + run: make publish-images diff --git a/.golangci.toml b/.golangci.toml index 36fca87..71f8582 100644 --- a/.golangci.toml +++ b/.golangci.toml @@ -32,8 +32,14 @@ "gochecknoinits", "gomnd", "wsl", - "goerr113", + "nlreturn", "testpackage", + "paralleltest", + "tparallel", + "goerr113", + "wrapcheck", + "exhaustive", + "exhaustivestruct", ] [issues] diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0cf251d..0000000 --- a/.travis.yml +++ /dev/null @@ -1,53 +0,0 @@ -language: go - -go: - - "1.x" - -cache: - directories: - - $GOPATH/pkg/mod - -branches: - only: - - master - - /^v\d+\.\d+(\.\d+)?(-\S*)?$/ - -notifications: - email: - on_success: never - on_failure: change - -env: - - GO111MODULE=on - -before_install: - # Install linters and misspell - - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | bash -s -- -b $GOPATH/bin ${GOLANGCI_LINT_VERSION} - - golangci-lint --version - # Install Docker image multi-arch builder - - curl -sfL https://raw.githubusercontent.com/ldez/seihon/master/godownloader.sh | bash -s -- -b "${GOPATH}/bin" ${SEIHON_VERSION} - - seihon --version - -install: - - go mod tidy - - git diff --exit-code go.mod - - git diff --exit-code go.sum - - go mod download - -script: - - make - - make image - -before_deploy: - - > - if ! [ "$BEFORE_DEPLOY_RUN" ]; then - export BEFORE_DEPLOY_RUN=1; - echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin - fi - -deploy: - - provider: script - skip_cleanup: true - script: make publish-images - on: - tags: true diff --git a/Makefile b/Makefile index a62571c..74267cc 100644 --- a/Makefile +++ b/Makefile @@ -2,19 +2,21 @@ TAG_NAME := $(shell git tag -l --contains HEAD) -default: check test build +IMAGE_NAME := traefik/whoami -test: - go test -v -cover ./... +default: check test build build: - CGO_ENABLED=0 go build -a --installsuffix cgo --ldflags="-s" -o whoami + CGO_ENABLED=0 go build -a --trimpath --installsuffix cgo --ldflags="-s" -o whoami -image: - docker build -t traefik/whoami . +test: + go test -v -cover ./... check: golangci-lint run +image: + docker build -t $(IMAGE_NAME) . + publish-images: - seihon publish -v "$(TAG_NAME)" -v "latest" --image-name traefik/whoami --dry-run=false + seihon publish -v "$(TAG_NAME)" -v "latest" --image-name $(IMAGE_NAME) --dry-run=false diff --git a/README.md b/README.md index 44635c3..516793a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # whoami [![Docker Pulls](https://img.shields.io/docker/pulls/traefik/whoami.svg)](https://hub.docker.com/r/traefik/whoami/) -[![Build Status](https://travis-ci.com/traefik/whoami.svg?branch=master)](https://travis-ci.com/traefik/whoami) +[![Build Status](https://github.com/traefik/whoami/workflows/Main/badge.svg?branch=master)](https://github.com/traefik/whoami/actions) Tiny Go webserver that prints os information and HTTP request to output diff --git a/app.go b/app.go index 591a564..dc4fdf9 100644 --- a/app.go +++ b/app.go @@ -28,10 +28,12 @@ const ( TB ) -var cert string -var key string -var port string -var name string +var ( + cert string + key string + port string + name string +) func init() { flag.StringVar(&cert, "cert", "", "give me a certificate") @@ -130,7 +132,7 @@ func dataHandler(w http.ResponseWriter, r *http.Request) { content := fillContent(size) if attachment { - w.Header().Add("Content-Disposition", "Attachment") + w.Header().Set("Content-Disposition", "Attachment") http.ServeContent(w, r, "data.txt", time.Now(), content) return } @@ -231,8 +233,10 @@ type healthState struct { StatusCode int } -var currentHealthState = healthState{http.StatusOK} -var mutexHealthState = &sync.RWMutex{} +var ( + currentHealthState = healthState{http.StatusOK} + mutexHealthState = &sync.RWMutex{} +) func healthHandler(w http.ResponseWriter, req *http.Request) { if req.Method == http.MethodPost { diff --git a/tmpl.Dockerfile b/tmpl.Dockerfile index 81803d9..daa2c6e 100644 --- a/tmpl.Dockerfile +++ b/tmpl.Dockerfile @@ -12,6 +12,7 @@ COPY go.sum . RUN GO111MODULE=on GOPROXY=https://proxy.golang.org go mod download COPY . . + RUN GOARCH={{ .GoARCH }} GOARM={{ .GoARM }} make build FROM scratch