Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ember.js, DevOps, and You - Wicked Good Ember 2016
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Iheanyi Ekechukwu
June 28, 2016
Programming
1
990
Ember.js, DevOps, and You - Wicked Good Ember 2016
My talk on DevOps and Ember.js given at Wicked Good Ember 2016.
Iheanyi Ekechukwu
June 28, 2016
Tweet
Share
More Decks by Iheanyi Ekechukwu
See All by Iheanyi Ekechukwu
Building a Canary Testing Framework
iheanyi
0
540
gRPC and Protobufs - JSCamp Romania
iheanyi
0
340
Ember.js, DevOps, and You - NPM Camp 2016
iheanyi
0
590
Ember.js, DevOps, and You - MadisonRuby 2016
iheanyi
0
290
Intro to Ember.js and Ember-CLI - ThunderPlainsConf 2015
iheanyi
0
320
Intro to Ember.js and Ember-CLI - Front Porch 2015
iheanyi
0
780
Ember.js and Ember-CLI
iheanyi
5
610
Other Decks in Programming
See All in Programming
Go1.26 go fixをプロダクトに適用して困ったこと
kurakura0916
0
370
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
110
米国のサイバーセキュリティタイムラインと見る Goの暗号パッケージの進化
tomtwinkle
2
560
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
260
コードレビューをしない選択 #でぃーぷらすトウキョウ
kajitack
3
900
AIとペアプロして処理時間を97%削減した話 #pyconshizu
kashewnuts
1
220
go directiveを最新にしすぎないで欲しい話──あるいは、Go 1.26からgo mod initで作られるgo directiveの値が変わる話 / Go 1.26 リリースパーティ
arthur1
2
540
nilとは何か 〜interfaceの構造とnil!=nilから理解する〜
kuro_kurorrr
3
1.9k
AI時代のシステム設計:ドメインモデルで変更しやすさを守る設計戦略
masuda220
PRO
5
900
ふつうのRubyist、ちいさなデバイス、大きな一年 / Ordinary Rubyists, Tiny Devices, Big Year
chobishiba
1
430
CSC307 Lecture 14
javiergs
PRO
0
470
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
2
390
Featured
See All Featured
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
290
The Invisible Side of Design
smashingmag
302
51k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
470
The SEO Collaboration Effect
kristinabergwall1
0
390
Mind Mapping
helmedeiros
PRO
1
120
Become a Pro
speakerdeck
PRO
31
5.8k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.5k
Designing Powerful Visuals for Engaging Learning
tmiket
0
270
Deep Space Network (abreviated)
tonyrice
0
89
Building the Perfect Custom Keyboard
takai
2
710
How to Talk to Developers About Accessibility
jct
2
150
Bash Introduction
62gerente
615
210k
Transcript
Ember.js, DevOps, and You Iheanyi Ekechukwu Wicked Good Ember 2016
Iheanyi Ekechukwu Software Engineer @ DigitalOcean @kwuchu
Defining DevOps What exactly is DevOps?
DevOps?
None
DevOps.
Development + Operations
DevOps is deploying.
DevOps is provisioning.
DevOps is versioning.
DevOps is complicated.
Automation is
Ember.js and DevOps What do Ember.js and DevOps have to
do with one another?
None
Ember-CLI-Deploy Plugins
An Ember-CLI-Deploy Plugin can implement up to 11 hooks
None
So, it doesn’t just deploy.
Ember-CLI-Deploy can provision.
Ember-CLI-Deploy can build.
Ember-CLI-Deploy can deploy.
Ember-CLI-Deploy can manage releases.
Ember-CLI-Deploy
Ember-CLI-DevOps
Building a Plugin
Create the Ember addon and install the Ember-CLI-Deploy base plugin.
STEP ONE
ember addon ember-cli-deploy-digitalocean
cd ember-cli-deploy-digitalocean npm install ember-cli-deploy-plugin --save
STEP TWO Manually deploy a Fastboot application, taking note of
each action. (Provisioning, Deployment, etc.)
Let’s go through the steps.
Create a Droplet.
SSH into the droplet.
Install Nginx, Node, NPM, and Ember-Fastboot-Server on droplet
On local machine, build the Fastboot application.
SCP the built Ember application onto the droplet
On droplet, go to the uploaded app and run the
Fastboot application.
Configure Nginx to proxy over the Fastboot’s server’s port and
serve static assets.
Reload Nginx.
And you’re done.
STEP THREE Translate each recorded step into code. (Automation)
None
Automation Problems and Solutions
PROBLEM How do I create a droplet for the user?
SOLUTION Use DigitalOcean’s API and create an Ember command that
creates the droplet.
None
export DO_ACCESS_TOKEN=<token>
ember do:provision
None
PROBLEM Installing all software dependencies on the droplet. (Provisioning)
WITHOUT FASTBOOT One package dependency. Web Server (NGINX) serves the
static assets.
WITH FASTBOOT More dependencies. It’s not only NGINX. We now
need Node, NPM, and Fastboot.
SOLUTION DigitalOcean Images and execution of commands via Node SSH2.
None
this.conn = new SSHClient(); this.sshConfig = { host: config.ipAddress, port:
22, username: config.dropletUsername, privateKey: require('fs').readFileSync(config.privateKeyPath), password: config.dropletPassword, passphrase: config.passphrase, };
willUpload: function() { var conn = this.conn; conn.on('ready', () =>
{ conn.exec(‘sudo apt-get update -y; sudo apt-get upgrade -y; sudo apt-get install -y nginx gcc build- essential; rm /etc/nginx/sites-enabled/default', (err, stream) => { if (err) throw err; stream.on('data', (data) => { this.log('STDOUT: ' + data); }).on('end', (data) => { resolve(); }); }) }).connect(this.sshConfig); })
PROBLEM How do I build my Ember application and get
it onto the droplet?
SOLUTION Use ember-cli-deploy-build to build the application, NPM install dependencies,
then SCP files onto the droplet.
None
configure: function() { //… this.scpConfig = { host: config.ipAddress, port:
22, username: process.env.DROPLET_USERNAME || 'root', privateKey: require('fs').readFileSync(process.env.PRIVATE_KEY_DIR), password: process.env.DROPLET_PASSWORD, passphrase: process.env.PASSPHRASE, path: '/etc/nginx/sites-enabled/ember-app' }; this.scpClient = SCPClient; },
willUpload: function(context) { var npmInstallTask = new NPMInstallTask({ log: this.log.bind(this),
distDir: context.distDir }); return npmInstallTask.run() // more code down here }
upload: function(context) { this.log('Uploading assets to the droplet!'); var scpClient
= this.scpClient; return new Promise((resolve, reject) => { scpClient.scp(context.distDir, this.scpConfig, (err) => { if (err) { throw err; } //… return resolve(); }); }); },
context.distDir
PROBLEM What if my droplet restarts and kills the Fastboot
server?
SOLUTION Create a Fastboot Upstart Service on the droplet.
description "A job file for starting up the Fastboot service
for Ember." author "Iheanyi Ekechukwu" start on filesystem or runlevel [2345] stop on shutdown pre-start script npm install -g ember-fastboot-server echo "Starting Fastboot server" >> /var/log/fastboot.log end script script export HOME echo $$ > /var/run/fastboot.pid exec ember-fastboot /etc/nginx/sites-enabled/ember-app >> /var/log/fastboot.log 2>&1 end script pre-stop script rm /var/run/fastboot.pid echo "Fastboot Server Stopping" >> /var/log/fastboot.log end script
didUpload: function(context) { // other code…upload fast boot fileClient.upload('./node_modules/ember-cli- deploy-digitalocean/templates/fastboot.conf',
'/ etc/init/fastboot.conf', err => { if (err) { this.log(err, {color: 'red'}); throw err; } // other code… });
PROBLEM How do I get the application up and served
up to the user?
SOLUTION Upload a custom NGINX config and restart everything.
http { include /etc/nginx/mime.types*; default_type application/octet-stream; sendfile on; tcp_nopush on;
tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; server { listen 80; root /etc/nginx/sites-enabled/ember-app; index index.html index.html; server_name localhost; location / { index index.html; proxy_pass http://127.0.0.1:3000; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; } location ~ \.(ttf|ttc|otf|eot|woff|font.css|css)$ { add_header Access-Control-Allow-Origin "*"; } location /assets { autoindex on; } } }
didUpload: function(context) { // upload nginx conf, other code left
out fileClient.upload('./node_modules/ember-cli-deploy-digitalocean/ templates/nginx.conf', '/etc/nginx/nginx.conf', (err) => { if (err) { this.log(err); throw err; } return resolve(); }); // other code… }
didUpload: function(context) { // restart nginx and fastboot service, other
code left out conn.exec("sudo service nginx restart; sudo service fastboot restart;", (err, stream) => { if (err) throw err; stream.on('data', (data) => { this.log('STDOUT: ' + data); }).on('end', (data) => { this.log("We're in business!"); return resolve(); }).stderr.on('data', (data) => { this.log('STDERR: ' + data); }); }); }
And we’re done automating.
None
One small NPM trick that makes building deploy plugins easier…
None
g
None
ember-cli-deploy-digitalocean (github.com/iheanyi/ember-cli-deploy- digitalocean)
Plugin Limitations
Deploys limited to one droplet.
Provisioning tasks get re-run unnecessarily.
No controlled release management.
Old Fastboot Serving Logic
Ideas for Future Enhancements
Zero Downtime Deployments
SSL Support?
Semantic Versioning (semantic-release)
The Future of DevOps?
None
+ ?
None
Thanks to… @tomdale @lukemelia @davidpett @digitalocean and others!
Thank you. @kwuchu