Categories
PHP

PHP build và deploy với Jenkins và Docker

7.jenkins-dashboard
Bạn thường deploy code bằng cách nào? Sử dụng FTP để drag & drop file từ máy lên server? Hôm nay mình sẽ chia sẻ cho mọi người một cách deploy code bài bản hơn một chút nhờ sử dụng Jenkins. Ngoài ra, Bài viết cũng tập trung cho các dự án code bằng PHP và có sử dụng một số đồ chơi để phân tích code PHP khi build. Nối tiếp chuỗi bài viết về Docker, bài viết này cũng sẽ hướng dẫn chạy Jenkins trên môi trường Docker.

Jenkins là gì

Nếu như các bạn có quan tâm đến các kỹ thuật CI/CD thì sẽ không thể không biết đến “anh đại” Jenkins. Jenkins là một bộ phần mềm viết bằng Java và hỗ trợ rất mạnh mẽ việc build và deploy code trong quá trình triển khai code lên các môi trường mà bạn đang làm việc như test, beta, production…

Trước đây, để cài đặt một server Jenkins thì đỏi hỏi khá nhiều công sức và khá rắc rối khiến cho nhiều anh chị em bỏ cuộc nữa chừng, khiến cho việc tiếp cận với các đồ chơi của Jenkins bị hạn chế. Và trước đây mình cũng nhiều lần cài đặt Jenkins và cũng vọc nhưng cũng không thấy mặn mà lắm vì mỗi lần cài đặt, setup khá vất vả.

Tuy nhiên, nhờ sự trợ giúp của Docker, ngày nay, việc cài đặt Jenkins là một trải nghiệm “sung sướng”. Chỉ cần pull image chính thức của Jenkins và làm theo một số chỉ dẫn tại https://hub.docker.com/_/jenkins/ là đã nhanh chóng dựng được Jenkins để trải nghiệm quá trình build và deploy code nhanh chóng.

Jenkins và PHP

Mục tiêu của phần này giới thiệu đến mọi người một Jenkins Docker image mà mình xây dựng riêng cho các dự án hằng ngày là tích hợp sắn các phần mềm và plugin kèm theo trong jenkins cho PHP. Image này mình có public trên docker hub, có tên là “voduytuan/jenkins-php-docker”.

Một số đồ chơi PHP cài thêm cho server này là:
– Toàn bộ đồ chơi tại http://jenkins-php.org (loại trừ phpdox mình không xài nên không cài)
– Xdebug extension để generate code coverage report
– Jenkins Git plugin để pull code từ repo Github hoặc Bitbucket..
– Jenkins Push Over SSH plugin để deploy code lên server
– Docker bên trong jenkins (^^!) để build các image và push lên private registry cho các dự án microservice
Các bạn có thể tham khảo Dockerfile để biết thêm các đồ chơi mình cài cũng như có thể tạo riêng cho mình một image với các đồ chơi theo nhu cầu của bạn.

Bạn có thể start Jenkins bằng câu lệnh sau:
~ > docker run -d --name jenkins -p 9090:8080 -v /data/jenkins/jenkins-php-docker:/var/jenkins_home:rw voduytuan/jenkins-php-docker

