Compare commits

..

28 Commits

Author SHA1 Message Date
e570a2e3c8 Add endpoint for chunked transfer
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m22s
Gitea Actions Demo / test (push) Successful in 1m20s
Gitea Actions Demo / release-image (push) Successful in 1m14s
2024-08-20 20:02:21 -05:00
d52786aa44 Rotate secret again
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m26s
Gitea Actions Demo / test (push) Successful in 1m19s
Gitea Actions Demo / release-image (push) Successful in 1m9s
2024-08-19 02:04:50 -05:00
467a8a4b15 Finish Reloader setup
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m21s
Gitea Actions Demo / test (push) Successful in 1m19s
Gitea Actions Demo / release-image (push) Successful in 1m8s
2024-08-18 01:53:32 -05:00
cbef23df77 Rename ConfigMap
Some checks failed
Gitea Actions Demo / release-image (push) Blocked by required conditions
Gitea Actions Demo / lint (push) Successful in 1m21s
Gitea Actions Demo / test (push) Has been cancelled
2024-08-18 01:49:06 -05:00
af77b895e0 Add a ConfigMap
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m21s
Gitea Actions Demo / test (push) Successful in 1m21s
Gitea Actions Demo / release-image (push) Successful in 1m3s
2024-08-18 01:38:47 -05:00
2417429953 Rotate session secret again
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m21s
Gitea Actions Demo / test (push) Successful in 1m17s
Gitea Actions Demo / release-image (push) Successful in 1m2s
2024-08-18 01:20:41 -05:00
4e567a0041 Enable reloader
Some checks failed
Gitea Actions Demo / test (push) Blocked by required conditions
Gitea Actions Demo / release-image (push) Blocked by required conditions
Gitea Actions Demo / lint (push) Has been cancelled
2024-08-18 01:18:49 -05:00
9ef84c509d Rotate session secret
Some checks are pending
Gitea Actions Demo / release-image (push) Blocked by required conditions
Gitea Actions Demo / lint (push) Successful in 1m21s
Gitea Actions Demo / test (push) Successful in 1m20s
2024-08-18 01:15:44 -05:00
83a6152472 Disable sessions for endpoints that do not require them
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m21s
Gitea Actions Demo / test (push) Successful in 1m20s
Gitea Actions Demo / release-image (push) Successful in 1m4s
2024-08-17 14:03:04 -05:00
ac5f98d865 Remove Deployment in favor of a Rollout
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m31s
Gitea Actions Demo / test (push) Successful in 1m20s
Gitea Actions Demo / release-image (push) Successful in 1m3s
2024-08-11 18:02:48 -05:00
87156eda3d Add /status/:code 2024-08-11 17:52:44 -05:00
22b9593ab1 Add Argo Rollout 2024-08-11 17:52:44 -05:00
b6f05b475f Add /_cat/cookies
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m22s
Gitea Actions Demo / test (push) Successful in 1m18s
Gitea Actions Demo / release-image (push) Successful in 1m11s
2024-08-11 11:18:41 -05:00
b174107b8a Rotate k8s SESSION_SECRET
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m23s
Gitea Actions Demo / test (push) Successful in 1m21s
Gitea Actions Demo / release-image (push) Successful in 1m2s
2024-08-07 12:20:38 -05:00
de408fc00d Fix secret reference
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m19s
Gitea Actions Demo / test (push) Successful in 1m22s
Gitea Actions Demo / release-image (push) Successful in 59s
2024-07-30 14:43:35 -05:00
f8868939e1 Use reloader
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m23s
Gitea Actions Demo / test (push) Successful in 1m18s
Gitea Actions Demo / release-image (push) Successful in 1m1s
2024-07-30 14:30:20 -05:00
730817d059 Add sealed secret 2024-07-30 14:30:00 -05:00
9ce79f2f67 Add memcached
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m27s
Gitea Actions Demo / test (push) Successful in 1m16s
Gitea Actions Demo / release-image (push) Successful in 59s
2024-07-29 10:13:57 -05:00
c57d3303ed Make Kustomize manifests more modular
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m29s
Gitea Actions Demo / test (push) Successful in 1m20s
Gitea Actions Demo / release-image (push) Successful in 1m3s
2024-07-28 20:53:43 -05:00
7fc61df477 Add readiness check web endpoint
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m23s
Gitea Actions Demo / test (push) Successful in 1m18s
Gitea Actions Demo / release-image (push) Successful in 1m0s
2024-07-27 17:05:01 -05:00
f131f64641 Add readiness probe
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m33s
Gitea Actions Demo / test (push) Successful in 1m18s
Gitea Actions Demo / release-image (push) Successful in 1m1s
2024-07-27 16:29:06 -05:00
f8b05bf760 Add liveness probe
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m19s
Gitea Actions Demo / test (push) Successful in 1m16s
Gitea Actions Demo / release-image (push) Successful in 1m2s
2024-07-27 16:22:33 -05:00
ae20830cda Remove secret generator
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m14s
Gitea Actions Demo / test (push) Successful in 1m10s
Gitea Actions Demo / release-image (push) Successful in 56s
2024-07-25 23:26:20 -05:00
6c4ae108ee Use secret generator
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m21s
Gitea Actions Demo / test (push) Successful in 1m14s
Gitea Actions Demo / release-image (push) Successful in 1m1s
2024-07-21 11:35:01 -05:00
55fbed3c3c Rename CI YAML file
Some checks failed
Gitea Actions Demo / lint (push) Successful in 1m32s
Gitea Actions Demo / test (push) Successful in 1m47s
Gitea Actions Demo / release-image (push) Failing after 14m47s
2024-07-17 21:31:21 -05:00
88e24c688b Move text/plain routes to /_cat prefix
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m23s
Gitea Actions Demo / test (push) Successful in 1m22s
Gitea Actions Demo / release-image (push) Successful in 1m6s
2024-07-08 10:07:34 -05:00
ca7d22374d Switch to RSpec
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m21s
Gitea Actions Demo / test (push) Successful in 1m17s
Gitea Actions Demo / release-image (push) Successful in 59s
2024-07-07 20:14:02 -05:00
3b5e0f5c71 standardrb: don't autofix
All checks were successful
Gitea Actions Demo / lint (push) Successful in 1m22s
Gitea Actions Demo / test (push) Successful in 1m19s
Gitea Actions Demo / release-image (push) Successful in 1m1s
2024-07-07 16:43:30 -05:00
18 changed files with 238 additions and 77 deletions

