Merge pull request #80 from rtyler/79

Store sessions in memcached and support replicas for the webapp
This commit is contained in:
R. Tyler Croy 2017-12-23 15:27:55 -08:00 committed by GitHub
commit 68b1cfae24
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 193 additions and 69 deletions

View File

@ -2,6 +2,18 @@
version: '3'
services:
webapp:
image: 'rtyler/codevalet-webapp:latest'
image: 'codevalet/webapp:latest'
ports:
- 9292:9292
links:
- cache
environment:
- USE_MEMCACHED=true
- SESSION_SECRET=fiddlesticks
- WARDEN_GITHUB_VERIFIER_SECRET=fiddlesticks
cache:
image: 'memcached:alpine'
command: '-v'
ports:
- 11211:11211

View File

@ -15,6 +15,7 @@ items:
selector:
app: 'webapp'
- apiVersion: extensions/v1beta1
kind: Deployment
metadata:
@ -23,7 +24,7 @@ items:
labels:
name: 'webapp'
spec:
replicas: 1
replicas: 3
strategy:
type: RollingUpdate
selector:
@ -54,16 +55,23 @@ items:
value: 'https://codevalet.io/github/authenticate'
- name: GITHUB_CLIENT_ID
value: '790a28783a813e2b2b3c'
- name: MEMCACHED_SERVER
value: 'memcached.webapp.svc.cluster.local'
- name: SESSION_SECRET
valueFrom:
secretKeyRef:
name: 'webapp'
key: 'sessionsecret'
- name: SENTRY_DSN
valueFrom:
secretKeyRef:
name: webapp
key: sentry
name: 'webapp'
key: 'sentry'
- name: GITHUB_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: oauth
key: secret
name: 'oauth'
key: 'secret'
livenessProbe:
httpGet:
path: /
@ -71,6 +79,60 @@ items:
initialDelaySeconds: 60
timeoutSeconds: 10
- apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: 'memcached'
namespace: 'webapp'
labels:
name: 'memcached'
spec:
replicas: 3
strategy:
type: RollingUpdate
selector:
template:
metadata:
labels:
app: 'memcached'
spec:
containers:
- name: 'cache'
image: 'memcached:alpine'
imagePullPolicy: Always
ports:
- containerPort: 11211
name: 'memcached'
resources:
requests:
memory: 64M
limits:
memory: 256M
livenessProbe:
tcpSocket:
port: 'memcached'
initialDelaySeconds: 30
timeoutSeconds: 5
readinessProbe:
tcpSocket:
port: 'memcached'
initialDelaySeconds: 5
timeoutSeconds: 1
- apiVersion: v1
kind: Service
metadata:
name: 'memcached'
namespace: 'webapp'
spec:
clusterIP: None
ports:
- port: 11211
targetPort: 'memcached'
protocol: TCP
selector:
app: 'memcached'
- apiVersion: extensions/v1beta1
kind: Ingress
metadata:

View File

@ -87,7 +87,7 @@ items:
runAsUser: 0
containers:
- name: "jenkins-@@USER@@"
image: "rtyler/codevalet-master:latest"
image: "codevalet/master:latest"
imagePullPolicy: Always
ports:
- containerPort: 80

View File

@ -1,12 +1,28 @@
source 'https://rubygems.org'
# Web framework, yey
gem 'sinatra'
gem 'haml'
gem 'warden-github'
gem 'kramdown'
gem 'sentry-raven'
# The actual webserver
gem 'puma'
# For rendering all the views
gem 'haml'
# Provides some semblance of github-based authentication and authorization
# within the rack app
gem 'warden-github'
# Responsible for markdown parsing in the webapp views
gem 'kramdown'
# Send exceptions into Sentry from the app
gem 'sentry-raven'
# For memcached access
gem 'dalli'
gem 'rack-cache'
group :test do
gem 'rspec'
end

View File

@ -9,6 +9,7 @@ GEM
addressable (2.5.1)
public_suffix (~> 2.0, >= 2.0.2)
concurrent-ruby (1.0.5)
dalli (2.7.6)
diff-lcs (1.3)
faraday (0.12.2)
multipart-post (>= 1.2, < 3)
@ -25,6 +26,8 @@ GEM
public_suffix (2.0.5)
puma (3.10.0)
rack (2.0.3)
rack-cache (1.7.1)
rack (>= 0.4)
rack-protection (2.0.0)
rack
rspec (3.6.0)
@ -66,13 +69,15 @@ PLATFORMS
ruby
DEPENDENCIES
dalli
haml
kramdown
puma
rack-cache
rspec
sentry-raven
sinatra
warden-github
BUNDLED WITH
1.15.3
1.16.0

View File

