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
Technology

Triển khai môi trường web bằng Docker

docker introduction

Số là dạo này làm việc và nghiên cứu nhiều về kiến trúc Microservice và đang chuyển toàn bộ kiến trúc sang Microservice. Trong quá trình này, Docker là một công nghệ không thể nào bỏ qua vì Docker sẽ giúp ích rất nhiều trong quá trình triển khai và quản lý các service. Trong phạm vi bài viết này mình sẽ không đi sâu vào chi tiết kiến trúc Microservice cũng như mô tả kỹ về hoạt động của Docker mà sẽ tập trung vào giới thiệu sơ về Docker và dựng một môi trường thực tế dùng Docker để triển khai Web Server cho một website.

Categories
Android Mobile

Quy trình cập nhật app Karaoke Vietnam

karaoke vietnam banner

Sáng nay ngồi cập nhật Vol 54 của Arirang cho ứng dụng Karaoke Vietnam mới phát hiện vậy là cũng gần tròn 4 năm (từ đầu năm 2011) mình theo dự án này. Đây quả là dự án huyền thoại vì chưa có dự án nào mình theo lâu như vậy mà kiếm tiền được từ nó. Sáng nay rảnh rỗi nên viết một bài chia sẻ quy trình mỗi lần cập nhật danh sách bài hát (Vol) mới cho ứng dụng này như thế nào để mọi người coi chơi.

Categories
Miscellaneous

New Year’s Resolution of 2015

Screen Shot 2014-12-31 at 7.47.55 PM

Vậy là còn vài tiếng nữa là kết thúc năm 2014 với quá nhiều thăng trầm. Không biết mọi người như thế nào chứ đối với mình, năm 2014 đúng là một năm đầy thú vị và có những điều sẽ không bao giờ quên trong cuộc đời của mình.

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
Business Technology

Big Data hay Deep Data?

Big data everywhere

Dạo gần đây có nhiều hội, nhóm, diễn đàn và các anh ăn trên, ngồi tróc (CxO) bàn về Big Data nên mình cũng đú theo một bài hy vọng chia sẻ góc nhìn của mình về cái gọi là Big Data này.

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
Tech Startup

7 tháng, chặng đầu gian khổ đã qua

chang-duong-dau-gian-kho

Khi viết những dòng này thì đồng hồ vừa chuyển sang ngày 1/8/2014. Đối với mọi người thì đây cũng chỉ là một mốc bình thường nhưng hôm nay mình tự cho là một ngày đặc biệt và nó đánh dấu chặng đường gian khổ đầu tiên của Spiral. Ngày 31/7 cũng chính là ngày đầu tiên Tuấn mở lời nhờ một số anh em ở lại Overtime vài tiếng để kịp hoàn thành những dự án dây dưa, dang dở.

Categories
Tech Startup

Tháng đầu tiên của một Tech Startup

Thế là đã đúng 1 tháng làm việc kể từ sau Tết, cũng là tháng đầu tiên mình trải qua với Tech startup của mình. Hôm nay, ngồi ghi chú lại những gì đã trải qua trong tháng đầu tiên để sau này có gì còn đọc lại.

Văn Phòng

FB_IMG_1489108274017

Sáng mùng 11 (tức 10/02/2014) team Spiral chính thức đi làm ngày đầu tiên và cũng là ngày khai trương Spiral. Văn phòng Spiral cũng chính là căn nhà thuê của vợ chồng mình ở luôn cho tiện làm việc.

Mặc dù diện tích làm việc của gần 10 con người chưa tới 12m2 nhưng mọi người đều cố gắng và tập trung vào các nhiệm vụ ngắn hạn và dài hạn đã được vạch ra trong quá trình làm việc.

Văn phòng được trang bị một máy in, đường Internet cáp quang để tiện trong việc giải trí và nghiên cứu.

Categories
Miscellaneous

New Year’s Resolution of 2014

2014-resolution

Năm 2013 khép lại với bao nhiêu sự kiện quan trọng trong cuộc đời. Như mọi lần, trước khi làm resolution cho năm mới, mình luôn đánh giá lại năm trước. 2013 là một năm mình học được rất nhiều thứ từ lập trình đến quản lý một team lập trình cũng như kết giao được với nhiều người.