View File

@ -26,7 +26,7 @@ jobs:
test:
needs: link
needs: lint
runs-on: ubuntu-latest
steps:
- name: Checkout
@ -38,7 +38,7 @@ jobs:
ruby-version: '3.3'
bundler-cache: true
- run: ruby app_test.rb
- run: bundle exec rspec
release-image:

View File

@ -9,7 +9,7 @@ gem "anyflake"
gem "ksuid"
gem "nanoid"
gem "ulid"
gem 'uuid7'
gem "uuid7"
gem "jwt"
@ -18,6 +18,6 @@ group :development do
gem "rubocop"
gem "rbs"
gem "rack-test"
gem "test-unit"
gem "rspec"
gem "standard"
end

View File

@ -4,6 +4,7 @@ GEM
anyflake (0.0.1)
ast (2.4.2)
base64 (0.2.0)
diff-lcs (1.5.1)
json (2.7.2)
jwt (2.8.2)
base64
@ -20,7 +21,6 @@ GEM
parser (3.3.3.0)
ast (~> 2.4.1)
racc
power_assert (2.0.3)
prism (0.30.0)
puma (6.4.2)
nio4r (~> 2.0)
@ -42,6 +42,19 @@ GEM
regexp_parser (2.9.2)
rexml (3.3.0)
strscan
rspec (3.13.0)
rspec-core (~> 3.13.0)
rspec-expectations (~> 3.13.0)
rspec-mocks (~> 3.13.0)
rspec-core (3.13.0)
rspec-support (~> 3.13.0)
rspec-expectations (3.13.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-mocks (3.13.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-support (3.13.1)
rubocop (1.64.1)
json (~> 2.3)
language_server-protocol (>= 3.17.0)
@ -91,8 +104,6 @@ GEM
lint_roller (~> 1.1)
rubocop-performance (~> 1.21.0)
strscan (3.1.0)
test-unit (3.6.2)
power_assert
tilt (2.3.0)
ulid (1.4.0)
unicode-display_width (2.5.0)
@ -114,12 +125,12 @@ DEPENDENCIES
rack-test
rackup
rbs
rspec
rubocop
ruby-lsp
sinatra
sinatra-contrib
standard
test-unit
ulid
uuid7

68
app.rb
View File

@ -2,6 +2,7 @@ require "bundler/setup"
require "sinatra"
require "sinatra/json"
require "sinatra/cookies"
require "sinatra/multi_route"
require "time"
require "fileutils"
require "json"
@ -204,6 +205,8 @@ end
before do
# content_type 'text/plain'
sleep(1) while Sleep.instance.asleep? && request.path_info != "/livez/sleep"
content_type :text if request.path_info.start_with? "/_cat"
request.session_options[:skip] = !request.path_info.start_with?("/session")
end
get "/" do
@ -211,19 +214,13 @@ get "/" do
end
get "/env", provides: "json" do
content_type :json
return JSON.pretty_generate ENV.sort.to_h if params.key? "pretty"
JSON.generate ENV.sort.to_h
end
get "/env" do
stream do |out|
ENV.sort.each do |k, v|
out << "#{k}=#{v}\n"
end
end
end
get "/headers", provides: "json" do
h = req_headers
return JSON.pretty_generate h if params.key? "pretty"
@ -231,14 +228,6 @@ get "/headers", provides: "json" do
JSON.generate h
end
get "/headers" do
stream do |out|
req_headers.each do |k, v|
out << "#{k}: #{v.inspect}\n"
end
end
end
get "/livez" do
error 503 unless Health.instance.healthy?
@ -263,6 +252,14 @@ post "/livez/sleep" do
"ok\n"
end
get "/readyz" do
error 503 unless Ready.instance.ready?
return Ready.instance.to_json if request.env["HTTP_ACCEPT"] == "application/json"
Ready.instance.to_s
end
get "/uuid" do
n = params.fetch(:n, 1).to_i
stream do |out|
@ -336,3 +333,42 @@ end
get "/cookies" do
json response.headers
end
get "/_cat/headers" do
stream do |out|
req_headers.each do |k, v|
out << "#{k}: #{v.inspect}\n"
end
end
end
get "/_cat/env" do
stream do |out|
ENV.sort.each do |k, v|
out << "#{k}=#{v}\n"
end
end
end
get "/_cat/cookies" do
stream do |out|
cookies.each do |k, v|
out << "#{k}=#{v}\n"
end
end
end
route :delete, :get, :patch, :post, :put, "/status/:code" do
# hello
code = Integer(params[:code])
status code if code.between? 100, 599
end
get "/chunked/:delay" do
delay = Float(params[:delay])
stream do |out|
out << "Hello, world!\n"
sleep delay
out << "Hello, world!\n"
end
end

View File

@ -1,19 +0,0 @@
ENV["APP_ENV"] = "test"
require "./app"
require "test/unit"
require "rack/test"
class ToyTest < Test::Unit::TestCase
include Rack::Test::Methods
def app
Sinatra::Application
end
def test_root
get "/"
assert last_response.ok?
assert_equal "hello there!\n", last_response.body
end
end

View File

@ -0,0 +1,11 @@
---
apiVersion: v1
kind: ConfigMap
metadata:
name: toy-configmap
namespace: toy
annotations:
reloader.stakater.com/match: "true"
data:
CAT: luna

View File

@ -0,0 +1,10 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: toy
resources:
- secret.yaml
- configmap.yaml
- rollout.yaml
- services.yaml
- ingress.yaml

View File

@ -0,0 +1,58 @@
---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: toy
annotations:
reloader.stakater.com/auto: "true"
spec:
replicas: 5
strategy:
canary:
steps:
- setWeight: 20
- pause: {}
- setWeight: 40
- pause: {duration: 10}
- setWeight: 60
- pause: {duration: 10}
- setWeight: 80
- pause: {duration: 10}
revisionHistoryLimit: 2
selector:
matchLabels:
app: toy
template:
metadata:
labels:
app: toy
spec:
containers:
- name: toy
image: git.kill0.net/ryanc/toy:latest
imagePullPolicy: Always
ports:
- name: web
containerPort: 4567
env:
- name: SESSION_SECRET
valueFrom:
secretKeyRef:
name: toy-session-secret
key: session_secret
optional: true
envFrom:
- configMapRef:
name: toy-configmap
livenessProbe:
httpGet:
path: /livez
port: 4567
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
httpGet:
path: /readyz
port: 4567
initialDelaySeconds: 5
periodSeconds: 5

17
kustomize/app/secret.yaml Normal file
View File

@ -0,0 +1,17 @@
---
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
creationTimestamp: null
name: toy-session-secret
namespace: toy
annotations:
reloader.stakater.com/match: "true"
spec:
encryptedData:
session_secret: AgBTxKU1zmMUNAUi9zR8bBby/u7voCe9axQgtNP9naE4Jhb8cGORCOuhT7EwUNZUc0gYf8XE56EeZQx9fl/m7IPr34dkC7IK22ZAG391PUBsj7gKYdBRL+s7hqH2s02eY3EIw45lWWjjdEmEizenFmqKpD0zD/UZFps1oRUnJ8Fry/wmfpNsapyb3J5fMC1p/SlJAFAEbGe+BKhjyIxAgHbizL510X1fGvS7LGgUQR4ePnX8Xmi1ubM8PeQOX0tRZwdw+AT8hm1eUd9KSw1PwlcF/xzrGHb7Pw5zTwoa9p1H9+nv80SyNdKxgWvwFj0+GThbOc3wiF1ENVyZmxZo/Y5SyHs7QpATvy23f253aC67nmTz5FU2KkmfqO8hGhdsrxIdQo/iMZq/SVABX4FgbrbKi70dRMe4SWRD1albqp4h/e2asBMPyzS+L27m6zD8BMZ+J9sQGyjAzzkADS5xG9UAF78fXZXJmPbNxCq92FFINHK98np3ucP+VdDBMyfOeKH8ieBR/qfakWRHnVQVsR+hnwdRS0CMixw7wB6RQw/JCAXKiwKVvvmVVXZzpNucuTesFClYNTxRKhPBHtiyXEPDaHpi7PghQB81wDcY0T9u6HYjGl4udA0friiN1CmUGO8e5FtkQ4eiMe+SIB3oCXNGWErMpMkHIRdt4rdP08rZ2m4GG3MKtQlBKM4MHfcKvke4tkLmeAItMTl2qNd283xaeabO0lG9yh0fuYuaNbqvYNt8TCprLWVb+ynrqbHn4E0SeoRT+vjGSR9K9N+iLkv6GCjDhiw+TrQ4QArYHI3CS2SeY4oIOe2HUP3jyjSh4r6jH1+n3elJG/eb+GQ9nlC4xKqXE+wwx+7s850nMifcDuk=
template:
metadata:
creationTimestamp: null
name: toy-session-secret
namespace: toy

View File

@ -1,31 +0,0 @@
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: toy
labels:
app: toy
spec:
replicas: 3
selector:
matchLabels:
app: toy
template:
metadata:
labels:
app: toy
spec:
containers:
- name: toy
image: git.kill0.net/ryanc/toy:latest
ports:
- name: web
containerPort: 4567
env:
- name: SESSION_SECRET
valueFrom:
secretKeyRef:
name: toy-session-secret
key: toy-session-secret
optional: true

View File

@ -3,6 +3,6 @@ apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: toy
resources:
- deployment.yaml
- services.yaml
- ingress.yaml
- namespace.yaml
- ./app
- ./memcached

View File

@ -0,0 +1,21 @@
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: toy-memcached
spec:
selector:
matchLabels:
app: toy-memcached
template:
metadata:
labels:
app: toy-memcached
spec:
containers:
- name: toy-memcached
image: memcached:latest
ports:
- name: memcached
containerPort: 11211

View File

@ -0,0 +1,7 @@
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: toy
resources:
- deployment.yaml
- services.yaml

View File

@ -0,0 +1,13 @@
---
apiVersion: v1
kind: Service
metadata:
name: toy-memcached
spec:
ports:
- name: memcached
port: 11211
targetPort: memcached
selector:
app: toy-memcached

6
kustomize/namespace.yaml Normal file
View File

@ -0,0 +1,6 @@
---
apiVersion: v1
kind: Namespace
metadata:
name: toy

21
spec/app_spec.rb Normal file
View File

@ -0,0 +1,21 @@
ENV["APP_ENV"] = "test"
require "./app"
require "rspec"
require "rack/test"
describe "Toy App" do
include Rack::Test::Methods
def app
Sinatra::Application
end
context "test /" do
it "test root route" do
get "/"
expect(last_response).to be_ok
expect(last_response.body).to eq("hello there!\n")
end
end
end