Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
67d0455
modified README
craigbucher Sep 28, 2025
c921a01
add ci.yml
craigbucher Sep 28, 2025
1e5dcb5
new test
craigbucher Sep 28, 2025
9696d0b
added tests
craigbucher Sep 28, 2025
5e081ae
print console
craigbucher Sep 28, 2025
76ce78e
print console
craigbucher Sep 28, 2025
c59e75f
badge
craigbucher Sep 28, 2025
80168a6
badge
craigbucher Sep 28, 2025
6c6df93
badge
craigbucher Sep 28, 2025
56d7739
style test
craigbucher Sep 28, 2025
b425326
Merge pull request #1 from craigbucher/addtests
craigbucher Sep 28, 2025
5c18746
style test
craigbucher Sep 28, 2025
f92d4b9
staticcheck
craigbucher Sep 28, 2025
03e0f4c
staticcheck
craigbucher Sep 28, 2025
86a2828
testing
craigbucher Sep 28, 2025
4c283fd
gosec
craigbucher Sep 29, 2025
cd74e14
gosec
craigbucher Sep 29, 2025
9d9eb42
fix gosec errors
craigbucher Sep 29, 2025
0798fa1
styles
craigbucher Sep 29, 2025
001836b
docker
craigbucher Sep 29, 2025
58605c0
add cd.yml
craigbucher Sep 29, 2025
6475db4
Merge pull request #2 from craigbucher/addtests
craigbucher Sep 29, 2025
7294b60
configure GCN
craigbucher Sep 29, 2025
57e91c5
Merge pull request #3 from craigbucher/addtests
craigbucher Sep 29, 2025
18b1e1d
fix GCA tag
craigbucher Sep 29, 2025
7c2e528
Merge pull request #4 from craigbucher/addtests
craigbucher Sep 29, 2025
118b939
GCA Deploy
craigbucher Sep 29, 2025
17097f5
GCA Deploy
craigbucher Sep 29, 2025
365f0c5
Merge pull request #5 from craigbucher/addtests
craigbucher Sep 29, 2025
63366d3
migrate database
craigbucher Sep 30, 2025
0302109
Merge pull request #6 from craigbucher/addtests
craigbucher Sep 30, 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
44 changes: 44 additions & 0 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: cd

on:
push:
branches: [main]

jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}

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 the 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: 'Build and push image'
run: 'gcloud builds submit --tag us-central1-docker.pkg.dev/notely-473602/notely-ar-repo/notely:v1 .'

- name: Install goose
run: go install github.com/pressly/goose/v3/cmd/goose@latest

- name: Migrate the database
run: ./scripts/migrateup.sh

- name: 'Deploy to Cloud Run'
run: 'gcloud run deploy notely --image us-central1-docker.pkg.dev/notely-473602/notely-ar-repo/notely:v1 --region us-central1 --allow-unauthenticated --project notely-473602 --max-instances=4'
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: 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.25.1"

- 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 ./...
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM --platform=linux/amd64 debian:stable-slim
FROM debian:stable-slim

RUN apt-get update && apt-get install -y ca-certificates

Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
![test status](https://github.com/craigbucher/learn-cicd-starter/actions/workflows/ci.yml/badge.svg)

# learn-cicd-starter (Notely)

This repo contains the starter code for the "Notely" application for the "Learn CICD" course on [Boot.dev](https://boot.dev).
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!

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

import (
"fmt"
"net/http"
"strings"
"testing"
)

func TestGetAPIKey(t *testing.T) {
tests := []struct {
key string
value string
expect string
expectErr string
}{
{
expectErr: "no authorization header",
},
{
key: "Authorization",
expectErr: "no authorization header",
},
{
key: "Authorization",
value: "-",
expectErr: "malformed authorization header",
},
{
key: "Authorization",
value: "Bearer xxxxxx",
expectErr: "malformed authorization header",
},
{
key: "Authorization",
value: "ApiKey xxxxxx",
expect: "xxxxxx",
expectErr: "not expecting an error",
},
}

for i, test := range tests {
t.Run(fmt.Sprintf("TestGetAPIKey Case #%v:", i), func(t *testing.T) {
header := http.Header{}
header.Add(test.key, test.value)

output, err := GetAPIKey(header)
if err != nil {
if strings.Contains(err.Error(), test.expectErr) {
return
}
t.Errorf("Unexpected: TestGetAPIKey:%v\n", err)
return
}

if output != test.expect {
t.Errorf("Unexpected: TestGetAPIKey:%s", output)
return
}
})
}
}
5 changes: 4 additions & 1 deletion json.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,8 @@ 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("Critical error writing response: %s", err)
}
}
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.Second * 5,
}

log.Printf("Serving on port: %s\n", port)
Expand Down
2 changes: 1 addition & 1 deletion static/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
</head>

<body class="section">
<h1>Notely</h1>
<h1>Welcome to Notely</h1>

<div id="userCreationContainer" class="section">
<input id="nameField" type="text" placeholder="Enter your name">
Expand Down