diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 0000000000..96e09b7cdd --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,48 @@ +name: CD + +on: + push: + branches: [main] + +jobs: + Deploy: +<<<<<<< HEAD +======= + permissions: + contents: 'read' + id-token: 'write' + +>>>>>>> feat: add CI/CD configuration for GCP deployment + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Go + uses: actions/setup-go@v4 + with: +<<<<<<< HEAD + go-version: '1.23.0' + + - name: Build Production + run: bash scripts/buildprod.sh +======= + go-version: '1.22.0' + + - name: Build Production + run: bash scripts/buildprod.sh + + - name: Google Auth + uses: 'google-github-actions/auth@v2' + with: + credentials_json: '${{ secrets.GCP_CREDENTIALS }}' + + - name: Set up Cloud SDK + uses: 'google-github-actions/setup-gcloud@v2' + + - name: Configure Docker for Artifact Registry + run: gcloud auth configure-docker us-central1-docker.pkg.dev --quiet + + - name: Build and Push Docker image + run: | + gcloud builds submit --tag us-central1-docker.pkg.dev/notely-443204/notely-ar-repo/notely:latest . +>>>>>>> feat: add CI/CD configuration for GCP deployment diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..aa81294748 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,50 @@ +name: ci + +on: + pull_request: + branches: [main] + +jobs: + tests: + name: Tests + runs-on: ubuntu-latest + + steps: + - name: Check out code + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: '1.23.0' + + - name: Run unit tests + run: go test ./... -cover + + - name: Install gosec + run: go install github.com/securego/gosec/v2/cmd/gosec@latest + + - name: Run gosec + run: gosec ./... + + style: + name: Style + runs-on: ubuntu-latest + + steps: + - name: Check out code + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: '1.23.0' + + - name: Check formatting + run: test -z $(go fmt ./...) + + - name: Install staticcheck + run: go install honnef.co/go/tools/cmd/staticcheck@latest + + - name: Run staticcheck + run: staticcheck ./... diff --git a/.gitignore b/.gitignore index 2092f54e78..8672c2a062 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,41 @@ +# Binary files out -.env -learn-cicd-starter notely +learn-cicd-starter + +# Environment files +.env +.env.* + +# Google Cloud SDK +google-cloud-sdk/ +google-cloud-cli-*.tar.gz + +# Build artifacts +*.exe +*.exe~ +*.dll +*.so +*.dylib +bin/ +dist/ + +# Go specific +*.test +*.out +vendor/ +go.work + +# IDE and editor files +.idea/ +.vscode/ +*.swp +*.swo + +# OS specific +.DS_Store +Thumbs.db + +# Temporary files +tmp/ +temp/ diff --git a/README.md b/README.md index c2bec0368b..ba18160bad 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # learn-cicd-starter (Notely) +![Tests](https://github.com/srinivasivaratri/learn-cicd-starter/actions/workflows/ci.yml/badge.svg) + This repo contains the starter code for the "Notely" application for the "Learn CICD" course on [Boot.dev](https://boot.dev). ## Local Development @@ -21,3 +23,6 @@ go build -o notely && ./notely *This starts the server in non-database mode.* It will serve a simple webpage at `http://localhost:8080`. You do *not* need to set up a database or any interactivity on the webpage yet. Instructions for that will come later in the course! + + +Srinivas's version of Boot.dev's Notely app. \ No newline at end of file diff --git a/json.go b/json.go index e346ef4093..3add13dc25 100644 --- a/json.go +++ b/json.go @@ -19,13 +19,14 @@ func respondWithError(w http.ResponseWriter, code int, msg string) { } func respondWithJSON(w http.ResponseWriter, code int, payload interface{}) { - w.Header().Set("Content-Type", "application/json") dat, err := json.Marshal(payload) if err != nil { - log.Printf("Error marshalling JSON: %s", err) - w.WriteHeader(500) + http.Error(w, err.Error(), http.StatusInternalServerError) return } + w.Header().Set("Content-Type", "application/json") w.WriteHeader(code) - w.Write(dat) + if _, err := w.Write(dat); err != nil { + log.Printf("Error writing response: %v", err) + } } diff --git a/main.go b/main.go index 19d7366c5f..1c9dd76613 100644 --- a/main.go +++ b/main.go @@ -7,6 +7,7 @@ import ( "log" "net/http" "os" + "time" "github.com/go-chi/chi" "github.com/go-chi/cors" @@ -89,10 +90,14 @@ func main() { router.Mount("/v1", v1Router) srv := &http.Server{ - Addr: ":" + port, - Handler: router, + Addr: ":" + port, + Handler: router, + ReadHeaderTimeout: 5 * time.Second, } - log.Printf("Serving on port: %s\n", port) + log.Printf("serving on port: %s\n", port) log.Fatal(srv.ListenAndServe()) } + + +