Bài viết này hướng dẫn từng bước triển khai một quy trình CI/CD cho ứng dụng Java sử dụng các công cụ phổ biến như:
- GitHub (quản lý mã nguồn)
- Jenkins (tự động hóa build)
- Maven (build Java project)
- Ansible (triển khai tự động)
- Tomcat (máy chủ chạy ứng dụng Java Web)
Mô hình CI/CD tổng quát:
- Developer push code lên GitHub.
- Jenkins pull code, build bằng Maven và tạo file
.war. - Jenkins đẩy file
.warqua Ansible Server. - Ansible triển khai file
.warlên Tomcat Server.

1. Chuẩn bị môi trường
- Jenkins Server
- Ansible Server
- Tomcat Web Server (Ubuntu)
2. Cấu hình Jenkins với Maven
Bước 1: Cài đặt Plugin Maven
- Truy cập Jenkins: mở trình duyệt và vào địa chỉ Jenkins (VD:
http://<jenkins-ip>:8080) - Vào
Manage Jenkins>Plugins - Chọn tab Available → tìm từ khóa
Maven Integration Plugin - Tick chọn Maven Integration Plugin rồi nhấn:
Restart Jenkins when installation is complete and no jobs are runningDownload now and install after restart
- Đợi Jenkins khởi động lại và plugin được cài thành công

Bước 2: Cấu hình Maven
- Vào lại Jenkins → Manage Jenkins → Tools
- Tìm đến phần Maven
- Nhấn Add Maven:
- Name: Maven-3.9 (hoặc tên bạn muốn đặt)
- Tick chọn Install automatically
- Chọn phiên bản mới nhất (ví dụ:
3.9.6)
Bước 3: Tạo Maven Project
- Tại Dashboard Jenkins → nhấn New Item
- Đặt tên project, ví dụ:
JavaApp-01 - Chọn loại dự án: Maven Project → nhấn OK

Bước 4: Cấu hình project
- Trong phần cấu hình:
- Description:
Build và deploy ứng dụng Java Hello World
- Description:
- Source Code Management: chọn
Git- Repository URL: dán link GitHub (ví dụ:
https://github.com/ttnguyenblog/java.git) - Nếu repo public thì không cần cấu hình credentials
- Repository URL: dán link GitHub (ví dụ:
- Build Environment: để mặc định
- Build:
- Chọn Goals and options: nhập lệnh
clean packageclean: xóa cache cũpackage: biên dịch và đóng gói mã nguồn thành.jarhoặc.war
- Chọn Goals and options: nhập lệnh


Bước 5: Build thử
- Nhấn Save → quay lại project → nhấn Build Now
- Kiểm tra kết quả ở:
- Console Output: log quá trình build
- Workspace > target/: nếu thành công, bạn sẽ thấy file
.jarhoặc.warđược tạo
3. Cài đặt Tomcat trên Web Server
Apache HTTP Server không chạy được các ứng dụng Java (.war file), vì thế chúng ta cần Tomcat – một servlet container hỗ trợ chạy ứng dụng Java web.
Bước 1: Cài đặt Java JDK
Tomcat yêu cầu JDK để hoạt động:
sudo apt-get install openjdk-11-jdk
java -version # Kiểm tra lại
Bước 2: Tạo user riêng cho Tomcat
Việc dùng user riêng là best practice cho bảo mật:
sudo adduser tomcat
Bước 3: Tải và cài đặt Tomcat
- Truy cập https://tomcat.apache.org/download-10.cgi để lấy link
.tar.gzmới nhất - Di chuyển vào thư mục ứng dụng:
cd /opt
- Tải Tomcat:
sudo wget https://downloads.apache.org/tomcat/tomcat-10/v10.1.20/bin/apache-tomcat-10.1.20.tar.gz
- Giải nén:
sudo tar xvf apache-tomcat-10.1.20.tar.gz
sudo mv apache-tomcat-10.1.20 tomcat10
- Đổi quyền sở hữu:
sudo chown -R tomcat:tomcat /opt/tomcat10
Bước 4: Tạo dịch vụ systemd cho Tomcat
Tạo file service:
sudo vim /etc/systemd/system/tomcat.service
Thêm nội dung sau (nhớ đổi đường dẫn nếu bạn dùng khác):
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment=CATALINA_PID=/opt/tomcat10/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat10
Environment=CATALINA_BASE=/opt/tomcat10
ExecStart=/opt/tomcat10/bin/startup.sh
ExecStop=/opt/tomcat10/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
Lưu và thoát rồi chạy:
sudo systemctl daemon-reload
sudo systemctl start tomcat
sudo systemctl enable tomcat
sudo systemctl status tomcat
Mở trình duyệt và truy cập:
http://<your-server-ip>:8080
Bước 5: Mở quyền truy cập giao diện quản trị
Tomcat mặc định chặn quản trị từ bên ngoài. Để mở:
1. Sửa file context.xml
sudo vim /opt/tomcat10/webapps/manager/META-INF/context.xml
Xoá hoặc comment dòng sau (chặn IP nội bộ):
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1" />
Làm tương tự với:
/opt/tomcat10/webapps/host-manager/META-INF/context.xml
Bước 6: Tạo tài khoản quản trị
Mở file:
sudo vim /opt/tomcat10/conf/tomcat-users.xml
Thêm trước dòng </tomcat-users>:
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="tomcat" password="tomcat" roles="manager-gui, manager-script, manager-jmx, manager-status"/>
Lưu ý: Không thêm sau thẻ đóng
</tomcat-users>. Phải nằm bên trong!
Bước 7: Khởi động lại Tomcat
sudo systemctl restart tomcat
Truy cập lại:
http://<your-ip>:8080/manager/html
Nhập user: tomcat | password: tomcat
4. Cấu hình Jenkins gửi file về Ansible
Bước 1: Cấu hình Deploy qua SSH sang Ansible
Cài plugin Publish Over SSH:
- Jenkins →
Manage Jenkins→Manage Plugins. - Tìm Publish Over SSH, cài đặt.
Thêm thông tin server Ansible:
- Jenkins →
Manage Jenkins→Configure System. - Tìm phần
Publish over SSH. - Thêm server mới:
- Name:
Ansible Server - Host: (IP của Ansible server)
- Username:
roothoặc user có quyềnscp - Remote Directory:
/tmp - Password: (hoặc private key)
- Name:
- Test connection → Success.

Bước 2: Cấu hình đẩy .war file sang Tomcat
Trong cấu hình Project Jenkins:
- Tick vào
Send build artifacts over SSH. - Name:
Ansible Server. - Source files:
**/*.war
- Remove prefix:
target
- Exec Command:
/usr/bin/ansible-playbook -i /home/azureadmin/myinventory /home/azureadmin/deploy_tomcat.yaml
Bước 4: Thiết lập SSH không mật khẩu (passwordless SSH)
Trên máy Ansible:
ssh-keygen -t rsa # Bấm Enter liên tục ssh-copy-id sysadmin@<IP_Tomcat> # Ví dụ: 10.1.0.5
Cập nhật inventory file trong Ansible
[tomcat]
10.1.0.5
Kiểm tra kết nối từ Ansible:
ansible -i myinventory tomcat -m ping
Nếu thấy thông báo SUCCESS, tức là kết nối đã sẵn sàng.
5. Viết playbook triển khai Tomcat
Jenkins sẽ gửi artifact .war build từ Maven qua Ansible.
Ví dụ playbook deploy_tomcat.yaml:
---
- hosts: tomcat
gather_facts:
become: true
become_method: sudo
tasks:
- name: Delete Exist War file in Tomcat Server
file:
path: /opt/tomcat10/webapps/mywebapp-1.0.war
state: absent
- name: Send War java file to Tomcat Server
copy:
src: /tmp/mywebapp-1.0.war
dest: /opt/tomcat10/webapps/
mode: '0644'
owner: tomcat
group: tomcat
Xem thêm:
[CI/CD] Hướng dẫn triển khai với Apache, Docker, Jenkins, Ansible