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
23f30d6
Add my name to README
Oct 27, 2025
efcd2f0
Add failing CI workflow
Oct 28, 2025
e8a3042
Run go version instead of exit 1
Oct 28, 2025
f01890e
Add unit tests for GetAPIKey
Oct 28, 2025
fdc1f23
CI: run go tests on push/PR
Oct 28, 2025
8d2e8a5
Fix workflow: add push trigger and remove setup-go
Oct 28, 2025
d5a6f48
Break test to verify CI failure
Oct 28, 2025
80d76ea
Fix tests so CI passes
Oct 28, 2025
d88567d
Add code coverage to CI
Oct 28, 2025
dfb9706
Add CI status badge to README
Oct 28, 2025
f35e0ac
Merge pull request #1 from JanP-K/addtests
JanP-K Oct 28, 2025
7af5bbf
CI: add parallel Style job to check formatting
Oct 28, 2025
b08ae88
Fix CI trigger (remove push event)
Oct 28, 2025
e1d1a4d
Merge pull request #2 from JanP-K/add-style-check
JanP-K Oct 28, 2025
b842707
CI: clean ASCII workflow (tests + style)
Oct 28, 2025
85a48c2
fix: format code for CI style check
Oct 28, 2025
005a958
Merge pull request #3 from JanP-K/add-style-check
JanP-K Oct 28, 2025
0168043
update ci.yml
Oct 29, 2025
c5569dd
Fix YAML indentation and add staticcheck
Oct 29, 2025
bfed707
Merge pull request #4 from JanP-K/add-style-check
JanP-K Oct 29, 2025
bbd947b
Add gosec security check to CI
Oct 29, 2025
47f603a
Security: add ReadHeaderTimeout and handle write error
Oct 29, 2025
05e1cd8
Merge pull request #5 from JanP-K/add-style-check
JanP-K Oct 29, 2025
aa0dc43
Add CD workflow
Oct 30, 2025
6435de7
Merge pull request #6 from JanP-K/add-style-check
JanP-K Oct 30, 2025
5fa8f9f
Add CD workflow to push image to Artifact Registry
Oct 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
35 changes: 35 additions & 0 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: cd

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 production binary
run: ./scripts/buildprod.sh

# 🔐 GCP-Login mit deinem Secret
- name: Set up gcloud
uses: google-github-actions/setup-gcloud@v2
with:
project_id: notely-476707
service_account_key: ${{ secrets.GCP_CREDENTIALS }}
export_default_credentials: true

# 🐳 Image in Artifact Registry bauen & pushen
- name: Build and push to Artifact Registry
run: |
gcloud builds submit \
--tag us-central1-docker.pkg.dev/notely-476707/notely-ar-repo/notely:latest .
43 changes: 43 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: ci

on:
pull_request:
branches: [main]
push:
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 security scan
run: $(go env GOPATH)/bin/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 (fail if changes needed)
shell: bash
run: test -z "$(go fmt ./...)"
- name: Install staticcheck
run: go install honnef.co/go/tools/cmd/staticcheck@latest
- name: Run staticcheck
run: $(go env GOPATH)/bin/staticcheck ./...
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
![CI Tests](https://github.com/JanP-K/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!

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

import (
"net/http"
"testing"
)

func TestGetAPIKey_Success(t *testing.T) {
h := http.Header{}
h.Set("Authorization", "ApiKey 12345")

key, err := GetAPIKey(h)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if key != "12345" {
t.Errorf("expected 12345, got %q", key)
}
}

func TestGetAPIKey_MissingHeader(t *testing.T) {
h := http.Header{}
_, err := GetAPIKey(h)
if err == nil {
t.Fatalf("expected error for missing Authorization header")
}
}

func TestGetAPIKey_WrongScheme(t *testing.T) {
h := http.Header{}
h.Set("Authorization", "Bearer 12345")

_, err := GetAPIKey(h)
if err == nil {
t.Fatalf("expected error for wrong scheme")
}
}
4 changes: 3 additions & 1 deletion json.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,7 @@ func respondWithJSON(w http.ResponseWriter, code int, payload interface{}) {
return
}
w.WriteHeader(code)
w.Write(dat)
if _, err := w.Write(dat); err != nil {
log.Printf("write error: %v", 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: 5 * time.Second,
}

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