Hướng dẫn tham số:
– “-v /data/jenkins/jenkins-php-docker:/var/jenkins_home:rw”: Một tham số cần lưu ý là mount volume thư mục data của jenkins (/var/jenkins_home). Đây là toàn bộ dữ liệu của Jenkins trong quá trình sử dụng. Ở đây mình mount vào thư mục /data/jenkins/jenkins-php-docker trên máy. Bạn có thể để thư mục “jenkins-php-docker” là rỗng hoặc clone từ repo của mình (https://github.com/voduytuan/jenkins-php-docker) để có sẵn một template tên là “php-template” để sau này khi tạo project thì sử dụng template để tạo nhanh các cấu hình build dự án. Lưu ý việc phân quyền user cho thư mục bạn mount volume. Đơn giản nhất là cứ quyền 0777.

Sau khi chạy docker run, chờ một thời gian (một vài phút tùy server) để Jenkins khởi động và bạn có thể truy cập đến Jenkins thông qua IP của server và port bạn khai báo (vd: 9090). Nếu thành công, bạn sẽ thấy màn hình như bên dưới:

0.jenkins-plain
Dashboard của Jenkins

Khởi tạo Jenkins

Khi chạy Jenkins lần đầu thì Jenkins hoàn toàn không có một cơ chế bảo mật nào hết và cho phép truy cập ẩn danh. Bạn có thể làm theo 1 số thao tác đơn giản sau để tạo tài khoản Admin và phân quyền lại cho an toàn hệ thống.

1.jenkins-firststep
Manage Jenkins

Vào Manage Jenkins > Configure Global Security và chỉnh như hình bên dưới để cho phép tạo tài khoản:

2.jenkins-config-global-security
Configure Global Security

Sau khi cấu hình, nhấn lưu thì góc trên bên phải sẽ hiện link đăng ký, và đăng nhập. Tiến hành đăng ký tài khoản đầu tiên.

3.jenkins-create-user
Jenkins create new user

Sau khi tạo tài khoản và đăng nhập vào, bạn quay lại trang “Configure Global Security” để cấu hình như bên dưới.

4.jenkins-config-global-security-matrix-permission
Configure Global Security

(Nội dung thay đổi là bỏ cho phép đăng ký và chọn hình thức Authorization là Matrix-based security và add user bạn vừa tạo vào bảng phân quyền, đồng thời chọn hết các quyền cho user này, sau đó nhấn Apply và Save để hoàn tất quá trình thay đổi.

Ngoài ra, cũng trong trang này, phần “Markup Formatter” chọn là “Raw HTML” để trong trang dự án hiển thị HTML được trong phần “Description”.

Với tài khoản hiện tại, bạn có thể tạo tài khoản cho các thành viên khác có nhu cầu sử dụng hệ thống và phân quyền theo nhu cầu của bạn. Bài viết sẽ không đi sâu vào hướng dẫn phân quyền, bạn có thể tham khảo trên google hoặc trên trang web chính thức của Jenkins.

Sau khi quyền hạn và cài đặt đã xong, bạn tiến hành tạo project để thực hiện CI/CD cho dự án của mình.

Tạo project và tiến hành build

– Tạo một project mới và đặt tên tùy ý và với template mẫu là “php-template” (nếu bạn thư mục mount có project đã clone từ repo của mình hướng dẫn). (Xem hình)

5.jenkins-new-project
Create new project in Jenkins

Nhấn OK để tạo và đến trang cấu hình của dự án này. Trang cấu hình là trang quan trọng nhất của dự án bởi nó sẽ giúp bạn cài đặt các thao tác cho dự án này.

6.jenkins-project-configuration
Project Configuration

Có 3 bước cơ bản (quan trọng) trong trang cấu hình bạn cần biết là:
1. SCM: Bạn cần link đến repo source code của bạn. Mặc định Jenkins ko hỗ trợ Git, nhưng bản Docker image của mình đã cài Git plugin nên bạn có thể cấu hình liên kết đến các Git repo (github, bitbucket…). Ví dụ cấu hình Git:

12.jenkins-scm
Git SCM

2. Build: dùng để cấu hình, chọn các cách thức build dự án. Ở template “php-template” thì mình build bằng Apache Ant (thông qua file build.xml tại thư mục gốc của sourcecode – mình sẽ share file build.xml mẫu cho một dự án php ở cuối bài).

3. Post-build action: là các thao tác được thực hiện. Đó có thể là phân tích các file output (xml, json..) từ bước build tạo ra và tạo các report, hoặc là SSH vào remote server để deploy code, thực hiện một câu lệnh nào đó hoặc build một docker image mới rồi push lên repo sau khi build success. Có rất nhiều plugin của Jenkins hỗ trợ nhiều khía cạnh build khác nhau. Có thể tham khảo thêm trên Jenkins plugin. Hình chụp một số Post-build action trong dự án của mình:

Post build Action vẽ biểu đồ
Post build Action vẽ biểu đồ

Post build action Push Over SSH
Post build action Push Over SSH

Một số kết quả generate từ các post-build action theo template mẫu “php-template”:

8.project-dashboard
Jenkins Project Dashboard
9.jenkins-code-coverage
PHPUnit Code Coverage Report
10.jenkins-plot
Jenkins Plot
10.jenkins-jdepend
JDepend Report

Bạn có thể tìm hiểu thêm tại http://jenkins-php.org/ để hiểu rõ về cách đọc các report về ứng dụng PHP của bạn.

Hy vọng những chia sẻ về Jenkins này sẽ giúp bạn nhanh chóng và dễ dàng triển khai Jenkins cho hệ thống của mình để quá trình build và deploy code được tự động, nhanh chóng và an toàn hơn.


Cấu trúc thư mục của dự án Apitoy để mọi người hiểu hơn về các đường dẫn trong file config.
apitoy-directory
File sample build.xml dùng cho Ant cho dự án của mình, chia sẻ để mọi người tham khảo.

Trong file build.xml có sử dụng 2 file xml khác cho phpmd và phpunit. 2 file này cũng được chia sẻ bên dưới.

Categories
Business PHP Tech Startup Web Programming

Reader.vn (2011 – 2014)

readervn-mang-xa-hoi-sach-viet-nam-2011-2014

“Lùi một bước trời cao đất rộng” là câu mình hay nói với mọi người khi gặp một vấn đề khó, bởi khi có một góc nhìn rộng hơn, với nhiều thông tin hơn dù cho phải lùi lại một bước thì cũng đáng phải làm vì điều này sẽ giúp ích được nhiều khi ra các quyết định. Reader.vn là một dự án “thú cưng” của mình từ 2011, đến này đã chạy hơn 3 năm 6 tháng và có trên 40,000 thành viên và hơn 50,000 đầu sách. Tuy nhiên, do hiện tại có một số “sóng gió” nên mình đóng cửa mạng xã hội này để chờ thời cơ ra mắt một Reader.vn mới.

Categories
PHP Web Programming

Xây dựng hệ thống load balancer cho web

load-balancer

Dạo này với xu hướng mọi người bắt đầu làm Tech startup ngày càng nhiều (cụ thể là web & app startup), tuy nhiên do chưa có kinh nghiệp triển khai kiến trúc server nên đôi khi các bạn đâu đó sẽ gặp tình huống khóc dỡ là web quá nhiều lượt truy cập (có thể do chạy campaign hoặc ngày ra mắt…) làm cho web bị treo vì không trở tay kịp.

Mình viết bài này với hy vọng các anh chị em tech startup hoặc anh chị em IT chịu trách nhiệm lo về phần scaling cho website có một chút thông tin về xây dựng hệ thống Load balancer phòng trường hợp server quá tải.

Categories
PHP

PHP Test và câu chuyện phỏng vấn

php-test-va-cau-chuyen-phong-van

Hôm qua vừa kết thúc một đợt phỏng vấn nhỏ để tuyển PHP dev cho các dự án của công ty, có một số điều thấy cần phải chia sẻ về buổi phỏng vấn này đến các bạn đồng đạo cũng như những bâng khuâng về các kiến thức mà các bạn vừa ra trường và nhận là có 1,2 năm kinh nghiệm.

Số là hôm qua, vừa chạy xe vừa nghĩ là nên cho một vài bài test để test một số kỹ năng cần thiết của các bạn ứng tuyển vị trí php developer. Một số kỹ năng mà mình muốn các bạn thể hiện được là có kiến thức về PHP ở mức sâu một tí và khả năng xoay sở tình huống, cách giải quyết vấn đề khi thời gian eo hẹp. Và dưới đây là 5 câu hỏi trong bài test của mình sáng qua:

Categories
PHP Web Programming

Cài đặt Web Server cho Amazon EC2 Instance [Video Clip]

cai-dat-web-server-cho-amazon-ec2-instance

Đã lâu không viết blog, nay mình trở lại với bài viết hướng dẫn cài đặt một LAMP Stack hoàn chỉnh cho 1 Amazon EC2 Instance. Mình đã quay clip lại quá trình khởi tạo Instance cũng như cài đặt các phần mềm cần thiết cho Web Server.

Một số phần mềm đã cài cho Web Server là: Apache, PHP, MySQL, FTP cũng như các cấu hình FTP, Apache hỗ trợ virtual host…

Categories
Business PHP Web Programming

Barcamp Saigon 2012 – Summer

barcamp-saigon-2012

Chào mọi người, thế là đã sắp tới barcamp saigon 2012 (mùa hè). Đợt cuối năm vừa rồi thật tiếc là không có thời gian tham gia để chia sẻ với các bạn các kinh nghiệm của mình như các lần barcamp trước. Năm nay, mình nhất định tham gia cũng với tinh thần chia sẻ kiến thức của mình đến các bạn đồng đạo dev.

Năm nay, với xu hướng các bạn làm khởi nghiệp (startup) nhiều, và tình hình kinh tế khó khăn khiến việc duy trì các dự án online dường như là một gánh nặng cho các doanh nghiệp làm online. Kéo dài sự sống của website qua mùa mưa bão là điều rất cần thiết cho các bạn trong thời điểm này, một trong những cách kéo dài sự sống của 1 dự án online là giảm thiểu tối đa chi phí duy trì website.

Categories
PHP Security

Suhosin, Cookie và bug

suhosin-cookie-bug

Dạo này tự nhiên thấy cái tính năng toggle grid view/table view (http://reader.vn/book.php) tự nhiên không chạy, vô xem code thì thấy mình hoàn toàn không động chạm chức năng này từ dạo ấy, chả hiểu sao nó không chạy, thế là tối nay quyết tâm debug xem nó bị gì.

Categories
PHP Web Programming

Hội thảo: Heavy Web Optimization – Back-end

hoi-thao-heavy-web-optimization--back-end

Chào mọi người, cuối cùng thì cũng hoàn tất khâu chuẩn bị cho buổi hội thảo mình rất trông chờ từ bấy lâu nay để chia sẻ tới các bạn những kinh nghiệm tối ưu Back-end của mình trong quá trình làm dự án.

Hôm nay, mình rất vui mừng thông báo là buổi hội thảo về Backend có thể diễn ra để tiếp nối sự kiện tối ưu cho website. Tối ưu backend có rất nhiều việc cần quan tâm như tối ưu code (PHP), database, cache và những kỹ thuật profiling để tìm ra bottleneck trong ứng dụng của bạn. Tối ưu backend sẽ giúp bạn tiết kiệm khá nhiều chi phí vận hành server và mang lại hiệu suất xử lý cao hơn cho hệ thống với kinh phí thấp nhất.

Trong buổi hội thảo sắp tới mình sẽ chia sẻ một số kinh nghiệm về:

Categories
Android PHP Web Programming

SQLite với PDO và PHP

Tối nay nhân có chút thời gian vừa quay lại một vài dòng code xử lý trên database SQLite trên PHP bằng PDO nên tranh thủ viết vài dòng chia sẻ với các bạn một tí xíu kinh nghiệm làm việc với sqlite của mình.

Giới thiệu sơ cho những ai chưa biết SQLite là gì thì đó là 1 dạng cơ sở dữ liệu quan hệ (giống MSSQL, MySQL…), có cấu trúc table, cột, dòng, query để lấy thông tin như truy vấn SQL bình thường. Có một điểm khác biệt là SQLite chỉ nằm gọn trong 1 file duy nhất. Bạn có thể tìm hiểu thêm về SQLite tại http://www.sqlite.org.

Categories
PHP

APC và Segmentation Fault

apc-segmentation-fault

Số là đang cần cài APC cho con VPS Kloxo cùi bắp để test. Theo như quy trình bình thường thì mình cũng cài đặt xong ông thần APC lên con VPS này (mặc dù có gặp vài trắc trở). Những tưởng cài APC xong thì mình tha hồ làm việc như bình thường nhưng …bùm..truy cập trang web thì bị một hiện tượng rất là khó hiểu từ trước đến giờ, đó là ra trang lỗi trên Chrome và trên Firefox thì cho download luôn file .php mà không có nội dung.