composer create-project laravel/laravel laravel-app
cd laravel-app
nano Dockerfile
nano Jenkinsfile
composer create-project laravel/laravel laravel-app
cd laravel-app
nano Dockerfile
nano Jenkinsfile
Hey anh em, hôm nay mình xin chia sẻ 2 công cụ CI/CD mà mình đã học, đã áp dụng vào các project nó giúp ích cho mình như thế.
Thì hôm nay bài viết này, mình sẽ giới thiệu đến đó là Circle CI & Jenkins.
1. CircleCI
CircleCI cho phép tự động hóa trên toàn bộ quy trình của người dùng, từ code building, testing to deployment.
Bạn có thể tích hợp CircleCI với GitHub, GitHub Enterprise và Bitbucket.
CircleCI cũng tổ chức tích hợp liên tục.
Các tính năng chính của CircleCI:
Trang chủ : https://circleci.com/
2. Jenkins
Các tính năng chính của Jenkins:
Xin chào bạn
Bạn đã setup hết cho server trong part 1 ở bài viết Laravel react websocket này chưa, nếu chưa thì quay lại nhé
Hôm nay, mình xin chia sẻ đến bạn phần client, ở đây mình sẽ sử dụng react js để làm ví dụ.
Đầu tiên, mình sẽ tạo một project tên là ' client-app'
Cài đặt một số thư viện liên quan:
Tại file App.js
Tại folder src tạo một component tên là 'Chat.js'
Thế là phía client đã setup xong, bắt đầu test kết quả thôi nào.
Let's go.....! Run lệnh : npm start
Khi màn hình đã hiển thị lên ấn phím f12 và click button Send để check kết quả dưới console nhé...
Yeah..... Thế là có chút gì đó realtime rùi phải không nào.
Hãy lên ý tưởng code một ứng dụng realtime sử dụng Laravel vs React để phát triển thôi.
Good luck....!
Lưu ý: Nếu có lỗi gì hãy cmt ở bài viết này.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3006
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=123456
BROADCAST_DRIVER=pusher
QUEUE_CONNECTION=database
PUSHER_APP_ID=khaitk
PUSHER_APP_KEY=khaitk
PUSHER_APP_SECRET=khaitk
PUSHER_HOST=khaitk
PUSHER_PORT=443
PUSHER_SCHEME=http
PUSHER_APP_CLUSTER=mt1
App\Providers\BroadcastServiceProvider::class,
'pusher' => [
'driver' => 'pusher',
'key' => env( 'PUSHER_APP_KEY' ),
'secret' => env( 'PUSHER_APP_SECRET' ),
'app_id' => env( 'PUSHER_APP_ID' ),
'options' => [
'cluster' => env( 'PUSHER_APP_CLUSTER' ),
'useTLS' => env( 'PUSHER_APP_USETLS' ),
'encryted' => true,
'host' => '127.0.0.1',
'port' => 6001,
'scheme' => 'http',
],
'client_options' => [],
],
'apps' => [
[
'id' => env( 'PUSHER_APP_ID' ),
'name' => env( 'APP_NAME' ),
'key' => env( 'PUSHER_APP_KEY' ),
'secret' => env( 'PUSHER_APP_SECRET' ),
'capacity' => null,
'enable_client_messages' => true,
'enable_statistics' => true,
],
],
Hi mọi người
Bài viết này là kết quả học tập với Node JS và Docker sau một thời gian tìm kiếm, tham khảo nhiều nơi.
Mình khá hứng thú mỗi khi đi học hỏi, tìm tòi một công nghệ mới.
Sau đây là những chia sẻ của mình về project này.
Đầu tiên đó là cấu trúc :
Và các thư viện được cài đặt
- npm install body-parser
- npm install dotenv
- npm install express
- npm install mysql
- Bước 1: Chúng ta tạo và cấu hình file .env
MYSQLDB_USER=root
MYSQLDB_ROOT_PASSWORD=123456
MYSQLDB_DATABASE=nodejs_api
MYSQLDB_LOCAL_PORT=3306
MYSQLDB_DOCKER_PORT=3306
NODE_LOCAL_PORT=6868
NODE_DOCKER_PORT=8080
CLIENT_ORIGIN=http://127.0.0.1:8888
CLIENT_API_BASE_URL=http://127.0.0.1:6868/api
REACT_LOCAL_PORT=8888
REACT_DOCKER_PORT=80
- Bước 2 : Tạo và cấu hình file docker-compose.yml
version: '3.8'
services:
mysqldb:
image: mysql:5.7
restart: unless-stopped
env_file: ./.env
environment:
- MYSQL_ROOT_PASSWORD=$MYSQLDB_ROOT_PASSWORD
- MYSQL_DATABASE=$MYSQLDB_DATABASE
- DB_HOST=mysqldb
- DB_USER=$MYSQLDB_USER
- DB_PASSWORD=$MYSQLDB_ROOT_PASSWORD
ports:
- ${MYSQLDB_LOCAL_PORT}:$MYSQLDB_DOCKER_PORT
volumes:
- db:/var/lib/mysql
networks:
- backend
volumes:
db:
networks:
backend:
- Bước 3 : Tạo và code của file server.js
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const port = process.env.PORT || 3000;
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
let routes = require('./api/routes'); //importing route
routes(app);
app.use(function(req, res) {
res.status(404).send({ url: req.originalUrl + ' not found' });
});
app.listen(port);
console.log('RESTful API server đã bắt đầu: ' + port);
- Bước 4 : Trong folder api ta có những file sau :
routes.js
module.exports = function(app) {
let user = require('./controllers/users.controller');
app.route('/get-users/:userID').get(user.findOne)
app.route('/create-users').post(user.createUser)
app.route('/get-all-users').get(user.findAll)
app.route('/update-user/:userId').put(user.update)
app.route('/delete-user/:userId').delete(user.delete)
};
db.js
const mysql = require('mysql');
const db = mysql.createConnection({
host: process.env.DB_HOST || 'localhost',
user: process.env.DB_USER || 'root',
password: process.env.DB_PASS || '123456',
database: process.env.DB_NAME || 'nodejs_api',
});
module.exports = db;
- Tiếp đến, folder controllers chứa file sau :
app/controllers/users.controller.js
const Users = require('../models/users.model');
exports.findOne = (req, res) => {
Users.findById(req.params.userID, (err, data) => {
if (err) {
if (err.kind === 'not_found') {
res.status(400).send({
message: `Không tìm thấy id : ${req.params.userID}`
})
} else {
res.status(500).send({
message: "Kết quả trả về lỗi ở id : " + req.params.userID
})
}
} else {
res.send(data);
}
})
}
exports.createUser = (req, res) => {
if (!req.body) {
res.status(400).send({
message: "Nội dung gửi lên không được rỗng"
})
}
const user = new Users({
name : req.body.name,
gmail: req.body.gmail,
phone: req.body.phone
})
Users.create(user, (err, data) => {
if (err) {
res.status(500).send({
message: err.message
})
} else {
res.send(data)
}
})
}
exports.findAll = (req, res) => {
Users.getAll((err, data) => {
if (err) {
res.status(500).send({
message: err.message
})
} else {
res.send(data)
}
})
}
exports.update = (req, res) => {
if (!req.body) {
res.status(400).send({
message: "Nội dung không được rỗng"
})
}
Users.updateUser(req.params.userId, new Users(req.body), (err, data) => {
if (err) {
if (err.kind === "not_found") {
return res.status(400).send({
message: `Không tìm thấy User id : ${req.params.userId}`
})
} else {
res.status(500).send({
message: err.message
})
}
} else {
res.send(data)
}
})
}
exports.delete = (req, res) => {
Users.deleteUser(req.params.userId, (err, data) => {
if (err) {
if (err.kind === "not_found") {
return res.status(400).send({
message: `Không tìm thấy User id : ${req.params.userId}`
})
} else {
res.status(500).send({
message: err.message
})
}
}
res.send(data)
})
}
- Và folder models chứa file sau :
app/models/users.model.js
const db = require('./../db');
const Users = function (user) {
this.name = user.name;
this.gmail = user.gmail;
this.phone = user.phone;
}
Users.findById = (userID, result) => {
db.query(`SELECT *
FROM users
WHERE id = ${userID}`, (err, res) => {
if (err) {
return result(err, null);
}
if (res.length) {
return result(null, res[0])
}
result({kind: "not_found"}, null)
})
}
Users.create = (newUsers, result) => {
db.query("INSERT INTO users SET ? ", newUsers, (err, res) => {
if (err) {
return result(err, null)
}
result(null, newUsers)
})
}
Users.getAll = (result) => {
db.query("SELECT * FROM users", (err, res) => {
if (err) {
return result(err, null)
}
result(null, res)
})
}
Users.updateUser = (id, users, result) => {
db.query("UPDATE users SET name = ?, gmail = ?, phone = ? WHERE id = ?", [
users.name, users.gmail, users.phone, id
], (err, res) => {
if (err) {
return result(null, err)
}
if (res.affectedRows == 0) {
return result({kind : "not_found"}, null);
}
result(null, {id : id, ...users})
})
}
Users.deleteUser = (id, result) => {
db.query(`DELETE FROM users WHERE id = ?`, [id], (err, res) => {
if (err) {
return result(null, err)
}
if (res.affectedRows == 0) {
return result({kind : "not_found"}, null);
}
result(res, null)
})
}
module.exports = Users
Bước 5 : Bạn chạy lệnh này để build docker
docker-compose up
Hãy download phần mềm Docker về nhé, để dễ quản lý.
Sau khi build xong, bạn mở MySQL Workbench lên sau khi bạn kết nối thì popup sẽ hiển thị để kết nối tới database
Bạn phải nhập đúng thông tin như trong file .env mà bạn đã cấu hình
Và tạo table users ( id, name, gmail, phone )
Cuối cùng, bạn chạy lệnh này npm start để xem kết quả nhé.
Chúc các bạn thành công.