@ -1,9 +1,13 @@
#!/usr/bin/env ruby
require 'securerandom'
require 'yaml'
require 'dalli'
require 'haml'
require 'rack/session/dalli'
require 'sinatra/base'
require 'warden/github'
require 'yaml'
Haml::TempleEngine.disable_option_validator!
@ -24,11 +28,24 @@ module CodeValet
include Warden::GitHub::SSO
enable :sessions
set :session_secret, ENV.fetch('SESSION_SECRET') { SecureRandom.hex(64) }
enable :raise_errors
disable :show_exceptions
if ENV['PRODUCTION']
disable :show_exceptions
end
set :public_folder, File.dirname(__FILE__) + '/assets'
configure do
if ENV['PRODUCTION'] || ENV['USE_MEMCACHED']
use Rack::Session::Dalli,
:namespace => 'webapp.sessions',
:cache => Dalli::Client.new(ENV.fetch('MEMCACHED_SERVER') { 'cache:11211' })
end
end
use Warden::Manager do |config|
config.failure_app = AuthFailre
config.default_strategies :github

View File

@ -3,86 +3,95 @@
{
:name => 'Ubuntu 16.04',
:labels => ['ubuntu', 'linux', 'docker'],
:capabilities => '',
:capabilities => ['Docker-enabled'],
},
{
:name => 'FreeBSD 11.1',
:labels => ['freebsd', 'bsd'],
:capabilities => '',
:capabilities => [],
},
]
.container
.col-md-10
.row
%h2
Overview
.container
.row
%p
Code Valet is powered by
%a{:href => 'https://jenkins.io'}
Jenkins&reg; 2
with
%a{:href => 'https://jenkins.io/doc/book/pipeline'}
Jenkins Pipeline.
.col-lg-12
%h2
Overview
%p
Code Valet is powered by
%a{:href => 'https://jenkins.io'}
Jenkins&reg; 2
with
%a{:href => 'https://jenkins.io/doc/book/pipeline'}
Jenkins Pipeline.
.row
%h3
Features enabled
:markdown
The current list of features enabled on Code Valet, which can be
used in a `Jenkinsfile` are:
.col-lg-12
%h3
Features enabled
%p
:markdown
The current list of features enabled on Code Valet, which can be
used in a `Jenkinsfile` are:
* XML (JUnit) test reporting integration via the `junit` step.
* Embedded status badges, such as: [![Build Status](https://codevalet.io/u/codevalet/job/CodeValet/job/codevalet/job/master/badge/icon)](https://codevalet.io/u/codevalet/blue/organizations/jenkins/CodeValet%2Fcodevalet/activity)
* XML (JUnit) test reporting integration via the `junit` step.
* Embedded status badges, such as: [![Build Status](https://codevalet.codevalet.io/job/codevalet/job/master/badge/icon)](https://codevalet.codevalet.io/job/codevalet/job/master/)
.row
%h2
Platforms
.col-lg-12
%h2
Platforms
.container
.row
%p
Code Valet provides ephemeral execution environments, dedicated to
each user or organization. This provides the best trade-off between
performance and reliability using the tools currently available.
%p
%table.table
%thead
%p
Code Valet provides ephemeral execution environments, dedicated to
each user or organization. This provides the best trade-off between
performance and reliability using the tools currently available.
%p
%table.table
%thead
%tr
%th
Platform
%th
Capabilities
%th
Example
%code
Jenkinsfile
%tbody
- platforms.each do |p|
%tr
%th
Platform
%th
Capabilities
%th
Example
%tbody
- platforms.each do |p|
%tr
%td
%td
%p
%strong= p[:name]
%p
Labels:
%ul
- p[:labels].each do |label|
%li
%code= label
%td
= p[:capabilities]
%td
%pre
%code
:plain
pipeline {
agent { label '#{p[:labels].first}' }
stages {
stage('Build') {
steps {
sh 'uname -a'
sh 'cat /etc/issue'
}
%td
- p[:capabilities].each do |cap|
%p
= cap
%td
%pre
%code
:plain
pipeline {
agent { label '#{p[:labels].first}' }
stages {
stage('Build') {
steps {
sh 'uname -a'
sh 'cat /etc/issue'
}
}
}
}

View File

@ -38,8 +38,11 @@
%a.dropdown-item{:href => "https://#{monkey}.codevalet.io/blue"}
= monkey
.row
.col-md-12
%img.img-fluid{:src => '/images/create-new-pipeline.png'}
.col-lg-12.text-center
%iframe{:width => 800, :height => 400, :frameborder => 0, :gesture => :media,
:allow => 'encrypted-media', :allowfullscreen => '',
:src => 'https://www.youtube-nocookie.com/embed/FhDomw6BaHU'}
%img.img-fluid{:src => '/images/create-new-pipeline.png'}
.row
.col-md-12