Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
b7d1944
Add author of fork to README
pedroaguia8 Nov 19, 2025
fd98435
Add github actions workflow example
pedroaguia8 Nov 19, 2025
525efb0
Update CI workflow to verify Go installation instead of forcing failure
pedroaguia8 Nov 19, 2025
7dbf8fa
Add unit tests for GetAPIKey and update CI to run tests
pedroaguia8 Nov 19, 2025
6b4a6b8
Fix GetAPIKey auth header handling and update CI job step name of tes…
pedroaguia8 Nov 19, 2025
359b509
Update CI workflow to include test coverage flag
pedroaguia8 Nov 19, 2025
4027263
Add CI status badge to README
pedroaguia8 Nov 19, 2025
a5c6281
Add author of fork to README
pedroaguia8 Nov 19, 2025
4c7e0ac
Add github actions workflow example
pedroaguia8 Nov 19, 2025
fa4d720
Update CI workflow to verify Go installation instead of forcing failure
pedroaguia8 Nov 19, 2025
c4646b0
Add unit tests for GetAPIKey and update CI to run tests
pedroaguia8 Nov 19, 2025
88c2d98
Fix GetAPIKey auth header handling and update CI job step name of tes…
pedroaguia8 Nov 19, 2025
b8b5c51
Update CI workflow to include test coverage flag
pedroaguia8 Nov 19, 2025
2536355
Add CI status badge to README
pedroaguia8 Nov 19, 2025
5cd2d77
Update CI workflow to include formatting check
pedroaguia8 Nov 19, 2025
1448862
Merge branch 'main' into addtests
pedroaguia8 Nov 19, 2025
c93e845
Update CI workflow to include linting step and install staticcheck
pedroaguia8 Nov 19, 2025
cda4642
Remove unused 'unused' function from main.go
pedroaguia8 Nov 19, 2025
f487ac3
Update CI workflow to include gosec for security checks
pedroaguia8 Nov 19, 2025
8c88a1b
Handle response writer error and add read header timeout to HTTP server
pedroaguia8 Nov 19, 2025
0d817b8
Add CD workflow to deploy on push to main branch
pedroaguia8 Nov 19, 2025
fde6bcd
Merge pull request #2
pedroaguia8 Nov 19, 2025
a946da6
Update CD workflow to push build to Google Cloud Artifact Registry
pedroaguia8 Nov 19, 2025
7bec673
Update CD workflow to push build to Google Cloud Artifact Registry
pedroaguia8 Nov 19, 2025
e02e25e
Add authentication step to CD workflow using GCP credentials
pedroaguia8 Nov 19, 2025
0afa964
Merge branch 'main' into addtests
pedroaguia8 Nov 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: cd.yml
on:
push:
branches: [main]

jobs:
deploy:
name: Deploy
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.25.1"

- name: Build app
run: ./scripts/buildprod.sh

- id: 'auth'
uses: 'google-github-actions/auth@v2'
with:
credentials_json: '${{ secrets.GCP_CREDENTIALS }}'

- name: 'Set up Cloud SDK'
uses: 'google-github-actions/setup-gcloud@v3'

- name: 'Push build to Google Cloud Artifact Registry'
run: gcloud builds submit --tag us-central1-docker.pkg.dev/notely-478717/notely-ar-repo/notely:latest .


50 changes: 50 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -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.25.1"

- name: Install gosec
run: go install github.com/securego/gosec/v2/cmd/gosec@latest

- name: Run the tests
run: go test ./... -cover

- name: Run the security check
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.25.1"

- name: Install staticcheck
run: go install honnef.co/go/tools/cmd/staticcheck@latest

- name: Check formatting
run: test -z $(go fmt ./...)

- name: Check linting
run: staticcheck ./...
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# learn-cicd-starter (Notely)

![github actions status](https://github.com/pedroaguia8/Boot.dev-learn-cicd/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
Expand All @@ -21,3 +23,5 @@ 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!

Pedro's version of Boot.dev's Notely app.
55 changes: 55 additions & 0 deletions internal/auth/auth_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package auth

import (
"net/http"
"testing"
)

func TestGetAPIKey(t *testing.T) {
tests := map[string]struct {
headers http.Header
want string
wantErr string // Use string to check error message content
}{
"valid api key": {
headers: http.Header{"Authorization": []string{"ApiKey my-secret-token"}},
want: "my-secret-token",
wantErr: "",
},
"no auth header included": {
headers: http.Header{},
want: "",
wantErr: ErrNoAuthHeaderIncluded.Error(),
},
"malformed authorization header - wrong prefix": {
headers: http.Header{"Authorization": []string{"Bearer my-token"}},
want: "",
wantErr: "malformed authorization header",
},
"malformed authorization header - missing key": {
headers: http.Header{"Authorization": []string{"ApiKey"}},
want: "",
wantErr: "malformed authorization header",
},
}

for name, tc := range tests {
t.Run(name, func(t *testing.T) {
got, err := GetAPIKey(tc.headers)

// Check the returned string value
if got != tc.want {
t.Errorf("expected: %v, got: %v", tc.want, got)
}

// Check the error behavior
if err != nil {
if err.Error() != tc.wantErr {
t.Errorf("expected error: %v, got: %v", tc.wantErr, err.Error())
}
} else if tc.wantErr != "" {
t.Errorf("expected error: %v, got: nil", tc.wantErr)
}
})
}
}
7 changes: 6 additions & 1 deletion json.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,10 @@ func respondWithJSON(w http.ResponseWriter, code int, payload interface{}) {
return
}
w.WriteHeader(code)
w.Write(dat)
_, err = w.Write(dat)
if err != nil {
log.Printf("Error writing data to response: %s", err)
w.WriteHeader(500)
return
}
}
6 changes: 4 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"log"
"net/http"
"os"
"time"

"github.com/go-chi/chi"
"github.com/go-chi/cors"
Expand Down Expand Up @@ -89,8 +90,9 @@ func main() {

router.Mount("/v1", v1Router)
srv := &http.Server{
Addr: ":" + port,
Handler: router,
Addr: ":" + port,
Handler: router,
ReadHeaderTimeout: time.Duration(5 * time.Second),
}

log.Printf("Serving on port: %s\n", port)
Expand Down