Compare commits
28 Commits
df61e45aff
...
develop
Author | SHA1 | Date | |
---|---|---|---|
e570a2e3c8
|
|||
d52786aa44
|
|||
467a8a4b15
|
|||
cbef23df77
|
|||
af77b895e0
|
|||
2417429953
|
|||
4e567a0041
|
|||
9ef84c509d
|
|||
83a6152472
|
|||
ac5f98d865
|
|||
87156eda3d
|
|||
22b9593ab1
|
|||
b6f05b475f
|
|||
b174107b8a
|
|||
de408fc00d
|
|||
f8868939e1
|
|||
730817d059
|
|||
9ce79f2f67
|
|||
c57d3303ed
|
|||
7fc61df477
|
|||
f131f64641
|
|||
f8b05bf760
|
|||
ae20830cda
|
|||
6c4ae108ee
|
|||
55fbed3c3c
|
|||
88e24c688b
|
|||
ca7d22374d
|
|||
3b5e0f5c71
|
@ -10,11 +10,23 @@ jobs:
|
|||||||
checks: write
|
checks: write
|
||||||
contents: write
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Ruby Setup
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: '3.3'
|
||||||
|
bundler-cache: true
|
||||||
|
|
||||||
|
- run: bundle install
|
||||||
|
|
||||||
- name: Standard Ruby
|
- name: Standard Ruby
|
||||||
uses: standardrb/standard-ruby-action@v1
|
run: bundle exec standardrb
|
||||||
|
|
||||||
|
|
||||||
test:
|
test:
|
||||||
needs: link
|
needs: lint
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
@ -26,7 +38,7 @@ jobs:
|
|||||||
ruby-version: '3.3'
|
ruby-version: '3.3'
|
||||||
bundler-cache: true
|
bundler-cache: true
|
||||||
|
|
||||||
- run: ruby app_test.rb
|
- run: bundle exec rspec
|
||||||
|
|
||||||
|
|
||||||
release-image:
|
release-image:
|
2
Gemfile
2
Gemfile
@ -18,6 +18,6 @@ group :development do
|
|||||||
gem "rubocop"
|
gem "rubocop"
|
||||||
gem "rbs"
|
gem "rbs"
|
||||||
gem "rack-test"
|
gem "rack-test"
|
||||||
gem "test-unit"
|
gem "rspec"
|
||||||
gem "standard"
|
gem "standard"
|
||||||
end
|
end
|
||||||
|
19
Gemfile.lock
19
Gemfile.lock
@ -4,6 +4,7 @@ GEM
|
|||||||
anyflake (0.0.1)
|
anyflake (0.0.1)
|
||||||
ast (2.4.2)
|
ast (2.4.2)
|
||||||
base64 (0.2.0)
|
base64 (0.2.0)
|
||||||
|
diff-lcs (1.5.1)
|
||||||
json (2.7.2)
|
json (2.7.2)
|
||||||
jwt (2.8.2)
|
jwt (2.8.2)
|
||||||
base64
|
base64
|
||||||
@ -20,7 +21,6 @@ GEM
|
|||||||
parser (3.3.3.0)
|
parser (3.3.3.0)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
racc
|
racc
|
||||||
power_assert (2.0.3)
|
|
||||||
prism (0.30.0)
|
prism (0.30.0)
|
||||||
puma (6.4.2)
|
puma (6.4.2)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
@ -42,6 +42,19 @@ GEM
|
|||||||
regexp_parser (2.9.2)
|
regexp_parser (2.9.2)
|
||||||
rexml (3.3.0)
|
rexml (3.3.0)
|
||||||
strscan
|
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)
|
rubocop (1.64.1)
|
||||||
json (~> 2.3)
|
json (~> 2.3)
|
||||||
language_server-protocol (>= 3.17.0)
|
language_server-protocol (>= 3.17.0)
|
||||||
@ -91,8 +104,6 @@ GEM
|
|||||||
lint_roller (~> 1.1)
|
lint_roller (~> 1.1)
|
||||||
rubocop-performance (~> 1.21.0)
|
rubocop-performance (~> 1.21.0)
|
||||||
strscan (3.1.0)
|
strscan (3.1.0)
|
||||||
test-unit (3.6.2)
|
|
||||||
power_assert
|
|
||||||
tilt (2.3.0)
|
tilt (2.3.0)
|
||||||
ulid (1.4.0)
|
ulid (1.4.0)
|
||||||
unicode-display_width (2.5.0)
|
unicode-display_width (2.5.0)
|
||||||
@ -114,12 +125,12 @@ DEPENDENCIES
|
|||||||
rack-test
|
rack-test
|
||||||
rackup
|
rackup
|
||||||
rbs
|
rbs
|
||||||
|
rspec
|
||||||
rubocop
|
rubocop
|
||||||
ruby-lsp
|
ruby-lsp
|
||||||
sinatra
|
sinatra
|
||||||
sinatra-contrib
|
sinatra-contrib
|
||||||
standard
|
standard
|
||||||
test-unit
|
|
||||||
ulid
|
ulid
|
||||||
uuid7
|
uuid7
|
||||||
|
|
||||||
|
68
app.rb
68
app.rb
@ -2,6 +2,7 @@ require "bundler/setup"
|
|||||||
require "sinatra"
|
require "sinatra"
|
||||||
require "sinatra/json"
|
require "sinatra/json"
|
||||||
require "sinatra/cookies"
|
require "sinatra/cookies"
|
||||||
|
require "sinatra/multi_route"
|
||||||
require "time"
|
require "time"
|
||||||
require "fileutils"
|
require "fileutils"
|
||||||
require "json"
|
require "json"
|
||||||
@ -204,6 +205,8 @@ end
|
|||||||
before do
|
before do
|
||||||
# content_type 'text/plain'
|
# content_type 'text/plain'
|
||||||
sleep(1) while Sleep.instance.asleep? && request.path_info != "/livez/sleep"
|
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
|
end
|
||||||
|
|
||||||
get "/" do
|
get "/" do
|
||||||
@ -211,19 +214,13 @@ get "/" do
|
|||||||
end
|
end
|
||||||
|
|
||||||
get "/env", provides: "json" do
|
get "/env", provides: "json" do
|
||||||
|
content_type :json
|
||||||
|
|
||||||
return JSON.pretty_generate ENV.sort.to_h if params.key? "pretty"
|
return JSON.pretty_generate ENV.sort.to_h if params.key? "pretty"
|
||||||
|
|
||||||
JSON.generate ENV.sort.to_h
|
JSON.generate ENV.sort.to_h
|
||||||
end
|
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
|
get "/headers", provides: "json" do
|
||||||
h = req_headers
|
h = req_headers
|
||||||
return JSON.pretty_generate h if params.key? "pretty"
|
return JSON.pretty_generate h if params.key? "pretty"
|
||||||
@ -231,14 +228,6 @@ get "/headers", provides: "json" do
|
|||||||
JSON.generate h
|
JSON.generate h
|
||||||
end
|
end
|
||||||
|
|
||||||
get "/headers" do
|
|
||||||
stream do |out|
|
|
||||||
req_headers.each do |k, v|
|
|
||||||
out << "#{k}: #{v.inspect}\n"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
get "/livez" do
|
get "/livez" do
|
||||||
error 503 unless Health.instance.healthy?
|
error 503 unless Health.instance.healthy?
|
||||||
|
|
||||||
@ -263,6 +252,14 @@ post "/livez/sleep" do
|
|||||||
"ok\n"
|
"ok\n"
|
||||||
end
|
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
|
get "/uuid" do
|
||||||
n = params.fetch(:n, 1).to_i
|
n = params.fetch(:n, 1).to_i
|
||||||
stream do |out|
|
stream do |out|
|
||||||
@ -336,3 +333,42 @@ end
|
|||||||
get "/cookies" do
|
get "/cookies" do
|
||||||
json response.headers
|
json response.headers
|
||||||
end
|
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
|
||||||
|
19
app_test.rb
19
app_test.rb
@ -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
|
|
11
kustomize/app/configmap.yaml
Normal file
11
kustomize/app/configmap.yaml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: toy-configmap
|
||||||
|
namespace: toy
|
||||||
|
annotations:
|
||||||
|
reloader.stakater.com/match: "true"
|
||||||
|
data:
|
||||||
|
CAT: luna
|
||||||
|
|
10
kustomize/app/kustomization.yaml
Normal file
10
kustomize/app/kustomization.yaml
Normal 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
|
58
kustomize/app/rollout.yaml
Normal file
58
kustomize/app/rollout.yaml
Normal 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
17
kustomize/app/secret.yaml
Normal 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
|
@ -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
|
|
@ -3,6 +3,6 @@ apiVersion: kustomize.config.k8s.io/v1beta1
|
|||||||
kind: Kustomization
|
kind: Kustomization
|
||||||
namespace: toy
|
namespace: toy
|
||||||
resources:
|
resources:
|
||||||
- deployment.yaml
|
- namespace.yaml
|
||||||
- services.yaml
|
- ./app
|
||||||
- ingress.yaml
|
- ./memcached
|
||||||
|
21
kustomize/memcached/deployment.yaml
Normal file
21
kustomize/memcached/deployment.yaml
Normal 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
|
7
kustomize/memcached/kustomization.yaml
Normal file
7
kustomize/memcached/kustomization.yaml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
|
namespace: toy
|
||||||
|
resources:
|
||||||
|
- deployment.yaml
|
||||||
|
- services.yaml
|
13
kustomize/memcached/services.yaml
Normal file
13
kustomize/memcached/services.yaml
Normal 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
6
kustomize/namespace.yaml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: toy
|
||||||
|
|
21
spec/app_spec.rb
Normal file
21
spec/app_spec.rb
Normal 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
|
Reference in New Issue
Block a user