diff --git a/.gitea/workflows/main.yaml b/.gitea/workflows/main.yaml index f5d393d..9fdfba7 100644 --- a/.gitea/workflows/main.yaml +++ b/.gitea/workflows/main.yaml @@ -10,13 +10,21 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version: '1.24.x' + - name: golangci-lint + uses: golangci/golangci-lint-action@v8 + with: + version: v2.1 - name: Test with the Go CLI - run: go test ./... + run: go test ./... -v + - name: Run Gosec Security Scanner + uses: securego/gosec@master + with: + args: ./... Build_Image: runs-on: ubuntu-latest steps: @@ -46,4 +54,4 @@ jobs: # - name: Sign the published Docker image # env: # COSIGN_EXPERIMENTAL: "true" - # run: cosign sign lerentis/canada-kaktus:${{ github.sha }}@${{ steps.build-and-push.outputs.digest }} \ No newline at end of file + # run: cosign sign lerentis/canada-kaktus:${{ github.sha }}@${{ steps.build-and-push.outputs.digest }} diff --git a/.gitea/workflows/pr.yaml b/.gitea/workflows/pr.yaml index 33c0273..773697a 100644 --- a/.gitea/workflows/pr.yaml +++ b/.gitea/workflows/pr.yaml @@ -7,13 +7,21 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version: '1.24.x' + - name: golangci-lint + uses: golangci/golangci-lint-action@v8 + with: + version: v2.1 - name: Test with the Go CLI - run: go test ./... + run: go test ./... -v + - name: Run Gosec Security Scanner + uses: securego/gosec@master + with: + args: ./... Build_Image: runs-on: ubuntu-latest steps: diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml index 44c7647..9979912 100644 --- a/.gitea/workflows/release.yaml +++ b/.gitea/workflows/release.yaml @@ -7,13 +7,21 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version: '1.24.x' + - name: golangci-lint + uses: golangci/golangci-lint-action@v8 + with: + version: v2.1 - name: Test with the Go CLI - run: go test ./... + run: go test ./... -v + - name: Run Gosec Security Scanner + uses: securego/gosec@master + with: + args: ./... Build_Image: runs-on: ubuntu-latest steps: @@ -43,4 +51,4 @@ jobs: # - name: Sign the published Docker image # env: # COSIGN_EXPERIMENTAL: "true" - # run: cosign sign lerentis/canada-kaktus:${{ github.event.release.tag_name }}@${{ steps.build-and-push.outputs.digest }} \ No newline at end of file + # run: cosign sign lerentis/canada-kaktus:${{ github.event.release.tag_name }}@${{ steps.build-and-push.outputs.digest }} diff --git a/internal/health.go b/internal/health.go index 351ae73..a45f163 100644 --- a/internal/health.go +++ b/internal/health.go @@ -4,6 +4,7 @@ import ( "fmt" "net/http" "sync" + "time" "github.com/gorilla/mux" log "github.com/sirupsen/logrus" @@ -36,7 +37,16 @@ func (hs *HealthServer) Start() { r := mux.NewRouter() r.Use(mux.CORSMethodMiddleware(r)) r.HandleFunc("/health", hs.sendHealth).Methods(http.MethodGet) - err := http.ListenAndServe("0.0.0.0:8080", r) + + server := &http.Server{ + Addr: "0.0.0.0:8080", + Handler: r, + ReadTimeout: 15 * time.Second, + WriteTimeout: 15 * time.Second, + IdleTimeout: 60 * time.Second, + } + + err := server.ListenAndServe() if err != nil { log.WithFields(log.Fields{ "Caller": "HealthServer.Start", diff --git a/internal/health_test.go b/internal/health_test.go index 01667b4..6913e3c 100644 --- a/internal/health_test.go +++ b/internal/health_test.go @@ -4,6 +4,7 @@ import ( "net/http" "strings" "testing" + "time" ) func TestHealth(t *testing.T) { @@ -11,14 +12,19 @@ func TestHealth(t *testing.T) { go func() { hs.Start() }() + + // Give the server time to start up + time.Sleep(100 * time.Millisecond) + request, _ := http.NewRequest(http.MethodGet, "http://localhost:8080/health", strings.NewReader("")) resp, err := http.DefaultClient.Do(request) if err != nil { t.Errorf("Health endpoint did not start: %v", err) + return } - if resp.StatusCode != http.StatusOK { + if resp != nil && resp.StatusCode != http.StatusOK { t.Errorf("Bad response from health endpoint. Want: %d, got %d", http.StatusOK, resp.StatusCode) } }