Igor Suvorov
Программист-предприниматель
Занятие 13
21 May 2017
Профессия
Node.js & React.js developer
продвинутый курс
настройка для production
чем не является webpack
import { Button } from 'react-bootstrap';
import './style.css';
const data = require('raw!./file.txt')
function render(params) {
const view = require("./buttons.jade");
...
return data.split('\n').join('<br/>');
}
if (__DEV__) {
console.log('LOG');
connectToSSH('#password')
}
import Hello from '~/components/Hello';
class WebpackConfig {
getConfig() {}
}
class WebpackClientConfig extends WebpackConfig {
}
class WebpackServerConfig extends WebpackConfig {
}
class WebpackWidgetConfig extends WebpackClientConfig {
}
class extends
getPreConfig() {
return {
context: this.resolvePath('src'),
target: this.getTarget(),
entry: this.getEntry(),
resolve: this.getResolve(),
output: this.getOutput(),
module: this.getModule(),
plugins: this.getPlugins(),
cache: this.isDebug(),
debug: this.isDebug(),
stats: this.getStats(),
postcss: (...args) => this.getPostcssModule(...args),
}
}
getLoaders() {
return [
this.getJsxLoader(),
...this.getCssLoaders(),
{
test: /\.json$/,
loader: 'json-loader',
},
{
test: /\.(png|jpg|jpeg|gif|svg|woff|woff2)(\?.+)?$/,
loader: 'url-loader',
query: {
name: this.isDebug() ? '[path][name].[ext]?[hash]' : '[hash].[ext]',
limit: 10000,
},
},
{
test: /\.(eot|ttf|wav|mp3)(\?.+)?$/,
loader: 'file-loader',
query: {
name: this.isDebug() ? '[path][name].[ext]?[hash]' : '[hash].[ext]',
},
},
]
}
{
test: /\.global\.css$/,
loaders: [
'isomorphic-style-loader',
`css-loader?${JSON.stringify({
sourceMap: this.isDebug(),
modules: false,
minimize: !this.isDebug(),
})}`,
],
},
{
test: /\.css$/,
exclude: /(global.css)/,
loaders: [
'isomorphic-style-loader',
`css-loader?${JSON.stringify({
sourceMap: this.isDebug(),
modules: true,
localIdentName: this.isDebug() ? '[name]_[local]_[hash:base64:3]' : '[hash:base64:4]',
minimize: !this.isDebug(),
})}`,
'postcss-loader?pack=default',
],
},
getGlobals() {
return {
'process.env.NODE_ENV': JSON.stringify(this.getEnv()),
__ENV__: JSON.stringify(this.getEnv()),
__DEV__: this.getEnv() === 'development',
__PROD__: this.getEnv() === 'production',
}
}
getTarget() {
return 'web'
}
getEntry() {
return './client.js'
}
getGlobals() {
return {
...super.getGlobals(),
__SERVER__: false,
__CLIENT__: true,
__BROWSER__: true,
}
}
ProvidePlugin
тюнинг
компиляция webpack.config.js: ~/build/wepack.config.js
stats-webpack-plugin && webpack-bundle-analyzer
Text
web:
image: node:5.4.0
restart: always
command: /bin/bash -c "npm install && npm start"
mem_limit: 100000000
volumes:
- ../../node_modules/:/app/node_modules/
- ../../gizobi_frontend/:/app/src/
- ../../gizobi_frontend/node_modules:/app/src/node_modules
ports:
- "8022:8080"
environment:
PORT: 8080
ENV: production
SITE_URL: http://gizobi.immuzov.ru
working_dir: /app/src
web:
image: node:5.4.0
restart: always
command: /bin/bash -c "npm install && npm start"
mem_limit: 100000000
volumes:
- ../../node_modules/:/app/node_modules/
- ../../gizobi_frontend/:/app/src/
- ../../gizobi_frontend/node_modules:/app/src/node_modules
ports:
- "8022:8080"
environment:
PORT: 8080
ENV: production
NODE_ENV: production
SITE_URL: http://gizobi.immuzov.ru
working_dir: /app/src
api:
image: node:5.4.0
restart: always
command: /bin/bash -c "npm install && npm start"
mem_limit: 100000000
volumes:
- ../../node_modules/:/app/node_modules/
- ../../gizobi_backend/:/app/src/
- ../../gizobi_backend/node_modules:/app/src/node_modules
ports:
- "8023:8080"
environment:
PORT: 8080
ENV: production
NODE_ENV: production
working_dir: /app/src
# Dockerfile
FROM node:6.9.2
WORKDIR /app
ADD ["./build", "/app"]
CMD ["npm", "start"]
# Dockerfile.build
FROM node:6.9.2
RUN npm i -g yarn
# VOLUME ["/tmp/.cache", "/root/.cache"]
WORKDIR /app
CMD sh -c "echo \"Start\" && \
NODE_ENV=development yarn install && \
NODE_ENV=production yarn run build && \
cd build && NODE_ENV=production yarn install"
# cd .. && \
# cp -R src/public/* build/public
docker run -v /var/run/docker.sock:/run/docker.sock -ti -e TERM tomastomecek/sen
docker ps
docker ps -a
docker rm
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker images
docker images -a
docker images -q
docker images -f dangling=true
docker rmi
docker volume ls
docker volume ls -f dangling=true
docker rmi $(docker images -f dangling=true -q)
docker volume rm $(docker volume ls -f dangling=true -q)
#!groovy
node('master') {
currentBuild.result = "SUCCESS"
try {
stage('Checkout') {
checkout scm
}
stage('Clean previous data') {
sh 'rm -rf build node_modules'
}
stage('Build project') {
sh 'docker build -f ./Dockerfile.build -t lsk-example-build .'
sh 'docker run -v `pwd`:/app lsk-example-build'
sh 'sudo chown -R jenkins:jenkins build node_modules'
}
stage('Creating Docker Image') {
def image = docker.build("lsk-example:${env.BUILD_NUMBER}")
docker.withRegistry('https://hq.mgbeta.ru:5000/', 'docker-registry') {
image.push()
image.push('latest')
}
}
stage('Deploy') {
sshagent(['s3']) {
sh 'cd /projects/lsk && sh refresh.sh'
}
}
stage('Test connection') {
sh 'sleep 30'
httpRequest('http://lsk.mgbeta.ru')
}
stage('Clean build') {
sh 'sudo chown -R jenkins:jenkins build node_modules'
sh 'rm -rf node_modules build'
mail body: "lsk-example Build # ${env.BUILD_NUMBER} - SUCCESS:\nCheck console output at ${env.BUILD_URL} to view the results.",
from: 'ci@mgbeta.ru',
subject: "lsk-example - Build # ${env.BUILD_NUMBER} - SUCCESS!",
to: 'obt195@gmail.com, errors@coder24.ru, shitric2@gmail.com'
}
} catch (err) {
currentBuild.result = "FAILURE"
sh 'sudo chown -R jenkins:jenkins build node_modules'
sh 'rm -rf node_modules build'
mail body: "lsk-example - Build # ${env.BUILD_NUMBER} - FAILURE:\nCheck console output at ${env.BUILD_URL} to view the results.",
from: 'ci@mgbeta.ru',
subject: "lsk-example - Build # ${env.BUILD_NUMBER} - FAILURE!",
to: 'obt195@gmail.com, errors@coder24.ru, shitric2@gmail.com'
throw err
}
}
any questions?
программист-предприниматель
By Igor Suvorov
* Webpack, настройка для Production * Docker * Deployment & CI