[CI/CD] Triển khai ứng dụng Java với Jenkins, Ansible và Tomcat

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:

  1. Developer push code lên GitHub.
  2. Jenkins pull code, build bằng Maven và tạo file .war.
  3. Jenkins đẩy file .war qua Ansible Server.
  4. Ansible triển khai file .war lên Tomcat Server.

Triển khai ứng dụng Java với Jenkins, Ansible và Tomcat

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

  1. Truy cập Jenkins: mở trình duyệt và vào địa chỉ Jenkins (VD: http://<jenkins-ip>:8080)
  2. Vào Manage Jenkins > Plugins
  3. Chọn tab Available → tìm từ khóa Maven Integration Plugin
  4. 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
  5. Đợi Jenkins khởi động lại và plugin được cài thành công

Cài đặt plugin Maven vào Jenkins

Bước 2: Cấu hình Maven

  1. Vào lại Jenkins → Manage JenkinsTools
  2. Tìm đến phần Maven
  3. 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

  1. Tại Dashboard Jenkins → nhấn New Item
  2. Đặt tên project, ví dụ: JavaApp-01
  3. Chọn loại dự án: Maven Project → nhấn OK

Tạo một Job Maven trong Jenkins

Bước 4: Cấu hình project

  1. Trong phần cấu hình:
    • Description: Build và deploy ứng dụng Java Hello World
  2. 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
  3. Build Environment: để mặc định
  4. Build:
    • Chọn Goals and options: nhập lệnh clean package
      • clean: xóa cache cũ
      • package: biên dịch và đóng gói mã nguồn thành .jar hoặc .war

Cấu hình project Maven

Cấu hình project Maven

Bước 5: Build thử

  1. Nhấn Save → quay lại project → nhấn Build Now
  2. 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 .jar hoặ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

  1. Truy cập https://tomcat.apache.org/download-10.cgi để lấy link .tar.gz mới nhất
  2. Di chuyển vào thư mục ứng dụng:
cd /opt
  1. Tải Tomcat:
sudo wget https://downloads.apache.org/tomcat/tomcat-10/v10.1.20/bin/apache-tomcat-10.1.20.tar.gz
  1. Giải nén:
sudo tar xvf apache-tomcat-10.1.20.tar.gz
sudo mv apache-tomcat-10.1.20 tomcat10
  1. Đổ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:

  1. Jenkins → Manage JenkinsManage Plugins.
  2. Tìm Publish Over SSH, cài đặt.

Thêm thông tin server Ansible:

  1. Jenkins → Manage JenkinsConfigure System.
  2. Tìm phần Publish over SSH.
  3. Thêm server mới:
    • Name: Ansible Server
    • Host: (IP của Ansible server)
    • Username: root hoặc user có quyền scp
    • Remote Directory: /tmp
    • Password: (hoặc private key)
  4. Test connection → Success.

Thêm thông tin server Ansible

Bước 2: Cấu hình đẩy .war file sang Tomcat

Trong cấu hình Project Jenkins:

  1. Tick vào Send build artifacts over SSH.
  2. Name: Ansible Server.
  3. Source files:
    **/*.war
  4. Remove prefix:
    target
  5. 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

[CI/CD] Hướng dẫn triển khai với Apache, Jenkins

[CI/CD] Triển khai với Jenkins Pipeline, Agent, Docker

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em